Merge changes I5b2ee38d,I5270eaf8 into main
* changes:
Prevent elements from jump-cutting after an interruption
Move Transition test utils to tests source folder
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 3e5f1cb..fa11278 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -379,6 +379,7 @@
aconfig_declarations {
name: "com.android.internal.os.flags-aconfig",
package: "com.android.internal.os",
+ container: "system",
srcs: ["core/java/com/android/internal/os/flags.aconfig"],
}
@@ -853,6 +854,7 @@
aconfig_declarations {
name: "com.android.server.contextualsearch.flags-aconfig",
package: "com.android.server.contextualsearch.flags",
+ container: "system",
srcs: ["services/contextualsearch/flags/flags.aconfig"],
}
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/UserWakeupStore.java b/apex/jobscheduler/service/java/com/android/server/alarm/UserWakeupStore.java
index a0d9133..7fc630c 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/UserWakeupStore.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/UserWakeupStore.java
@@ -136,10 +136,9 @@
* Remove wakeup scheduled for the user with given userId if present.
*/
public void removeUserWakeup(int userId) {
- synchronized (mUserWakeupLock) {
- mUserStarts.delete(userId);
+ if (deleteWakeupFromUserStarts(userId)) {
+ updateUserListFile();
}
- updateUserListFile();
}
/**
@@ -186,7 +185,7 @@
* Return scheduled start time for user or -1 if user does not have alarm set.
*/
@VisibleForTesting
- long getWakeupTimeForUserForTest(int userId) {
+ long getWakeupTimeForUser(int userId) {
synchronized (mUserWakeupLock) {
return mUserStarts.get(userId, -1);
}
@@ -197,8 +196,11 @@
*/
public void onUserStarting(int userId) {
synchronized (mUserWakeupLock) {
- mStartingUsers.put(userId, getWakeupTimeForUserForTest(userId));
- mUserStarts.delete(userId);
+ final long wakeup = getWakeupTimeForUser(userId);
+ if (wakeup >= 0) {
+ mStartingUsers.put(userId, wakeup);
+ mUserStarts.delete(userId);
+ }
}
}
@@ -206,21 +208,48 @@
* Remove userId from starting user list once start is complete.
*/
public void onUserStarted(int userId) {
- synchronized (mUserWakeupLock) {
- mStartingUsers.delete(userId);
+ if (deleteWakeupFromStartingUsers(userId)) {
+ updateUserListFile();
}
- updateUserListFile();
}
/**
* Remove userId from the store when the user is removed.
*/
public void onUserRemoved(int userId) {
- synchronized (mUserWakeupLock) {
- mUserStarts.delete(userId);
- mStartingUsers.delete(userId);
+ if (deleteWakeupFromUserStarts(userId) || deleteWakeupFromStartingUsers(userId)) {
+ updateUserListFile();
}
- updateUserListFile();
+ }
+
+ /**
+ * Remove wakeup for a given userId from mUserStarts.
+ * @return true if an entry is found and the list of wakeups changes.
+ */
+ private boolean deleteWakeupFromUserStarts(int userId) {
+ int index;
+ synchronized (mUserWakeupLock) {
+ index = mUserStarts.indexOfKey(userId);
+ if (index >= 0) {
+ mUserStarts.removeAt(index);
+ }
+ }
+ return index >= 0;
+ }
+
+ /**
+ * Remove wakeup for a given userId from mStartingUsers.
+ * @return true if an entry is found and the list of wakeups changes.
+ */
+ private boolean deleteWakeupFromStartingUsers(int userId) {
+ int index;
+ synchronized (mUserWakeupLock) {
+ index = mStartingUsers.indexOfKey(userId);
+ if (index >= 0) {
+ mStartingUsers.removeAt(index);
+ }
+ }
+ return index >= 0;
}
/**
diff --git a/cmds/uinput/src/com/android/commands/uinput/Device.java b/cmds/uinput/src/com/android/commands/uinput/Device.java
index 7e99c92..2cac6313 100644
--- a/cmds/uinput/src/com/android/commands/uinput/Device.java
+++ b/cmds/uinput/src/com/android/commands/uinput/Device.java
@@ -223,7 +223,7 @@
break;
}
long offsetMicros = args.argl1;
- if (mLastInjectTimestampMicros == -1 || offsetMicros == -1) {
+ if (mLastInjectTimestampMicros == -1) {
// There's often a delay of a few milliseconds between the time specified to
// Handler.sendMessageAtTime and the handler actually being called, due to
// the way threads are scheduled. We don't take this into account when
@@ -239,6 +239,9 @@
// To prevent this, we need to use the time at which we scheduled this first
// batch, rather than the actual current time.
mLastInjectTimestampMicros = args.argl2 / 1000;
+ } else if (offsetMicros == -1) {
+ // No timestamp offset is specified for this event, so use the current time.
+ mLastInjectTimestampMicros = SystemClock.uptimeNanos() / 1000;
} else {
mLastInjectTimestampMicros += offsetMicros;
}
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 443a6c0e..5a3ff83 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -263,6 +263,7 @@
method @RequiresPermission("android.permission.MANAGE_APPOPS") public void setHistoryParameters(int, long, int);
method @RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES) public void setMode(int, int, String, int);
method public static int strOpToOp(@NonNull String);
+ method public int unsafeCheckOpRawNoThrow(@NonNull String, @NonNull android.content.AttributionSource);
field public static final int ATTRIBUTION_CHAIN_ID_NONE = -1; // 0xffffffff
field public static final int ATTRIBUTION_FLAGS_NONE = 0; // 0x0
field public static final int ATTRIBUTION_FLAG_ACCESSOR = 1; // 0x1
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index f4d1304..8e766c9 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -2577,8 +2577,6 @@
OP_RECEIVE_SANDBOX_TRIGGER_AUDIO,
OP_MEDIA_ROUTING_CONTROL,
OP_READ_SYSTEM_GRAMMATICAL_GENDER,
- OP_ARCHIVE_ICON_OVERLAY,
- OP_UNARCHIVAL_CONFIRMATION,
};
static final AppOpInfo[] sAppOpInfos = new AppOpInfo[]{
@@ -8788,6 +8786,18 @@
* Does not throw a security exception, does not translate {@link #MODE_FOREGROUND}.
* @hide
*/
+ @TestApi
+ @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
+ public int unsafeCheckOpRawNoThrow(
+ @NonNull String op, @NonNull AttributionSource attributionSource) {
+ return unsafeCheckOpRawNoThrow(strOpToOp(op), attributionSource);
+ }
+
+ /**
+ * Returns the <em>raw</em> mode associated with the op.
+ * Does not throw a security exception, does not translate {@link #MODE_FOREGROUND}.
+ * @hide
+ */
public int unsafeCheckOpRawNoThrow(int op, int uid, @NonNull String packageName) {
return unsafeCheckOpRawNoThrow(op, uid, packageName, Context.DEVICE_ID_DEFAULT);
}
@@ -8798,8 +8808,8 @@
if (virtualDeviceId == Context.DEVICE_ID_DEFAULT) {
return mService.checkOperationRaw(op, uid, packageName, null);
} else {
- return mService.checkOperationRawForDevice(op, uid, packageName, null,
- Context.DEVICE_ID_DEFAULT);
+ return mService.checkOperationRawForDevice(
+ op, uid, packageName, null, virtualDeviceId);
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index f7e0e9f..b19dc8f 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -93,7 +93,10 @@
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
+import android.text.style.StrikethroughSpan;
+import android.text.style.StyleSpan;
import android.text.style.TextAppearanceSpan;
+import android.text.style.UnderlineSpan;
import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
@@ -765,11 +768,24 @@
MessagingStyle.class, CallStyle.class);
/** @hide */
- @IntDef(flag = true, prefix = { "FLAG_" }, value = {FLAG_SHOW_LIGHTS, FLAG_ONGOING_EVENT,
- FLAG_INSISTENT, FLAG_ONLY_ALERT_ONCE,
- FLAG_AUTO_CANCEL, FLAG_NO_CLEAR, FLAG_FOREGROUND_SERVICE, FLAG_HIGH_PRIORITY,
- FLAG_LOCAL_ONLY, FLAG_GROUP_SUMMARY, FLAG_AUTOGROUP_SUMMARY, FLAG_BUBBLE,
- FLAG_USER_INITIATED_JOB})
+ @IntDef(flag = true, prefix = {"FLAG_"}, value = {
+ FLAG_SHOW_LIGHTS,
+ FLAG_ONGOING_EVENT,
+ FLAG_INSISTENT,
+ FLAG_ONLY_ALERT_ONCE,
+ FLAG_AUTO_CANCEL,
+ FLAG_NO_CLEAR,
+ FLAG_FOREGROUND_SERVICE,
+ FLAG_HIGH_PRIORITY,
+ FLAG_LOCAL_ONLY,
+ FLAG_GROUP_SUMMARY,
+ FLAG_AUTOGROUP_SUMMARY,
+ FLAG_CAN_COLORIZE,
+ FLAG_BUBBLE,
+ FLAG_NO_DISMISS,
+ FLAG_FSI_REQUESTED_BUT_DENIED,
+ FLAG_USER_INITIATED_JOB
+ })
@Retention(RetentionPolicy.SOURCE)
public @interface NotificationFlags{};
@@ -3154,9 +3170,6 @@
+ " instance is a custom Parcelable and not allowed in Notification");
return cs.toString();
}
- if (Flags.cleanUpSpansAndNewLines()) {
- return stripStyling(cs);
- }
return removeTextSizeSpans(cs);
}
@@ -3779,10 +3792,10 @@
if (this.tickerText != null) {
sb.append(" tick");
}
- sb.append(" defaults=0x");
- sb.append(Integer.toHexString(this.defaults));
- sb.append(" flags=0x");
- sb.append(Integer.toHexString(this.flags));
+ sb.append(" defaults=");
+ sb.append(defaultsToString(this.defaults));
+ sb.append(" flags=");
+ sb.append(flagsToString(this.flags));
sb.append(String.format(" color=0x%08x", this.color));
if (this.category != null) {
sb.append(" category=");
@@ -3851,6 +3864,124 @@
}
/**
+ * {@hide}
+ */
+ public static String flagsToString(@NotificationFlags int flags) {
+ final List<String> flagStrings = new ArrayList<String>();
+ if ((flags & FLAG_SHOW_LIGHTS) != 0) {
+ flagStrings.add("SHOW_LIGHTS");
+ flags &= ~FLAG_SHOW_LIGHTS;
+ }
+ if ((flags & FLAG_ONGOING_EVENT) != 0) {
+ flagStrings.add("ONGOING_EVENT");
+ flags &= ~FLAG_ONGOING_EVENT;
+ }
+ if ((flags & FLAG_INSISTENT) != 0) {
+ flagStrings.add("INSISTENT");
+ flags &= ~FLAG_INSISTENT;
+ }
+ if ((flags & FLAG_ONLY_ALERT_ONCE) != 0) {
+ flagStrings.add("ONLY_ALERT_ONCE");
+ flags &= ~FLAG_ONLY_ALERT_ONCE;
+ }
+ if ((flags & FLAG_AUTO_CANCEL) != 0) {
+ flagStrings.add("AUTO_CANCEL");
+ flags &= ~FLAG_AUTO_CANCEL;
+ }
+ if ((flags & FLAG_NO_CLEAR) != 0) {
+ flagStrings.add("NO_CLEAR");
+ flags &= ~FLAG_NO_CLEAR;
+ }
+ if ((flags & FLAG_FOREGROUND_SERVICE) != 0) {
+ flagStrings.add("FOREGROUND_SERVICE");
+ flags &= ~FLAG_FOREGROUND_SERVICE;
+ }
+ if ((flags & FLAG_HIGH_PRIORITY) != 0) {
+ flagStrings.add("HIGH_PRIORITY");
+ flags &= ~FLAG_HIGH_PRIORITY;
+ }
+ if ((flags & FLAG_LOCAL_ONLY) != 0) {
+ flagStrings.add("LOCAL_ONLY");
+ flags &= ~FLAG_LOCAL_ONLY;
+ }
+ if ((flags & FLAG_GROUP_SUMMARY) != 0) {
+ flagStrings.add("GROUP_SUMMARY");
+ flags &= ~FLAG_GROUP_SUMMARY;
+ }
+ if ((flags & FLAG_AUTOGROUP_SUMMARY) != 0) {
+ flagStrings.add("AUTOGROUP_SUMMARY");
+ flags &= ~FLAG_AUTOGROUP_SUMMARY;
+ }
+ if ((flags & FLAG_CAN_COLORIZE) != 0) {
+ flagStrings.add("CAN_COLORIZE");
+ flags &= ~FLAG_CAN_COLORIZE;
+ }
+ if ((flags & FLAG_BUBBLE) != 0) {
+ flagStrings.add("BUBBLE");
+ flags &= ~FLAG_BUBBLE;
+ }
+ if ((flags & FLAG_NO_DISMISS) != 0) {
+ flagStrings.add("NO_DISMISS");
+ flags &= ~FLAG_NO_DISMISS;
+ }
+ if ((flags & FLAG_FSI_REQUESTED_BUT_DENIED) != 0) {
+ flagStrings.add("FSI_REQUESTED_BUT_DENIED");
+ flags &= ~FLAG_FSI_REQUESTED_BUT_DENIED;
+ }
+ if ((flags & FLAG_USER_INITIATED_JOB) != 0) {
+ flagStrings.add("USER_INITIATED_JOB");
+ flags &= ~FLAG_USER_INITIATED_JOB;
+ }
+ if (Flags.lifetimeExtensionRefactor()) {
+ if ((flags & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY) != 0) {
+ flagStrings.add("LIFETIME_EXTENDED_BY_DIRECT_REPLY");
+ flags &= ~FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ }
+ }
+
+ if (flagStrings.isEmpty()) {
+ return "0";
+ }
+
+ if (flags != 0) {
+ flagStrings.add(String.format("UNKNOWN(0x%08x)", flags));
+ }
+
+ return String.join("|", flagStrings);
+ }
+
+ /** @hide */
+ public static String defaultsToString(int defaults) {
+ final List<String> defaultStrings = new ArrayList<String>();
+ if ((defaults & DEFAULT_ALL) == DEFAULT_ALL) {
+ defaultStrings.add("ALL");
+ defaults &= ~DEFAULT_ALL;
+ }
+ if ((defaults & DEFAULT_SOUND) != 0) {
+ defaultStrings.add("SOUND");
+ defaults &= ~DEFAULT_SOUND;
+ }
+ if ((defaults & DEFAULT_VIBRATE) != 0) {
+ defaultStrings.add("VIBRATE");
+ defaults &= ~DEFAULT_VIBRATE;
+ }
+ if ((defaults & DEFAULT_LIGHTS) != 0) {
+ defaultStrings.add("LIGHTS");
+ defaults &= ~DEFAULT_LIGHTS;
+ }
+
+ if (defaultStrings.isEmpty()) {
+ return "0";
+ }
+
+ if (defaults != 0) {
+ defaultStrings.add(String.format("UNKNOWN(0x%08x)", defaults));
+ }
+
+ return String.join("|", defaultStrings);
+ }
+
+ /**
* @hide
*/
public boolean hasCompletedProgress() {
@@ -5578,6 +5709,7 @@
TemplateBindResult result) {
p.headerless(resId == getBaseLayoutResource()
|| resId == getHeadsUpBaseLayoutResource()
+ || resId == getCompactHeadsUpBaseLayoutResource()
|| resId == getMessagingLayoutResource()
|| resId == R.layout.notification_template_material_media);
RemoteViews contentView = new BuilderRemoteViews(mContext.getApplicationInfo(), resId);
@@ -6463,6 +6595,36 @@
}
/**
+ * Construct a RemoteViews for the final compact heads-up notification layout.
+ * @hide
+ */
+ public RemoteViews createCompactHeadsUpContentView() {
+ // TODO(b/336225281): re-evaluate custom view usage.
+ if (useExistingRemoteView(mN.headsUpContentView)) {
+ return fullyCustomViewRequiresDecoration(false /* fromStyle */)
+ ? minimallyDecoratedHeadsUpContentView(mN.headsUpContentView)
+ : mN.headsUpContentView;
+ } else if (mStyle != null) {
+ final RemoteViews styleView = mStyle.makeCompactHeadsUpContentView();
+ if (styleView != null) {
+ return styleView;
+ }
+ }
+
+ final StandardTemplateParams p = mParams.reset()
+ .viewType(StandardTemplateParams.VIEW_TYPE_HEADS_UP)
+ .fillTextsFrom(this);
+ // Notification text is shown as secondary header text
+ // for the minimal hun when it is provided.
+ // Time(when and chronometer) is not shown for the minimal hun.
+ p.headerTextSecondary(p.mText).text(null).hideTime(true);
+
+ return applyStandardTemplate(
+ getCompactHeadsUpBaseLayoutResource(), p,
+ null /* result */);
+ }
+
+ /**
* Construct a RemoteViews representing the heads up notification layout.
*
* @deprecated For performance and system health reasons, this API is no longer required to
@@ -7138,6 +7300,10 @@
return R.layout.notification_template_material_heads_up_base;
}
+ private int getCompactHeadsUpBaseLayoutResource() {
+ return R.layout.notification_template_material_compact_heads_up_base;
+ }
+
private int getBigBaseLayoutResource() {
return R.layout.notification_template_material_big_base;
}
@@ -7664,6 +7830,16 @@
}
/**
+ * Construct a Style-specific RemoteViews for the final compact HUN layout.
+ * return null to use the standard compact heads up view.
+ * @hide
+ */
+ @Nullable
+ public RemoteViews makeCompactHeadsUpContentView() {
+ return null;
+ }
+
+ /**
* Apply any style-specific extras to this notification before shipping it out.
* @hide
*/
@@ -8154,9 +8330,6 @@
*/
public BigTextStyle bigText(CharSequence cs) {
mBigText = safeCharSequence(cs);
- if (Flags.cleanUpSpansAndNewLines()) {
- mBigText = cleanUpNewLines(mBigText);
- }
return this;
}
@@ -8227,6 +8400,9 @@
// Replace the text with the big text, but only if the big text is not empty.
CharSequence bigTextText = mBuilder.processLegacyText(mBigText);
+ if (Flags.cleanUpSpansAndNewLines()) {
+ bigTextText = cleanUpNewLines(stripStyling(bigTextText));
+ }
if (!TextUtils.isEmpty(bigTextText)) {
p.text(bigTextText);
}
@@ -8975,6 +9151,16 @@
/**
* @hide
*/
+ @Nullable
+ @Override
+ public RemoteViews makeCompactHeadsUpContentView() {
+ // TODO(b/336229954): Apply minimal HUN treatment to Messaging Notifications.
+ return makeHeadsUpContentView(false);
+ }
+
+ /**
+ * @hide
+ */
@Override
public void reduceImageSizes(Context context) {
super.reduceImageSizes(context);
@@ -9142,11 +9328,43 @@
*/
public void ensureColorContrastOrStripStyling(int backgroundColor) {
if (Flags.cleanUpSpansAndNewLines()) {
- mText = stripStyling(mText);
+ mText = stripNonStyleSpans(mText);
} else {
ensureColorContrast(backgroundColor);
}
}
+
+ private CharSequence stripNonStyleSpans(CharSequence text) {
+
+ if (text instanceof Spanned) {
+ Spanned ss = (Spanned) text;
+ Object[] spans = ss.getSpans(0, ss.length(), Object.class);
+ SpannableStringBuilder builder = new SpannableStringBuilder(ss.toString());
+ for (Object span : spans) {
+ final Object resultSpan;
+ if (span instanceof StyleSpan
+ || span instanceof StrikethroughSpan
+ || span instanceof UnderlineSpan) {
+ resultSpan = span;
+ } else if (span instanceof TextAppearanceSpan) {
+ final TextAppearanceSpan originalSpan = (TextAppearanceSpan) span;
+ resultSpan = new TextAppearanceSpan(
+ null,
+ originalSpan.getTextStyle(),
+ -1,
+ null,
+ null);
+ } else {
+ continue;
+ }
+ builder.setSpan(resultSpan, ss.getSpanStart(span), ss.getSpanEnd(span),
+ ss.getSpanFlags(span));
+ }
+ return builder;
+ }
+ return text;
+ }
+
/**
* Updates TextAppearance spans in the message text so it has sufficient contrast
* against its background.
@@ -10112,6 +10330,16 @@
/**
* @hide
*/
+ @Nullable
+ @Override
+ public RemoteViews makeCompactHeadsUpContentView() {
+ // TODO(b/336228700): Apply minimal HUN treatment for Call Style.
+ return makeHeadsUpContentView(false);
+ }
+
+ /**
+ * @hide
+ */
public RemoteViews makeBigContentView() {
return makeCallLayout(StandardTemplateParams.VIEW_TYPE_BIG);
}
diff --git a/core/java/android/app/contextualsearch/ContextualSearchManager.java b/core/java/android/app/contextualsearch/ContextualSearchManager.java
index c080a6b..cfbe741 100644
--- a/core/java/android/app/contextualsearch/ContextualSearchManager.java
+++ b/core/java/android/app/contextualsearch/ContextualSearchManager.java
@@ -27,6 +27,7 @@
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemClock;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -51,6 +52,7 @@
*/
public static final String EXTRA_ENTRYPOINT =
"android.app.contextualsearch.extra.ENTRYPOINT";
+
/**
* Key to get the flag_secure value from the extras of the activity launched by contextual
* search. The value will be true if flag_secure is found in any of the visible activities.
@@ -58,12 +60,14 @@
*/
public static final String EXTRA_FLAG_SECURE_FOUND =
"android.app.contextualsearch.extra.FLAG_SECURE_FOUND";
+
/**
* Key to get the screenshot from the extras of the activity launched by contextual search.
* Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH.
*/
public static final String EXTRA_SCREENSHOT =
"android.app.contextualsearch.extra.SCREENSHOT";
+
/**
* Key to check whether managed profile is visible from the extras of the activity launched by
* contextual search. The value will be true if any one of the visible apps is managed.
@@ -71,6 +75,7 @@
*/
public static final String EXTRA_IS_MANAGED_PROFILE_VISIBLE =
"android.app.contextualsearch.extra.IS_MANAGED_PROFILE_VISIBLE";
+
/**
* Key to get the list of visible packages from the extras of the activity launched by
* contextual search.
@@ -80,6 +85,18 @@
"android.app.contextualsearch.extra.VISIBLE_PACKAGE_NAMES";
/**
+ * Key to get the time the user made the invocation request, based on
+ * {@link SystemClock#uptimeMillis()}.
+ * Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH.
+ *
+ * TODO: un-hide in W
+ *
+ * @hide
+ */
+ public static final String EXTRA_INVOCATION_TIME_MS =
+ "android.app.contextualsearch.extra.INVOCATION_TIME_MS";
+
+ /**
* Key to get the binder token from the extras of the activity launched by contextual search.
* This token is needed to invoke {@link CallbackToken#getContextualSearchState} method.
* Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH.
diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig
index e694ccc..e3c367f8 100644
--- a/core/java/android/app/notification.aconfig
+++ b/core/java/android/app/notification.aconfig
@@ -138,4 +138,11 @@
namespace: "systemui"
description: "Cleans up spans and unnecessary new lines from standard notification templates"
bug: "313439845"
-}
\ No newline at end of file
+}
+
+flag {
+ name: "compact_heads_up_notification"
+ namespace: "systemui"
+ description: "[Minimal HUN] Enables the compact heads up notification feature"
+ bug: "270709257"
+}
diff --git a/core/java/android/companion/virtual/camera/VirtualCameraConfig.java b/core/java/android/companion/virtual/camera/VirtualCameraConfig.java
index 06a0f5c..769b658 100644
--- a/core/java/android/companion/virtual/camera/VirtualCameraConfig.java
+++ b/core/java/android/companion/virtual/camera/VirtualCameraConfig.java
@@ -237,19 +237,15 @@
@IntRange(from = 1) int height,
@ImageFormat.Format int format,
@IntRange(from = 1) int maximumFramesPerSecond) {
- // TODO(b/310857519): Check dimension upper limits based on the maximum texture size
- // supported by the current device, instead of hardcoded limits.
- if (width <= 0 || width > VirtualCameraStreamConfig.DIMENSION_UPPER_LIMIT) {
+ if (width <= 0) {
throw new IllegalArgumentException(
"Invalid width passed for stream config: " + width
- + ", must be between 1 and "
- + VirtualCameraStreamConfig.DIMENSION_UPPER_LIMIT);
+ + ", must be greater than 0");
}
- if (height <= 0 || height > VirtualCameraStreamConfig.DIMENSION_UPPER_LIMIT) {
+ if (height <= 0) {
throw new IllegalArgumentException(
"Invalid height passed for stream config: " + height
- + ", must be between 1 and "
- + VirtualCameraStreamConfig.DIMENSION_UPPER_LIMIT);
+ + ", must be greater than 0");
}
if (!isFormatSupported(format)) {
throw new IllegalArgumentException(
diff --git a/core/java/android/companion/virtual/camera/VirtualCameraStreamConfig.java b/core/java/android/companion/virtual/camera/VirtualCameraStreamConfig.java
index 00a814e..6ab66b3 100644
--- a/core/java/android/companion/virtual/camera/VirtualCameraStreamConfig.java
+++ b/core/java/android/companion/virtual/camera/VirtualCameraStreamConfig.java
@@ -39,11 +39,6 @@
public final class VirtualCameraStreamConfig implements Parcelable {
// TODO(b/310857519): Check if we should increase the fps upper limit in future.
static final int MAX_FPS_UPPER_LIMIT = 60;
- // This is the minimum guaranteed upper bound of texture size supported by all devices.
- // Keep this in sync with kMaxTextureSize from services/camera/virtualcamera/util/Util.cc
- // TODO(b/310857519): Remove this once we add support for fetching the maximum texture size
- // supported by the current device.
- static final int DIMENSION_UPPER_LIMIT = 2048;
private final int mWidth;
private final int mHeight;
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 535cebb..7ac9547 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -1548,6 +1548,26 @@
public static final long INSETS_DECOUPLED_CONFIGURATION_ENFORCED = 151861875L;
/**
+ * When enabled, the activity will receive configuration decoupled from system bar insets.
+ *
+ * <p>This will only apply if the activity is targeting SDK level 34 or earlier versions.
+ *
+ * <p>This will only in effect if the device is trying to provide a different value by default
+ * other than the legacy value, i.e., the
+ * {@code Flags.allowsScreenSizeDecoupledFromStatusBarAndCutout()} is set to true.
+ *
+ * <p>If the {@code Flags.insetsDecoupledConfiguration()} is also set to true, all apps
+ * targeting SDK level 35 or later, and apps with this override flag will receive the insets
+ * decoupled configuration.
+ *
+ * @hide
+ */
+ @ChangeId
+ @Disabled
+ @Overridable
+ public static final long OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION = 327313645L;
+
+ /**
* Optional set of a certificates identifying apps that are allowed to embed this activity. From
* the "knownActivityEmbeddingCerts" attribute.
*/
diff --git a/core/java/android/content/pm/multiuser.aconfig b/core/java/android/content/pm/multiuser.aconfig
index 6d3a56d..cd1913b 100644
--- a/core/java/android/content/pm/multiuser.aconfig
+++ b/core/java/android/content/pm/multiuser.aconfig
@@ -61,6 +61,13 @@
}
flag {
+ name: "new_multiuser_settings_ux"
+ namespace: "multiuser"
+ description: "Update multiuser settings UI"
+ bug: "298008926"
+}
+
+flag {
name: "enable_biometrics_to_unlock_private_space"
is_exported: true
namespace: "profile_experiences"
@@ -113,6 +120,26 @@
is_fixed_read_only: true
}
+flag {
+ name: "fix_avatar_picker_read_back_order"
+ namespace: "multiuser"
+ description: "Talkback focus doesn't move to the 'If you change your Google Account picture…' after swiping next to move the focus from 'Choose a picture'"
+ bug: "330835921"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
+ name: "fix_avatar_picker_selected_read_back"
+ namespace: "multiuser"
+ description: "Talkback doesn't announce 'selected' after double tapping the button in the picture list in 'Choose a picture' page."
+ bug: "330840549"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
# This flag guards the private space feature and all its implementations excluding the APIs. APIs are guarded by android.os.Flags.allow_private_profile.
flag {
name: "enable_private_space_features"
diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java
index 7aa0349..3c4307c 100644
--- a/core/java/android/database/DatabaseUtils.java
+++ b/core/java/android/database/DatabaseUtils.java
@@ -1671,7 +1671,7 @@
return null;
}
final int eos = Math.min(n+3, end);
- return sql.substring(n, eos);
+ return sql.substring(n, eos).toUpperCase(Locale.ROOT);
}
/**
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 735b20f..c82e7e8 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -1494,7 +1494,7 @@
* {@link CaptureRequest#SENSOR_FRAME_DURATION android.sensor.frameDuration}.</p>
* <p>Note that the actual achievable max framerate also depends on the minimum frame
* duration of the output streams. The max frame rate will be
- * <code>min(aeTargetFpsRange.maxFps, 1 / max(individual stream min durations)</code>. For example,
+ * <code>min(aeTargetFpsRange.maxFps, 1 / max(individual stream min durations))</code>. For example,
* if the application sets this key to <code>{60, 60}</code>, but the maximum minFrameDuration among
* all configured streams is 33ms, the maximum framerate won't be 60fps, but will be
* 30fps.</p>
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 76287ca..5765a73 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -893,7 +893,7 @@
* {@link CaptureRequest#SENSOR_FRAME_DURATION android.sensor.frameDuration}.</p>
* <p>Note that the actual achievable max framerate also depends on the minimum frame
* duration of the output streams. The max frame rate will be
- * <code>min(aeTargetFpsRange.maxFps, 1 / max(individual stream min durations)</code>. For example,
+ * <code>min(aeTargetFpsRange.maxFps, 1 / max(individual stream min durations))</code>. For example,
* if the application sets this key to <code>{60, 60}</code>, but the maximum minFrameDuration among
* all configured streams is 33ms, the maximum framerate won't be 60fps, but will be
* 30fps.</p>
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 37f2fb2..25bfb2a 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -962,24 +962,6 @@
}
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- /**
- * @hide
- */
- @RequiresPermission(USE_BIOMETRIC_INTERNAL)
- public void setSidefpsController(@NonNull ISidefpsController controller) {
- if (mService == null) {
- Slog.w(TAG, "setSidefpsController: no fingerprint service");
- return;
- }
-
- try {
- mService.setSidefpsController(controller);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
/**
* Forwards BiometricStateListener to FingerprintService
* @param listener new BiometricStateListener being added
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 6a96ac4..742fa57 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -27,7 +27,6 @@
import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IUdfpsOverlayController;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintAuthenticateOptions;
import android.hardware.fingerprint.FingerprintEnrollOptions;
@@ -200,10 +199,6 @@
@EnforcePermission("USE_BIOMETRIC_INTERNAL")
void setUdfpsOverlayController(in IUdfpsOverlayController controller);
- // Sets the controller for managing the SideFPS overlay.
- @EnforcePermission("USE_BIOMETRIC_INTERNAL")
- void setSidefpsController(in ISidefpsController controller);
-
// Registers AuthenticationStateListener.
@EnforcePermission("USE_BIOMETRIC_INTERNAL")
void registerAuthenticationStateListener(AuthenticationStateListener listener);
diff --git a/core/java/android/hardware/fingerprint/ISidefpsController.aidl b/core/java/android/hardware/fingerprint/ISidefpsController.aidl
deleted file mode 100644
index 684f18f..0000000
--- a/core/java/android/hardware/fingerprint/ISidefpsController.aidl
+++ /dev/null
@@ -1,29 +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.hardware.fingerprint;
-
-/**
- * Interface for interacting with the side fingerprint sensor (side-fps) overlay.
- * @hide
- */
-oneway interface ISidefpsController {
-
- // Shows the overlay for the given sensor with a reason from BiometricOverlayConstants.
- void show(int sensorId, int reason);
-
- // Hides the overlay.
- void hide(int sensorId);
-}
diff --git a/core/java/android/os/connectivity/WifiActivityEnergyInfo.java b/core/java/android/os/connectivity/WifiActivityEnergyInfo.java
index ad74a9f..2ceb1c7 100644
--- a/core/java/android/os/connectivity/WifiActivityEnergyInfo.java
+++ b/core/java/android/os/connectivity/WifiActivityEnergyInfo.java
@@ -37,8 +37,10 @@
* real-time.
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
@SystemApi
public final class WifiActivityEnergyInfo implements Parcelable {
+ private static final long DEFERRED_ENERGY_ESTIMATE = -1;
@ElapsedRealtimeLong
private final long mTimeSinceBootMillis;
@StackState
@@ -52,7 +54,7 @@
@IntRange(from = 0)
private final long mControllerIdleDurationMillis;
@IntRange(from = 0)
- private final long mControllerEnergyUsedMicroJoules;
+ private long mControllerEnergyUsedMicroJoules;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@@ -99,9 +101,10 @@
rxDurationMillis,
scanDurationMillis,
idleDurationMillis,
- calculateEnergyMicroJoules(txDurationMillis, rxDurationMillis, idleDurationMillis));
+ DEFERRED_ENERGY_ESTIMATE);
}
+ @android.ravenwood.annotation.RavenwoodReplace
private static long calculateEnergyMicroJoules(
long txDurationMillis, long rxDurationMillis, long idleDurationMillis) {
final Context context = ActivityThread.currentActivityThread().getSystemContext();
@@ -125,6 +128,11 @@
* voltage);
}
+ private static long calculateEnergyMicroJoules$ravenwood(long txDurationMillis,
+ long rxDurationMillis, long idleDurationMillis) {
+ return 0;
+ }
+
/** @hide */
public WifiActivityEnergyInfo(
@ElapsedRealtimeLong long timeSinceBootMillis,
@@ -152,7 +160,7 @@
+ " mControllerRxDurationMillis=" + mControllerRxDurationMillis
+ " mControllerScanDurationMillis=" + mControllerScanDurationMillis
+ " mControllerIdleDurationMillis=" + mControllerIdleDurationMillis
- + " mControllerEnergyUsedMicroJoules=" + mControllerEnergyUsedMicroJoules
+ + " mControllerEnergyUsedMicroJoules=" + getControllerEnergyUsedMicroJoules()
+ " }";
}
@@ -231,6 +239,11 @@
/** Get the energy consumed by Wifi, in microjoules. */
@IntRange(from = 0)
public long getControllerEnergyUsedMicroJoules() {
+ if (mControllerEnergyUsedMicroJoules == DEFERRED_ENERGY_ESTIMATE) {
+ mControllerEnergyUsedMicroJoules = calculateEnergyMicroJoules(
+ mControllerTxDurationMillis, mControllerRxDurationMillis,
+ mControllerIdleDurationMillis);
+ }
return mControllerEnergyUsedMicroJoules;
}
diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl
index 3b59901..55011e5 100644
--- a/core/java/android/permission/IPermissionManager.aidl
+++ b/core/java/android/permission/IPermissionManager.aidl
@@ -98,7 +98,7 @@
IBinder registerAttributionSource(in AttributionSourceState source);
- int getNumRegisteredAttributionSources(int uid);
+ int getRegisteredAttributionSourceCount(int uid);
boolean isRegisteredAttributionSource(in AttributionSourceState source);
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index 2daf4ac..55bb430 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -1680,9 +1680,9 @@
* @hide
*/
@RequiresPermission(Manifest.permission.UPDATE_APP_OPS_STATS)
- public int getNumRegisteredAttributionSourcesForTest(int uid) {
+ public int getRegisteredAttributionSourceCountForTest(int uid) {
try {
- return mPermissionManager.getNumRegisteredAttributionSources(uid);
+ return mPermissionManager.getRegisteredAttributionSourceCount(uid);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 16649e8..095ab70 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -12629,6 +12629,15 @@
* @hide
*/
public static final String V_TO_U_RESTORE_DENYLIST = "v_to_u_restore_denylist";
+
+ /**
+ * Integer property that determines which charging optimization mode is applied.
+ * [0-10] inclusive representing different modes, where 0 is the default indicating
+ * no optimization mode is applied.
+ *
+ * @hide
+ */
+ public static final String CHARGE_OPTIMIZATION_MODE = "charge_optimization_mode";
}
/**
diff --git a/core/java/android/service/dreams/DreamOverlayService.java b/core/java/android/service/dreams/DreamOverlayService.java
index 9a02b74b..5da0cb4 100644
--- a/core/java/android/service/dreams/DreamOverlayService.java
+++ b/core/java/android/service/dreams/DreamOverlayService.java
@@ -79,6 +79,11 @@
mService.endDream(this);
}
+ @Override
+ public void comeToFront() {
+ mService.comeToFront(this);
+ }
+
private void onExitRequested() {
try {
mDreamOverlayCallback.onExitRequested();
@@ -130,6 +135,16 @@
});
}
+ private void comeToFront(OverlayClient client) {
+ mExecutor.execute(() -> {
+ if (mCurrentClient != client) {
+ return;
+ }
+
+ onComeToFront();
+ });
+ }
+
private IDreamOverlay mDreamOverlay = new IDreamOverlay.Stub() {
@Override
public void getClient(IDreamOverlayClientCallback callback) {
@@ -190,6 +205,13 @@
public void onWakeUp() {}
/**
+ * This method is overridden by implementations to handle when the dream is coming to the front
+ * (after having lost focus to something on top of it).
+ * @hide
+ */
+ public void onComeToFront() {}
+
+ /**
* This method is overridden by implementations to handle when the dream has ended. There may
* be earlier signals leading up to this step, such as @{@link #onWakeUp(Runnable)}.
*
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 353828c..c26d83c 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -18,6 +18,7 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.service.dreams.Flags.dreamHandlesConfirmKeys;
+import static android.service.dreams.Flags.dreamTracksFocus;
import android.annotation.FlaggedApi;
import android.annotation.IdRes;
@@ -52,6 +53,7 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.service.controls.flags.Flags;
+import android.service.dreams.utils.DreamAccessibility;
import android.util.AttributeSet;
import android.util.Log;
import android.util.MathUtils;
@@ -273,6 +275,7 @@
private boolean mDebug = false;
private ComponentName mDreamComponent;
+ private DreamAccessibility mDreamAccessibility;
private boolean mShouldShowComplications;
private DreamServiceWrapper mDreamServiceWrapper;
@@ -455,6 +458,15 @@
/** {@inheritDoc} */
@Override
public void onWindowFocusChanged(boolean hasFocus) {
+ if (!dreamTracksFocus()) {
+ return;
+ }
+
+ try {
+ mDreamManager.onDreamFocusChanged(hasFocus);
+ } catch (RemoteException ex) {
+ // system server died
+ }
}
/** {@inheritDoc} */
@@ -664,6 +676,7 @@
*/
public void setInteractive(boolean interactive) {
mInteractive = interactive;
+ updateAccessibilityMessage();
}
/**
@@ -1149,6 +1162,19 @@
wakeUp(false);
}
+ /**
+ * Tells the dream to come to the front (which in turn tells the overlay to come to the front).
+ */
+ private void comeToFront() {
+ mOverlayConnection.addConsumer(overlay -> {
+ try {
+ overlay.comeToFront();
+ } catch (RemoteException e) {
+ Log.e(mTag, "could not tell overlay to come to front:" + e);
+ }
+ });
+ }
+
private void wakeUp(boolean fromSystem) {
if (mDebug) {
Slog.v(mTag, "wakeUp(): fromSystem=" + fromSystem + ", mWaking=" + mWaking
@@ -1430,7 +1456,7 @@
// Hide all insets when the dream is showing
mWindow.getDecorView().getWindowInsetsController().hide(WindowInsets.Type.systemBars());
mWindow.setDecorFitsSystemWindows(false);
-
+ updateAccessibilityMessage();
mWindow.getDecorView().addOnAttachStateChangeListener(
new View.OnAttachStateChangeListener() {
private Consumer<IDreamOverlayClient> mDreamStartOverlayConsumer;
@@ -1477,6 +1503,15 @@
});
}
+ private void updateAccessibilityMessage() {
+ if (mWindow == null) return;
+ if (mDreamAccessibility == null) {
+ final View rootView = mWindow.getDecorView();
+ mDreamAccessibility = new DreamAccessibility(this, rootView);
+ }
+ mDreamAccessibility.updateAccessibilityConfiguration(isInteractive());
+ }
+
private boolean getWindowFlagValue(int flag, boolean defaultValue) {
return mWindow == null ? defaultValue : (mWindow.getAttributes().flags & flag) != 0;
}
@@ -1596,6 +1631,15 @@
public void wakeUp() {
mHandler.post(() -> DreamService.this.wakeUp(true /*fromSystem*/));
}
+
+ @Override
+ public void comeToFront() {
+ if (!dreamTracksFocus()) {
+ return;
+ }
+
+ mHandler.post(DreamService.this::comeToFront);
+ }
}
/** @hide */
diff --git a/core/java/android/service/dreams/IDreamManager.aidl b/core/java/android/service/dreams/IDreamManager.aidl
index e45384f..85f0368 100644
--- a/core/java/android/service/dreams/IDreamManager.aidl
+++ b/core/java/android/service/dreams/IDreamManager.aidl
@@ -48,4 +48,5 @@
void setSystemDreamComponent(in ComponentName componentName);
void registerDreamOverlayService(in ComponentName componentName);
void startDreamActivity(in Intent intent);
+ void onDreamFocusChanged(in boolean hasFocus);
}
diff --git a/core/java/android/service/dreams/IDreamOverlayClient.aidl b/core/java/android/service/dreams/IDreamOverlayClient.aidl
index 78b7280..5054d4d 100644
--- a/core/java/android/service/dreams/IDreamOverlayClient.aidl
+++ b/core/java/android/service/dreams/IDreamOverlayClient.aidl
@@ -42,4 +42,7 @@
/** Called when the dream has ended. */
void endDream();
+
+ /** Called when the dream is coming to the front. */
+ void comeToFront();
}
diff --git a/core/java/android/service/dreams/IDreamService.aidl b/core/java/android/service/dreams/IDreamService.aidl
index 8b5d875..2e2651b 100644
--- a/core/java/android/service/dreams/IDreamService.aidl
+++ b/core/java/android/service/dreams/IDreamService.aidl
@@ -25,4 +25,5 @@
void attach(IBinder windowToken, boolean canDoze, boolean isPreviewMode, IRemoteCallback started);
void detach();
void wakeUp();
+ void comeToFront();
}
diff --git a/core/java/android/service/dreams/flags.aconfig b/core/java/android/service/dreams/flags.aconfig
index 88f1090..0a458bc 100644
--- a/core/java/android/service/dreams/flags.aconfig
+++ b/core/java/android/service/dreams/flags.aconfig
@@ -19,3 +19,10 @@
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "dream_tracks_focus"
+ namespace: "communal"
+ description: "This flag enables the ability for dreams to track whether or not they have focus"
+ bug: "331798001"
+}
diff --git a/core/java/android/service/dreams/utils/DreamAccessibility.java b/core/java/android/service/dreams/utils/DreamAccessibility.java
new file mode 100644
index 0000000..c38f41b
--- /dev/null
+++ b/core/java/android/service/dreams/utils/DreamAccessibility.java
@@ -0,0 +1,88 @@
+/*
+ * 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.service.dreams.utils;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import com.android.internal.R;
+
+/**
+ * {@link DreamAccessibility} allows customization of accessibility
+ * actions for the root view of the dream overlay.
+ * @hide
+ */
+public class DreamAccessibility {
+ private final Context mContext;
+ private final View mView;
+ private final View.AccessibilityDelegate mAccessibilityDelegate;
+
+ public DreamAccessibility(@NonNull Context context, @NonNull View view) {
+ mContext = context;
+ mView = view;
+ mAccessibilityDelegate = createNewAccessibilityDelegate(mContext);
+ }
+
+ /**
+ * @param interactive
+ * Removes and add accessibility configuration depending if the dream is interactive or not
+ */
+ public void updateAccessibilityConfiguration(Boolean interactive) {
+ if (!interactive) {
+ addAccessibilityConfiguration();
+ } else {
+ removeCustomAccessibilityAction();
+ }
+ }
+
+ /**
+ * Configures the accessibility actions for the given root view.
+ */
+ private void addAccessibilityConfiguration() {
+ mView.setAccessibilityDelegate(mAccessibilityDelegate);
+ }
+
+ /**
+ * Removes Configured the accessibility actions for the given root view.
+ */
+ private void removeCustomAccessibilityAction() {
+ if (mView.getAccessibilityDelegate() == mAccessibilityDelegate) {
+ mView.setAccessibilityDelegate(null);
+ }
+ }
+
+ private View.AccessibilityDelegate createNewAccessibilityDelegate(Context context) {
+ return new View.AccessibilityDelegate() {
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ for (AccessibilityNodeInfo.AccessibilityAction action : info.getActionList()) {
+ if (action.getId() == AccessibilityNodeInfo.ACTION_CLICK) {
+ info.removeAction(action);
+ break;
+ }
+ }
+ info.addAction(new AccessibilityNodeInfo.AccessibilityAction(
+ AccessibilityNodeInfo.ACTION_CLICK,
+ context.getResources().getString(R.string.dream_accessibility_action_click)
+ ));
+ }
+ };
+ }
+}
diff --git a/core/java/android/service/notification/ZenPolicy.java b/core/java/android/service/notification/ZenPolicy.java
index 786d768..1d7091c 100644
--- a/core/java/android/service/notification/ZenPolicy.java
+++ b/core/java/android/service/notification/ZenPolicy.java
@@ -349,23 +349,29 @@
/**
* Indicates no explicit setting for which channels may bypass DND when this policy is active.
* Defaults to {@link #CHANNEL_POLICY_PRIORITY}.
+ *
+ * @hide
*/
@FlaggedApi(Flags.FLAG_MODES_API)
- private static final int CHANNEL_POLICY_UNSET = 0;
+ public static final int CHANNEL_POLICY_UNSET = 0;
/**
* Indicates that channels marked as {@link NotificationChannel#canBypassDnd()} can bypass DND
* when this policy is active.
+ *
+ * @hide
*/
@FlaggedApi(Flags.FLAG_MODES_API)
- private static final int CHANNEL_POLICY_PRIORITY = 1;
+ public static final int CHANNEL_POLICY_PRIORITY = 1;
/**
* Indicates that no channels can bypass DND when this policy is active, even those marked as
* {@link NotificationChannel#canBypassDnd()}.
+ *
+ * @hide
*/
@FlaggedApi(Flags.FLAG_MODES_API)
- private static final int CHANNEL_POLICY_NONE = 2;
+ public static final int CHANNEL_POLICY_NONE = 2;
/** @hide */
public ZenPolicy() {
@@ -564,6 +570,13 @@
}
/**
+ * @hide
+ */
+ public @ChannelType int getAllowedChannels() {
+ return mAllowChannels;
+ }
+
+ /**
* Whether this policy allows {@link NotificationChannel channels} marked as
* {@link NotificationChannel#canBypassDnd()} to bypass DND. If {@link #STATE_ALLOW}, these
* channels may bypass; if {@link #STATE_DISALLOW}, then even notifications from channels
@@ -999,6 +1012,12 @@
mZenPolicy.mAllowChannels = allow ? CHANNEL_POLICY_PRIORITY : CHANNEL_POLICY_NONE;
return this;
}
+
+ /** @hide */
+ public @NonNull Builder allowChannels(@ChannelType int channelType) {
+ mZenPolicy.mAllowChannels = channelType;
+ return this;
+ }
}
@Override
diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java
index fb57921..4281da1 100644
--- a/core/java/android/telephony/PhoneStateListener.java
+++ b/core/java/android/telephony/PhoneStateListener.java
@@ -1685,6 +1685,10 @@
public final void onSimultaneousCallingStateChanged(int[] subIds) {
// not supported on the deprecated interface - Use TelephonyCallback instead
}
+
+ public final void onCarrierRoamingNtnModeChanged(boolean active) {
+ // not supported on the deprecated interface - Use TelephonyCallback instead
+ }
}
private void log(String s) {
diff --git a/core/java/android/telephony/TelephonyCallback.java b/core/java/android/telephony/TelephonyCallback.java
index dc6a035..b8b84d9 100644
--- a/core/java/android/telephony/TelephonyCallback.java
+++ b/core/java/android/telephony/TelephonyCallback.java
@@ -644,6 +644,15 @@
public static final int EVENT_SIMULTANEOUS_CELLULAR_CALLING_SUBSCRIPTIONS_CHANGED = 41;
/**
+ * Event for listening to changes in carrier roaming non-terrestrial network mode.
+ *
+ * @see CarrierRoamingNtnModeListener
+ *
+ * @hide
+ */
+ public static final int EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED = 42;
+
+ /**
* @hide
*/
@IntDef(prefix = {"EVENT_"}, value = {
@@ -687,7 +696,8 @@
EVENT_TRIGGER_NOTIFY_ANBR,
EVENT_MEDIA_QUALITY_STATUS_CHANGED,
EVENT_EMERGENCY_CALLBACK_MODE_CHANGED,
- EVENT_SIMULTANEOUS_CELLULAR_CALLING_SUBSCRIPTIONS_CHANGED
+ EVENT_SIMULTANEOUS_CELLULAR_CALLING_SUBSCRIPTIONS_CHANGED,
+ EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED
})
@Retention(RetentionPolicy.SOURCE)
public @interface TelephonyEvent {
@@ -1686,6 +1696,24 @@
}
/**
+ * Interface for carrier roaming non-terrestrial network listener.
+ *
+ * @hide
+ */
+ public interface CarrierRoamingNtnModeListener {
+ /**
+ * Callback invoked when carrier roaming non-terrestrial network mode changes.
+ *
+ * @param active {@code true} If the device is connected to carrier roaming
+ * non-terrestrial network or was connected within the
+ * {CarrierConfigManager
+ * #KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT} duration,
+ * {code false} otherwise.
+ */
+ void onCarrierRoamingNtnModeChanged(boolean active);
+ }
+
+ /**
* The callback methods need to be called on the handler thread where
* this object was created. If the binder did that for us it'd be nice.
* <p>
@@ -2086,5 +2114,16 @@
Binder.withCleanCallingIdentity(
() -> mExecutor.execute(() -> listener.onCallBackModeStopped(type, reason)));
}
+
+ public void onCarrierRoamingNtnModeChanged(boolean active) {
+ if (!Flags.carrierEnabledSatelliteFlag()) return;
+
+ CarrierRoamingNtnModeListener listener =
+ (CarrierRoamingNtnModeListener) mTelephonyCallbackWeakRef.get();
+ if (listener == null) return;
+
+ Binder.withCleanCallingIdentity(
+ () -> mExecutor.execute(() -> listener.onCarrierRoamingNtnModeChanged(active)));
+ }
}
}
diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java
index d39c4ce..6160fdb 100644
--- a/core/java/android/telephony/TelephonyRegistryManager.java
+++ b/core/java/android/telephony/TelephonyRegistryManager.java
@@ -1073,6 +1073,24 @@
}
/**
+ * Notify external listeners that carrier roaming non-terrestrial network mode changed.
+ * @param subId subscription ID.
+ * @param active {@code true} If the device is connected to carrier roaming
+ * non-terrestrial network or was connected within the
+ * {CarrierConfigManager#KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT}
+ * duration, {code false} otherwise.
+ * @hide
+ */
+ public void notifyCarrierRoamingNtnModeChanged(int subId, boolean active) {
+ try {
+ sRegistry.notifyCarrierRoamingNtnModeChanged(subId, active);
+ } catch (RemoteException ex) {
+ // system server crash
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Processes potential event changes from the provided {@link TelephonyCallback}.
*
* @param telephonyCallback callback for monitoring callback changes to the telephony state.
@@ -1224,6 +1242,10 @@
eventList.add(
TelephonyCallback.EVENT_SIMULTANEOUS_CELLULAR_CALLING_SUBSCRIPTIONS_CHANGED);
}
+
+ if (telephonyCallback instanceof TelephonyCallback.CarrierRoamingNtnModeListener) {
+ eventList.add(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED);
+ }
return eventList;
}
diff --git a/core/java/android/text/ClientFlags.java b/core/java/android/text/ClientFlags.java
index 32f05be..5d84d17 100644
--- a/core/java/android/text/ClientFlags.java
+++ b/core/java/android/text/ClientFlags.java
@@ -61,4 +61,11 @@
public static boolean icuBidiMigration() {
return TextFlags.isFeatureEnabled(Flags.FLAG_ICU_BIDI_MIGRATION);
}
+
+ /**
+ * @see Flags#fixMisalignedContextMenu()
+ */
+ public static boolean fixMisalignedContextMenu() {
+ return TextFlags.isFeatureEnabled(Flags.FLAG_FIX_MISALIGNED_CONTEXT_MENU);
+ }
}
diff --git a/core/java/android/text/MeasuredParagraph.java b/core/java/android/text/MeasuredParagraph.java
index 38aeb37..161a79b 100644
--- a/core/java/android/text/MeasuredParagraph.java
+++ b/core/java/android/text/MeasuredParagraph.java
@@ -30,6 +30,8 @@
import android.graphics.Rect;
import android.graphics.text.LineBreakConfig;
import android.graphics.text.MeasuredText;
+import android.icu.lang.UCharacter;
+import android.icu.lang.UCharacterDirection;
import android.icu.text.Bidi;
import android.text.AutoGrowArray.ByteArray;
import android.text.AutoGrowArray.FloatArray;
@@ -711,7 +713,12 @@
// check the paragraph count here and replace the CR letters and re-calculate
// BiDi again.
for (int i = 0; i < mTextLength; ++i) {
- if (mCopiedBuffer[i] == '\r') {
+ if (Character.isSurrogate(mCopiedBuffer[i])) {
+ // All block separators are in BMP.
+ continue;
+ }
+ if (UCharacter.getDirection(mCopiedBuffer[i])
+ == UCharacterDirection.BLOCK_SEPARATOR) {
mCopiedBuffer[i] = OBJECT_REPLACEMENT_CHARACTER;
}
}
diff --git a/core/java/android/text/TextFlags.java b/core/java/android/text/TextFlags.java
index 770e5c9..9e02460 100644
--- a/core/java/android/text/TextFlags.java
+++ b/core/java/android/text/TextFlags.java
@@ -60,6 +60,7 @@
Flags.FLAG_USE_BOUNDS_FOR_WIDTH,
Flags.FLAG_FIX_LINE_HEIGHT_FOR_LOCALE,
Flags.FLAG_ICU_BIDI_MIGRATION,
+ Flags.FLAG_FIX_MISALIGNED_CONTEXT_MENU,
};
/**
@@ -73,6 +74,7 @@
Flags.useBoundsForWidth(),
Flags.fixLineHeightForLocale(),
Flags.icuBidiMigration(),
+ Flags.fixMisalignedContextMenu(),
};
/**
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index bde9c77..3015791 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -477,7 +477,12 @@
}
drawBounds.setEmpty();
float w = measure(mLen, false, fmi, drawBounds, lineInfo);
- float boundsWidth = drawBounds.width();
+ float boundsWidth;
+ if (w >= 0) {
+ boundsWidth = Math.max(drawBounds.right, w) - Math.min(0, drawBounds.left);
+ } else {
+ boundsWidth = Math.max(drawBounds.right, 0) - Math.min(w, drawBounds.left);
+ }
if (Math.abs(w) > boundsWidth) {
return w;
} else {
diff --git a/core/java/android/text/flags/flags.aconfig b/core/java/android/text/flags/flags.aconfig
index a8a0c5b..56df328 100644
--- a/core/java/android/text/flags/flags.aconfig
+++ b/core/java/android/text/flags/flags.aconfig
@@ -171,3 +171,13 @@
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "fix_misaligned_context_menu"
+ namespace: "text"
+ description: "Fix the context menu misalignment and incosistent icon size."
+ bug: "332542108"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 51d7caa..65d9b3a 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -291,6 +291,15 @@
int getDefaultDisplayRotation();
/**
+ * Retrieve the display user rotation.
+ * @param displayId Id of the display
+ * @return Rotation one of {@link android.view.Surface#ROTATION_0},
+ * {@link android.view.Surface#ROTATION_90}, {@link android.view.Surface#ROTATION_180},
+ * {@link android.view.Surface#ROTATION_270} or -1 if display is not found.
+ */
+ int getDisplayUserRotation(int displayId);
+
+ /**
* Watch the rotation of the specified screen. Returns the current rotation,
* calls back when it changes.
*/
diff --git a/core/java/android/view/ImeBackAnimationController.java b/core/java/android/view/ImeBackAnimationController.java
index ed049b5..e14ddd6 100644
--- a/core/java/android/view/ImeBackAnimationController.java
+++ b/core/java/android/view/ImeBackAnimationController.java
@@ -70,13 +70,13 @@
@Override
public void onBackStarted(@NonNull BackEvent backEvent) {
- if (isAdjustResize()) {
+ if (!isBackAnimationAllowed()) {
// There is no good solution for a predictive back animation if the app uses
// adjustResize, since we can't relayout the whole app for every frame. We also don't
// want to reveal any black areas behind the IME. Therefore let's not play any animation
// in that case for now.
Log.d(TAG, "onBackStarted -> not playing predictive back animation due to softinput"
- + " mode adjustResize");
+ + " mode adjustResize AND no animation callback registered");
return;
}
if (isHideAnimationInProgress()) {
@@ -128,13 +128,13 @@
@Override
public void onBackCancelled() {
- if (isAdjustResize()) return;
+ if (!isBackAnimationAllowed()) return;
startPostCommitAnim(/*hideIme*/ false);
}
@Override
public void onBackInvoked() {
- if (isAdjustResize()) {
+ if (!isBackAnimationAllowed()) {
mInsetsController.hide(ime());
return;
}
@@ -252,9 +252,12 @@
}
}
- private boolean isAdjustResize() {
+ private boolean isBackAnimationAllowed() {
+ // back animation is allowed in all cases except when softInputMode is adjust_resize AND
+ // there is no app-registered WindowInsetsAnimationCallback.
return (mViewRoot.mWindowAttributes.softInputMode & SOFT_INPUT_MASK_ADJUST)
- == SOFT_INPUT_ADJUST_RESIZE;
+ != SOFT_INPUT_ADJUST_RESIZE
+ || (mViewRoot.mView != null && mViewRoot.mView.hasWindowInsetsAnimationCallback());
}
private boolean isAdjustPan() {
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index a355f55..2a1eb97 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -3809,6 +3809,7 @@
* 1 PFLAG4_IS_COUNTED_AS_SENSITIVE
* 1 PFLAG4_HAS_DRAWN
* 1 PFLAG4_HAS_MOVED
+ * 1 PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION
* |-------|-------|-------|-------|
*/
@@ -3954,6 +3955,11 @@
*/
private static final int PFLAG4_HAS_MOVED = 0x10000000;
+ /**
+ * Whether the invalidateViewProperty is involked at current frame.
+ */
+ private static final int PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION = 0x20000000;
+
/* End of masks for mPrivateFlags4 */
/** @hide */
@@ -20945,6 +20951,7 @@
} else {
damageInParent();
}
+ mPrivateFlags4 |= PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION;
}
/**
@@ -23641,14 +23648,6 @@
return renderNode;
}
- // For VRR to vote the preferred frame rate
- if (sToolkitSetFrameRateReadOnlyFlagValue
- && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
- votePreferredFrameRate();
- }
-
- mPrivateFlags4 = (mPrivateFlags4 & ~PFLAG4_HAS_MOVED) | PFLAG4_HAS_DRAWN;
-
if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0
|| !renderNode.hasDisplayList()
|| (mRecreateDisplayList)) {
@@ -23691,6 +23690,14 @@
mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID;
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
+ // // For VRR to vote the preferred frame rate
+ if (sToolkitSetFrameRateReadOnlyFlagValue
+ && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
+ votePreferredFrameRate();
+ }
+
+ mPrivateFlags4 |= PFLAG4_HAS_DRAWN;
+
// Fast path for layouts with no backgrounds
if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) {
dispatchDraw(canvas);
@@ -23710,10 +23717,19 @@
setDisplayListProperties(renderNode);
}
} else {
+ if ((mPrivateFlags4 & PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION)
+ == PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION) {
+ // For VRR to vote the preferred frame rate
+ if (sToolkitSetFrameRateReadOnlyFlagValue
+ && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
+ votePreferredFrameRate();
+ }
+ mPrivateFlags4 &= ~PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION;
+ }
mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID;
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
}
-
+ mPrivateFlags4 &= ~PFLAG4_HAS_MOVED;
mFrameContentVelocity = -1;
return renderNode;
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 3f078c8..84cde0d 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -12714,7 +12714,7 @@
if (frameRateCategory > mPreferredFrameRateCategory) {
mPreferredFrameRateCategory = frameRateCategory;
mFrameRateCategoryChangeReason = reason;
-// mFrameRateCategoryView = view == null ? "-" : view.getClass().getSimpleName();
+ // mFrameRateCategoryView = view == null ? "-" : view.getClass().getSimpleName();
}
mHasInvalidation = true;
mDrawnThisFrame = true;
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index 6c852c3..86e5bea 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -76,6 +76,21 @@
"android.view.ViewStructure.extra.FIRST_ACTIVE_POSITION";
/**
+ * Key used for writing the type of the view that generated the virtual structure of its
+ * children.
+ *
+ * For example, if the virtual structure is generated by a webview, the value would be
+ * "WebView". If the virtual structure is generated by a compose view, then the value would be
+ * "ComposeView". The value is of type String.
+ *
+ * This value is added to mainly help with debugging purpose.
+ *
+ * @hide
+ */
+ public static final String EXTRA_VIRTUAL_STRUCTURE_TYPE =
+ "android.view.ViewStructure.extra.VIRTUAL_STRUCTURE_TYPE";
+
+ /**
* Set the identifier for this view.
*
* @param id The view's identifier, as per {@link View#getId View.getId()}.
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index fbb5116..fb1c331 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -11254,8 +11254,10 @@
width = des;
} else {
if (mUseBoundsForWidth) {
- width = Math.max(boring.width,
- (int) Math.ceil(boring.getDrawingBoundingBox().width()));
+ RectF bbox = boring.getDrawingBoundingBox();
+ float rightMax = Math.max(bbox.right, boring.width);
+ float leftMin = Math.min(bbox.left, 0);
+ width = Math.max(boring.width, (int) Math.ceil(rightMax - leftMin));
} else {
width = boring.width;
}
diff --git a/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java b/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java
index 83e9407..e2005d7 100644
--- a/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java
+++ b/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java
@@ -259,7 +259,9 @@
final int extensionFlags = src.readInt();
if ((extensionFlags & BatteryStatsHistory.EXTENSION_POWER_STATS_DESCRIPTOR_FLAG) != 0) {
PowerStats.Descriptor descriptor = PowerStats.Descriptor.readSummaryFromParcel(src);
- mDescriptorRegistry.register(descriptor);
+ if (descriptor != null) {
+ mDescriptorRegistry.register(descriptor);
+ }
}
if ((extensionFlags & BatteryStatsHistory.EXTENSION_POWER_STATS_FLAG) != 0) {
cur.powerStats = PowerStats.readFromParcel(src, mDescriptorRegistry);
diff --git a/core/java/com/android/internal/os/flags.aconfig b/core/java/com/android/internal/os/flags.aconfig
index 4c2bbd4..c8d6810 100644
--- a/core/java/com/android/internal/os/flags.aconfig
+++ b/core/java/com/android/internal/os/flags.aconfig
@@ -1,4 +1,5 @@
package: "com.android.internal.os"
+container: "system"
flag {
name: "enable_apache_http_legacy_preload"
@@ -7,4 +8,4 @@
# Fixed read-only is required as the flag is read during zygote init.
is_fixed_read_only: true
bug: "241474956"
-}
\ No newline at end of file
+}
diff --git a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
index 969f95d..792c223 100644
--- a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
+++ b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
@@ -81,4 +81,5 @@
void onCallBackModeStarted(int type);
void onCallBackModeStopped(int type, int reason);
void onSimultaneousCallingStateChanged(in int[] subIds);
+ void onCarrierRoamingNtnModeChanged(in boolean active);
}
diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index 0203ea4..04332cd 100644
--- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -120,4 +120,5 @@
void notifyCallbackModeStarted(int phoneId, int subId, int type);
void notifyCallbackModeStopped(int phoneId, int subId, int type, int reason);
+ void notifyCarrierRoamingNtnModeChanged(int subId, in boolean active);
}
diff --git a/core/java/com/android/internal/view/menu/ListMenuItemView.java b/core/java/com/android/internal/view/menu/ListMenuItemView.java
index cb1abf1..468705d 100644
--- a/core/java/com/android/internal/view/menu/ListMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/ListMenuItemView.java
@@ -21,6 +21,7 @@
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.text.ClientFlags;
import android.text.TextFlags;
import android.util.AttributeSet;
import android.view.LayoutInflater;
@@ -290,7 +291,8 @@
private void insertIconView() {
LayoutInflater inflater = getInflater();
mIconView = (ImageView) inflater.inflate(
- mUseNewContextMenu ? com.android.internal.R.layout.list_menu_item_fixed_size_icon :
+ mUseNewContextMenu && !ClientFlags.fixMisalignedContextMenu()
+ ? com.android.internal.R.layout.list_menu_item_fixed_size_icon :
com.android.internal.R.layout.list_menu_item_icon,
this, false);
addContentView(mIconView, 0);
diff --git a/core/java/com/android/internal/view/menu/StandardMenuPopup.java b/core/java/com/android/internal/view/menu/StandardMenuPopup.java
index 1979e4f..c254e99 100644
--- a/core/java/com/android/internal/view/menu/StandardMenuPopup.java
+++ b/core/java/com/android/internal/view/menu/StandardMenuPopup.java
@@ -16,24 +16,27 @@
package com.android.internal.view.menu;
+import android.app.AppGlobals;
import android.content.Context;
import android.content.res.Resources;
import android.os.Parcelable;
+import android.text.ClientFlags;
+import android.text.TextFlags;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.View.OnKeyListener;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.MenuPopupWindow;
import android.widget.PopupWindow;
-import android.widget.TextView;
-import android.widget.AdapterView.OnItemClickListener;
import android.widget.PopupWindow.OnDismissListener;
+import android.widget.TextView;
import java.util.Objects;
@@ -44,6 +47,8 @@
final class StandardMenuPopup extends MenuPopup implements OnDismissListener, OnItemClickListener,
MenuPresenter, OnKeyListener {
private static final int ITEM_LAYOUT = com.android.internal.R.layout.popup_menu_item_layout;
+ private static final int ITEM_LAYOUT_MATERIAL =
+ com.android.internal.R.layout.popup_menu_item_layout_material;
private final Context mContext;
@@ -53,6 +58,7 @@
private final int mPopupMaxWidth;
private final int mPopupStyleAttr;
private final int mPopupStyleRes;
+
// The popup window is final in order to couple its lifecycle to the lifecycle of the
// StandardMenuPopup.
private final MenuPopupWindow mPopup;
@@ -114,10 +120,16 @@
public StandardMenuPopup(Context context, MenuBuilder menu, View anchorView, int popupStyleAttr,
int popupStyleRes, boolean overflowOnly) {
mContext = Objects.requireNonNull(context);
+ boolean useNewContextMenu = AppGlobals.getIntCoreSetting(
+ TextFlags.KEY_ENABLE_NEW_CONTEXT_MENU,
+ TextFlags.ENABLE_NEW_CONTEXT_MENU_DEFAULT ? 1 : 0) != 0;
+
mMenu = menu;
mOverflowOnly = overflowOnly;
final LayoutInflater inflater = LayoutInflater.from(context);
- mAdapter = new MenuAdapter(menu, inflater, mOverflowOnly, ITEM_LAYOUT);
+ mAdapter = new MenuAdapter(menu, inflater, mOverflowOnly,
+ ClientFlags.fixMisalignedContextMenu() && useNewContextMenu
+ ? ITEM_LAYOUT_MATERIAL : ITEM_LAYOUT);
mPopupStyleAttr = popupStyleAttr;
mPopupStyleRes = popupStyleRes;
diff --git a/core/java/com/android/internal/widget/BigPictureNotificationImageView.java b/core/java/com/android/internal/widget/BigPictureNotificationImageView.java
index f95f5db..7e7aba2 100644
--- a/core/java/com/android/internal/widget/BigPictureNotificationImageView.java
+++ b/core/java/com/android/internal/widget/BigPictureNotificationImageView.java
@@ -26,6 +26,7 @@
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.util.AttributeSet;
+import android.util.Log;
import android.widget.ImageView;
import android.widget.RemoteViews;
@@ -126,11 +127,19 @@
private Drawable loadImage(Icon icon) {
if (icon == null) return null;
+
Drawable drawable = LocalImageResolver.resolveImage(icon, mContext, mMaximumDrawableWidth,
mMaximumDrawableHeight);
- if (drawable == null) {
- return icon.loadDrawable(mContext);
+ if (drawable != null) {
+ return drawable;
}
- return drawable;
+
+ drawable = icon.loadDrawable(mContext);
+ if (drawable != null) {
+ return drawable;
+ }
+
+ Log.e(TAG, "Couldn't load drawable for icon: " + icon);
+ return null;
}
}
diff --git a/core/java/com/android/internal/widget/LocalImageResolver.java b/core/java/com/android/internal/widget/LocalImageResolver.java
index 9ef7ce38..c5d74fc 100644
--- a/core/java/com/android/internal/widget/LocalImageResolver.java
+++ b/core/java/com/android/internal/widget/LocalImageResolver.java
@@ -132,7 +132,11 @@
// Fallback to straight drawable load if we fail with more efficient approach.
try {
- return icon.loadDrawable(context);
+ final Drawable iconDrawable = icon.loadDrawable(context);
+ if (iconDrawable == null) {
+ Log.w(TAG, "Couldn't load drawable for icon: " + icon);
+ }
+ return iconDrawable;
} catch (Resources.NotFoundException e) {
return null;
}
@@ -233,8 +237,7 @@
});
// ImageDecoder documentation is misleading a bit - it'll throw NotFoundException
- // in some cases despite it not saying so. Rethrow it as an IOException to keep
- // our API contract.
+ // in some cases despite it not saying so.
} catch (IOException | Resources.NotFoundException e) {
Log.d(TAG, "Couldn't use ImageDecoder for drawable, falling back to non-resized load.");
return null;
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index f5bbbb4..9abb5c8 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -731,7 +731,9 @@
}
optional Zen zen = 71;
+ optional SettingProto charge_optimization_mode = 101 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
// Please insert fields in alphabetical order and group them into messages
// if possible (to avoid reaching the method limit).
- // Next tag = 101;
+ // Next tag = 102;
}
diff --git a/core/res/res/drawable/ic_android_satellite_24px.xml b/core/res/res/drawable/ic_android_satellite_24px.xml
new file mode 100644
index 0000000..15f2884
--- /dev/null
+++ b/core/res/res/drawable/ic_android_satellite_24px.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M487,600L392,505L346,551L376,580Q399,603 399,637Q399,671 376,694L333,737Q310,760 276.5,760Q243,760 220,737L103,620Q80,597 80,563.5Q80,530 103,507L146,464Q169,441 203,441Q237,441 260,464L289,494L335,448L160,273L273,160L448,335L493,290L464,260Q441,237 441,203Q441,169 464,146L507,103Q530,80 563.5,80Q597,80 620,103L737,220Q760,243 760,276.5Q760,310 737,333L694,376Q671,399 637,399Q603,399 580,376L550,347L505,392L600,487L487,600ZM520,880L520,800Q637,800 718.5,718.5Q800,637 800,520L880,520Q880,595 851.5,660.5Q823,726 774.5,774.5Q726,823 660.5,851.5Q595,880 520,880ZM520,720L520,640Q570,640 605,605Q640,570 640,520L720,520Q720,603 661.5,661.5Q603,720 520,720ZM520,203L550,233L593,190L563,160Q563,160 563,160Q563,160 563,160L520,203Q520,203 520,203Q520,203 520,203ZM160,563L190,593L233,550L203,520Q203,520 203,520Q203,520 203,520L160,563Q160,563 160,563Q160,563 160,563ZM637,320L680,277Q680,277 680,277Q680,277 680,277L650,247L607,290L637,320Q637,320 637,320Q637,320 637,320ZM277,680L320,637Q320,637 320,637Q320,637 320,637L290,607L247,650L277,680Q277,680 277,680Q277,680 277,680Z"/>
+</vector>
diff --git a/core/res/res/layout/cascading_menu_item_layout_material.xml b/core/res/res/layout/cascading_menu_item_layout_material.xml
index 168ed78..36b29c3 100644
--- a/core/res/res/layout/cascading_menu_item_layout_material.xml
+++ b/core/res/res/layout/cascading_menu_item_layout_material.xml
@@ -35,7 +35,6 @@
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="48dip"
- android:layout_marginStart="12dip"
android:layout_marginEnd="12dip"
android:duplicateParentState="true" >
@@ -46,7 +45,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:layout_marginStart="6dip"
+ android:layout_marginStart="18dip"
android:textAppearance="?attr/textAppearanceLargePopupMenu"
android:singleLine="true"
android:duplicateParentState="true"
diff --git a/core/res/res/layout/notification_template_material_compact_heads_up_base.xml b/core/res/res/layout/notification_template_material_compact_heads_up_base.xml
new file mode 100644
index 0000000..57da898
--- /dev/null
+++ b/core/res/res/layout/notification_template_material_compact_heads_up_base.xml
@@ -0,0 +1,87 @@
+<?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
+ -->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/status_bar_latest_event_content"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/notification_header_height"
+ android:clipChildren="false"
+ android:tag="compactHUN"
+ android:gravity="center_vertical"
+ android:theme="@style/Theme.DeviceDefault.Notification"
+ android:importantForAccessibility="no">
+ <com.android.internal.widget.CachingIconView
+ android:id="@+id/icon"
+ android:layout_width="@dimen/notification_icon_circle_size"
+ android:layout_height="@dimen/notification_icon_circle_size"
+ android:layout_gravity="center_vertical|start"
+ android:layout_marginStart="@dimen/notification_icon_circle_start"
+ android:background="@drawable/notification_icon_circle"
+ android:padding="@dimen/notification_icon_circle_padding"
+ android:maxDrawableWidth="@dimen/notification_icon_circle_size"
+ android:maxDrawableHeight="@dimen/notification_icon_circle_size"
+ />
+ <FrameLayout
+ android:id="@+id/alternate_expand_target"
+ android:layout_width="@dimen/notification_content_margin_start"
+ android:layout_height="match_parent"
+ android:layout_gravity="start"
+ android:importantForAccessibility="no"
+ android:focusable="false"
+ />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
+ android:orientation="horizontal"
+ >
+ <NotificationTopLineView
+ android:id="@+id/notification_top_line"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_centerVertical="true"
+ android:layout_weight="1"
+ android:clipChildren="false"
+ android:gravity="center_vertical"
+ android:theme="@style/Theme.DeviceDefault.Notification"
+ >
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/notification_header_separating_margin"
+ android:ellipsize="end"
+ android:fadingEdge="horizontal"
+ android:singleLine="true"
+ android:textAlignment="viewStart"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title"
+ />
+ <include layout="@layout/notification_top_line_views" />
+ </NotificationTopLineView>
+ <FrameLayout
+ android:id="@+id/expand_button_touch_container"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="@dimen/notification_content_margin_end"
+ >
+ <include layout="@layout/notification_expand_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|end"
+ />
+ </FrameLayout>
+ </LinearLayout>
+</FrameLayout>
diff --git a/core/res/res/layout/popup_menu_item_layout_material.xml b/core/res/res/layout/popup_menu_item_layout_material.xml
new file mode 100644
index 0000000..c5ca7a5
--- /dev/null
+++ b/core/res/res/layout/popup_menu_item_layout_material.xml
@@ -0,0 +1,92 @@
+<?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.
+
+ Forked from the popup_menu_item_layout.xml for material support. When you edit this file, you
+ may also need to update that file.
+-->
+
+<com.android.internal.view.menu.ListMenuItemView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minWidth="196dip"
+ android:orientation="vertical" >
+
+ <ImageView
+ android:id="@+id/group_divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:layout_marginTop="4dip"
+ android:layout_marginBottom="4dip"
+ android:background="@drawable/list_divider_material" />
+
+ <LinearLayout
+ android:id="@+id/content"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/dropdownListPreferredItemHeight"
+ android:paddingEnd="16dip"
+ android:duplicateParentState="true" >
+
+ <!-- Icon will be inserted here. -->
+
+ <!-- The title and summary have some gap between them,
+ and this 'group' should be centered vertically. -->
+ <RelativeLayout
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginStart="16dip"
+ android:duplicateParentState="true">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentStart="true"
+ android:textAppearance="?attr/textAppearanceLargePopupMenu"
+ android:singleLine="true"
+ android:duplicateParentState="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ android:textAlignment="viewStart" />
+
+ <TextView
+ android:id="@+id/shortcut"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/title"
+ android:layout_alignParentStart="true"
+ android:textAppearance="?attr/textAppearanceSmallPopupMenu"
+ android:singleLine="true"
+ android:duplicateParentState="true"
+ android:textAlignment="viewStart" />
+
+ </RelativeLayout>
+
+ <ImageView
+ android:id="@+id/submenuarrow"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_marginStart="8dp"
+ android:scaleType="center"
+ android:visibility="gone" />
+
+ <!-- Checkbox, and/or radio button will be inserted here. -->
+
+ </LinearLayout>
+
+</com.android.internal.view.menu.ListMenuItemView>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 058d19b..8218ff1 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Neem skermkiekie"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan \'n skermkiekie neem."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Voorskou, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"deaktiveer of verander statusbalk"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Laat die app toe om die statusbalk te deaktiveer en stelselikone by te voeg of te verwyder."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"wees die statusbalk"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index c5e6a33..b1f9447 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ቅጽበታዊ ገፅ እይታን ያነሳል"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"የማሳያው ቅጽበታዊ ገፅ እይታን ማንሳት ይችላል።"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"ቅድመ ዕይታ፣ <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"የሁኔቴ አሞሌ አቦዝን ወይም ቀይር"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"የስርዓት አዶዎችን ወደ ሁኔታ አሞሌ ላለማስቻል ወይም ለማከል እና ለማስወገድ ለመተግበሪያው ይፈቅዳሉ፡፡"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"የሁኔታ አሞሌ መሆን"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index d1c019f..453998f 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -360,6 +360,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"أخذ لقطة شاشة"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"يمكن أخذ لقطة شاشة."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"نسخة حصرية، \"<xliff:g id="DREAM_NAME">%1$s</xliff:g>\""</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"إيقاف شريط الحالة أو تعديله"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"للسماح للتطبيق بإيقاف شريط الحالة أو إضافة رموز نظام وإزالتها."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"العمل كشريط للحالة"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index e1a9a0a..89a6f97 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"স্ক্ৰীনশ্বট লওক"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ডিছপ্লে’খনৰ এটা স্ক্ৰীনশ্বট ল\'ব পাৰে।"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"পূৰ্বদৰ্শন কৰক, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"স্থিতি দণ্ড অক্ষম কৰক বা সলনি কৰক"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"স্থিতি দণ্ড অক্ষম কৰিবলৈ বা ছিষ্টেম আইকন আঁতৰাবলৈ এপ্টোক অনুমতি দিয়ে।"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"স্থিতি দণ্ড হ\'ব পাৰে"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 7d9c831..3bc5b92 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ekran şəkli çəkin"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Ekran şəkli çəkilə bilər."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Önizləmə, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"status panelini deaktivləşdir və ya dəyişdir"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Tətbiqə status panelini deaktiv etməyə və ya sistem ikonalarını əlavə etmək və ya silmək imkanı verir."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"status paneli edin"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 5649c58..5a79197 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Napravi snimak ekrana"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Može da napravi snimak ekrana."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Pregled, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"onemogućavanje ili izmena statusne trake"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Dozvoljava aplikaciji da onemogući statusnu traku ili da dodaje i uklanja sistemske ikone."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"funkcionisanje kao statusna traka"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 2115a2d..9f07bd4 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -358,6 +358,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Зрабіць здымак экрана"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Можна зрабіць здымак экрана."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Перадпрагляд, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"адключаць ці змяняць радок стану"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Дазваляе прыкладанням адключаць радок стану або дадаваць і выдаляць сістэмныя значкі."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"быць панэллю стану"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 891584e..eefbdf6 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Създаване на екранна снимка"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Може да създава екранни снимки."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Визуализация на „<xliff:g id="DREAM_NAME">%1$s</xliff:g>“"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"деактивиране или промяна на лентата на състоянието"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Разрешава на приложението да деактивира лентата на състоянието или да добавя и премахва системни икони."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"изпълняване на ролята на лента на състоянието"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index e82f26c..d2ccc0d 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"স্ক্রিনশট নিন"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ডিসপ্লের একটি স্ক্রিনশট নিতে পারেন।"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"প্রিভিউ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"স্ট্যাটাস বার নিষ্ক্রিয় অথবা সংশোধন করে"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"অ্যাপ্লিকেশনকে স্ট্যাটাস বার অক্ষম করতে এবং সিস্টেম আইকনগুলি সরাতে দেয়৷"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"স্থিতি দন্ডে থাকুন"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index a7b29f7..0ee66fc 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"praviti snimke ekrana"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Može napraviti snimak ekrana."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Pregled, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"onemogućavanje ili mijenjanje statusne trake"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Dozvoljava aplikaciji onemogućavanje statusne trake ili dodavanje i uklanjanje sistemskih ikona."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"funkcioniranje u vidu statusne trake"</string>
@@ -829,7 +831,7 @@
<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">"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="tablet" msgid="2388436408621909298">"Prati broj pogrešno unesenih 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>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Prati broj pogrešno unesenih lozinki prilikom otključavanja ekrana i zaključava telefon ili briše sve podatke s telefona ukoliko se previše puta unese pogrešna lozinka."</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 0d332fb..48ebcad 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fer una captura de pantalla"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pot fer una captura de la pantalla."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Previsualitza, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"desactivar o modificar la barra d\'estat"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permet que l\'aplicació desactivi la barra d\'estat o afegeixi i elimini icones del sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"aparèixer a la barra d\'estat"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index f041b2f..fef6fa6 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -358,6 +358,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Pořídit snímek obrazovky"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Může pořídit snímek obrazovky."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Náhled, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"zakázání či změny stavového řádku"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Umožňuje aplikaci zakázat stavový řádek nebo přidat či odebrat systémové ikony."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"vydávání se za stavový řádek"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index a396d08..03b17b0 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Tag screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan tage et screenshot af skærmen."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"deaktivere eller redigere statuslinje"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Tillader, at appen kan deaktivere statusbjælken eller tilføje og fjerne systemikoner."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"vær statusbjælken"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index f56194c..ae1da16 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Screenshot erstellen"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Es kann ein Screenshot des Displays erstellt werden."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Vorschau – <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"Statusleiste deaktivieren oder ändern"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Ermöglicht der App, die Statusleiste zu deaktivieren oder Systemsymbole hinzuzufügen oder zu entfernen"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"Statusleiste darstellen"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 69b3ece..b9d9c3c 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Λήψη στιγμιότυπου οθόνης"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Μπορεί να τραβήξει στιγμιότυπο της οθόνης."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Προεπισκόπηση, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"απενεργοποιεί ή να τροποποιεί την γραμμή κατάστασης"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Επιτρέπει στην εφαρμογή να απενεργοποιεί τη γραμμή κατάστασης ή να προσθέτει και να αφαιρεί εικονίδια συστήματος."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ορίζεται ως γραμμή κατάστασης"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index e87dcb2..e825eae 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Take screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Can take a screenshot of the display."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"be the status bar"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 1d0877d..71b5903 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Take screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Can take a screenshot of the display."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"be the status bar"</string>
@@ -1896,8 +1898,7 @@
<string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"Ask for PIN before unpinning"</string>
<string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"Ask for unlock pattern before unpinning"</string>
<string name="lock_to_app_unlock_password" msgid="9126722403506560473">"Ask for password before unpinning"</string>
- <!-- no translation found for package_installed_device_owner (8684974629306529138) -->
- <skip />
+ <string name="package_installed_device_owner" msgid="8684974629306529138">"Installed by your admin.\nGo to settings to view granted permissions"</string>
<string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
@@ -2394,8 +2395,7 @@
<string name="profile_label_work_3" msgid="4834572253956798917">"Work 3"</string>
<string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
<string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
- <!-- no translation found for redacted_notification_message (1520587845842228816) -->
- <skip />
+ <string name="redacted_notification_message" msgid="1520587845842228816">"Sensitive notification content hidden"</string>
<string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
<string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"App content hidden from screen share for security"</string>
<string name="satellite_notification_title" msgid="4026338973463121526">"Auto connected to satellite"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 0f7ce43..f0c5d7a 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Take screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Can take a screenshot of the display."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"be the status bar"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index ffd365f..648693f 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Take screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Can take a screenshot of the display."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"be the status bar"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 91b92ff..25d6c18 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Take screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Can take a screenshot of the display."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"be the status bar"</string>
@@ -1896,8 +1898,7 @@
<string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"Ask for PIN before unpinning"</string>
<string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"Ask for unlock pattern before unpinning"</string>
<string name="lock_to_app_unlock_password" msgid="9126722403506560473">"Ask for password before unpinning"</string>
- <!-- no translation found for package_installed_device_owner (8684974629306529138) -->
- <skip />
+ <string name="package_installed_device_owner" msgid="8684974629306529138">"Installed by your admin.\nGo to settings to view granted permissions"</string>
<string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
@@ -2394,8 +2395,7 @@
<string name="profile_label_work_3" msgid="4834572253956798917">"Work 3"</string>
<string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
<string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
- <!-- no translation found for redacted_notification_message (1520587845842228816) -->
- <skip />
+ <string name="redacted_notification_message" msgid="1520587845842228816">"Sensitive notification content hidden"</string>
<string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
<string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"App content hidden from screen share for security"</string>
<string name="satellite_notification_title" msgid="4026338973463121526">"Auto connected to satellite"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 9fbce46..953bfbd 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Tomar captura de pantalla"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puede tomar capturas de pantalla."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Vista previa, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"desactivar o modificar la barra de estado"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que la aplicación inhabilite la barra de estado o que agregue y elimine íconos del sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"aparecer en la barra de estado"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 07b6456..ba2c5e5 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Hacer captura"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puede hacer capturas de la pantalla."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Vista previa, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"inhabilitar o modificar la barra de estado"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que la aplicación inhabilite la barra de estado o añada y elimine iconos del sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"aparecer en la barra de estado"</string>
@@ -1512,7 +1514,7 @@
<string name="deny" msgid="6632259981847676572">"Denegar"</string>
<string name="permission_request_notification_title" msgid="1810025922441048273">"Permiso solicitado"</string>
<string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Permiso solicitado\npara la cuenta <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
- <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Permiso solicitado por <xliff:g id="APP">%1$s</xliff:g>\npara acceder a la cuenta<xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
+ <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Permiso solicitado por <xliff:g id="APP">%1$s</xliff:g>\npara acceder a la cuenta <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
<string name="forward_intent_to_owner" msgid="4620359037192871015">"Estás usando esta aplicación fuera del perfil de trabajo"</string>
<string name="forward_intent_to_work" msgid="3620262405636021151">"Estás usando esta aplicación en tu perfil de trabajo"</string>
<string name="input_method_binding_label" msgid="1166731601721983656">"Método de introducción de texto"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index a6f2f70..b100016 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Jäädvusta ekraanipilt"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Saab jäädvustada ekraanipildi."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Eelvaade, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"keela või muuda olekuriba"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Võimaldab rakendusel keelata olekuriba või lisada ja eemaldada süsteemiikoone."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"olekuribana kuvamine"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 1f14486..4613ac6 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Pantaila-argazkiak atera."</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pantaila-argazkiak atera ditzake."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Aurrebista, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"desgaitu edo aldatu egoera-barra"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Egoera-barra desgaitzeko edo sistema-ikonoak gehitzeko edo kentzeko baimena ematen dio aplikazioari."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"bihurtu egoera-barra"</string>
@@ -2048,7 +2050,7 @@
<string name="app_category_maps" msgid="6395725487922533156">"Mapak eta nabigazioa"</string>
<string name="app_category_productivity" msgid="1844422703029557883">"Produktibitatea"</string>
<string name="app_category_accessibility" msgid="6643521607848547683">"Erabilerraztasuna"</string>
- <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Gailuaren memoria"</string>
+ <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Gailuko biltegia"</string>
<string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB bidezko arazketa"</string>
<string name="time_picker_hour_label" msgid="4208590187662336864">"ordu"</string>
<string name="time_picker_minute_label" msgid="8307452311269824553">"minutu"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 4be209f..439eb9b 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"گرفتن نماگرفت"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"میتواند از نمایشگر نماگرفت بگیرد."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"پیشنما، <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"غیرفعال کردن یا تغییر نوار وضعیت"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"به برنامه اجازه میدهد تا نوار وضعیت را غیرفعال کند یا نمادهای سیستم را اضافه یا حذف کند."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"نوار وضعیت باشد"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 293d913..aa87f24 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ota kuvakaappaus"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Voi ottaa kuvakaappauksen näytöstä."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Esikatselu, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"poista tilapalkki käytöstä tai muokkaa tilapalkkia"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Antaa sovelluksen poistaa tilapalkin käytöstä ja lisätä tai poistaa järjestelmäkuvakkeita."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"sijaita tilapalkissa"</string>
@@ -841,7 +843,7 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"Lukita ruudun"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"Hallinnoida, milloin ja miten näyttö lukittuu."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"Pyyhkiä kaikki tiedot"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Tyhjennä tablet-laitteen tiedot varoituksetta palauttamalla tehdasasetukset."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Tyhjentää tablet-laitteen tiedot varoituksetta palauttamalla tehdasasetukset."</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Tyhjentää Android TV ‑laitteen tiedot ilman varoitusta palauttamalla tehdasasetukset."</string>
<string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Poistaa infotainment-järjestelmän datan ilman varoitusta palauttamalla tehdasasetukset."</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Tyhjentää puhelimen tiedot varoituksetta palauttamalla tehdasasetukset."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 31a6619..1ce5ba0 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Prendre une capture d\'écran"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Peut prendre une capture de l\'écran."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Aperçu, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"désactiver ou modifier la barre d\'état"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permet à l\'application de désactiver la barre d\'état, ou d\'ajouter et de supprimer des icônes système."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"servir de barre d\'état"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index c9cddb5..f94ebac 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Prendre une capture d\'écran"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Peut prendre des captures d\'écran."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Aperçu, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"Désactivation ou modification de la barre d\'état"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permet à l\'application de désactiver la barre d\'état, ou d\'ajouter et de supprimer des icônes système."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"remplacer la barre d\'état"</string>
@@ -829,7 +831,7 @@
<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">"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="tablet" msgid="2388436408621909298">"Contrôler le nombre de mots de passe incorrects saisis pour déverrouiller l\'écran, et verrouiller la tablette ou effacer toutes ses données si trop de mots de passe incorrects sont saisis"</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>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouiller le téléphone ou effacer toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 1c26c20..e3f2f3a 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Facer captura de pantalla"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pode facer capturas de pantalla."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Vista previa, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"desactivar ou modificar a barra de estado"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permite á aplicación desactivar a barra de estado ou engadir e quitar as iconas do sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"actuar como a barra de estado"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index d85a179..e08a62b 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"સ્ક્રીનશૉટ લો"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ડિસ્પ્લેનો સ્ક્રીનશૉટ લઈ શકે છે."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"પ્રીવ્યૂ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"સ્ટેટસ બારને અક્ષમ કરો અથવા તેમાં ફેરફાર કરો"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ઍપ્લિકેશનને સ્ટેટસ બાર અક્ષમ કરવાની અથવા સિસ્ટમ આયકન્સ ઉમેરવા અને દૂર કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"સ્ટેટસ બારમાં બતાવો"</string>
@@ -828,7 +830,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"પાસવર્ડ નિયમો સેટ કરો"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"સ્ક્રીન લૉક પાસવર્ડ અને પિનમાં મંજૂર લંબાઈ અને અક્ષરોને નિયંત્રિત કરો."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"સ્ક્રીનને અનલૉક કરવાના પ્રયત્નોને મૉનિટર કરો"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"સ્ક્રીનને અનલૉક કરતી વખતે લખેલા ખોટા પાસવર્ડ્સની સંખ્યાને મૉનિટર કરો અને જો ઘણા બધા ખોટા પાસવર્ડ્સ લખ્યાં છે તો ટેબ્લેટને લૉક કરો અથવા ટેબ્લેટનો તમામ ડેટા કાઢી નાખો."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"સ્ક્રીનને અનલૉક કરતી વખતે લખેલા ખોટા પાસવર્ડની સંખ્યાને મૉનિટર કરો અને જો ઘણા બધા ખોટા પાસવર્ડ લખ્યાં છે તો ટૅબ્લેટને લૉક કરો અથવા ટૅબ્લેટનો તમામ ડેટા કાઢી નાખો."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"સ્ક્રીનને અનલૉક કરતી વખતે ટાઇપ કરેલા ખોટા પાસવર્ડની સંખ્યાને મૉનિટર કરો અને જો ઘણા બધા ખોટા પાસવર્ડ ટાઇપ કર્યા હોય, તો તમારા Android TV ડિવાઇસના ડેટાને લૉક કરો અથવા આ વપરાશકર્તાનો બધો ડેટા કાઢી નાખો."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"સ્ક્રીનને અનલૉક કરતી વખતે લખેલા ખોટા પાસવર્ડની સંખ્યાને મૉનિટર કરો અને જો ઘણા બધા ખોટા પાસવર્ડ લખ્યા હોય તો ઇન્ફોટેનમેન્ટ સિસ્ટમને લૉક કરો અથવા ઇન્ફોટેનમેન્ટ સિસ્ટમનો બધો ડેટા કાઢી નાખો."</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"સ્ક્રીનને અનલૉક કરતી વખતે લખેલા ખોટા પાસવર્ડ્સની સંખ્યાને મૉનિટર કરો અને જો ઘણા બધા ખોટા પાસવર્ડ્સ લખ્યાં છે તો ફોનને લૉક કરો અથવા ફોનનો તમામ ડેટા કાઢી નાખો."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 8eddd12..f393074 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"स्क्रीनशॉट लें"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिसप्ले का स्क्रीनशॉट लिया जा सकता है."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> की झलक"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"स्टेटस बार को अक्षम करें या बदलें"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ऐप को, स्टेटस बार को बंद करने या सिस्टम आइकॉन को जोड़ने और निकालने की अनुमति देता है."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"स्टेटस बार को रहने दें"</string>
@@ -828,7 +830,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करना"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रीन लॉक पासवर्ड और पिन की लंबाई और उनमें स्वीकृत वर्णों को नियंत्रित करना."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रीन अनलॉक करने की कोशिशों पर नज़र रखना"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"स्क्रीन को अनलॉक करते समय गलत लिखे गए पासवर्ड की संख्या पर निगरानी करें, और बहुत ज़्यादा बार गलत पासवर्ड लिखे जाने पर टैबलेट लॉक करें या टैबलेट का संपूर्ण डेटा मिटाएं."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"स्क्रीन को अनलॉक करते समय ध्यान रखा जाएगा कि कितनी बार गलत पासवर्ड डाला गया है. अगर बहुत ज़्यादा बार गलत पासवर्ड डाला गया है, तो यह टैबलेट को तुरंत लॉक कर देगा या इसका पूरा डेटा मिटा देगा."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"स्क्रीन को अनलॉक करते समय ध्यान रखें कि कितनी बार गलत पासवर्ड डाला गया है. अगर बहुत ज़्यादा बार गलत पासवर्ड डाला गया है, तो अपने Android TV डिवाइस को तुरंत लॉक करें या इसका सभी डेटा मिटाएं."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"स्क्रीन को अनलॉक करते समय ध्यान रखें कि कितनी बार गलत पासवर्ड डाला गया है. अगर बहुत ज़्यादा बार गलत पासवर्ड डाला गया है, तो सूचना और मनोरंजन की सुविधा देने वाले डिवाइस को लॉक करें या इस डिवाइस का सारा डेटा मिटाएं."</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"स्क्रीन को अनलॉक करते समय ध्यान रखेगा कि कितनी बार गलत पासवर्ड डाला गया है. अगर बहुत ज़्यादा बार गलत पासवर्ड डाला जाएगा, तो फ़ोन को तुरंत लॉक करेगा या फ़ोन का सारा डेटा मिटा देगा."</string>
@@ -841,7 +843,7 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"स्क्रीन लॉक करना"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"इससे यह कंट्रोल होता है कि स्क्रीन कैसे और कब लॉक हो."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"सारा डेटा मिटाना"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"फ़ैक्टरी डेटा रीसेट करके चेतावनी दिए बिना फ़ोन का डेटा मिटाना."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"इससे फ़ैक्ट्री डेटा रीसेट करके, चेतावनी दिए बिना फ़ोन का डेटा मिटा दिया जाता है."</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"फ़ैक्ट्री डेटा रीसेट करके अपने Android TV डिवाइस का डेटा बिना चेतावनी दिए मिटाएं."</string>
<string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"फ़ैक्ट्री डेटा रीसेट करके, बिना किसी चेतावनी के सूचना और मनोरंजन की सुविधा देने वाले डिवाइस में सेव डेटा को हमेशा के लिए मिटाएं."</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"फ़ैक्टरी डेटा रीसेट करके, चेतावनी दिए बिना फ़ोन का डेटा मिटा देगा."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index fcf08a4..33cde13 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Snimi zaslon"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Možete napraviti snimku zaslona."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Pregled, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"onemogućavanje ili izmjena trake statusa"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Aplikaciji omogućuje onemogućavanje trake statusa ili dodavanje i uklanjanje sistemskih ikona."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"biti traka statusa"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 76c41c1..acf2266 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Képernyőkép készítése"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Készíthet képernyőképet a kijelzőről."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Előnézet, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"állapotsor kikapcsolása vagy módosítása"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Lehetővé teszi az alkalmazás számára az állapotsor kikapcsolását, illetve rendszerikonok hozzáadását és eltávolítását."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"az állapotsor szerepének átvétele"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 7626694..8ca4708 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Սքրինշոթի ստեղծում"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Կարող է ստեղծել էկրանի սքրինշոթ։"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Նախադիտում, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"անջատել կամ փոփոխել կարգավիճակի գոտին"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Թույլ է տալիս հավելվածին անջատել կարգավիճակի գոտին կամ ավելացնել ու հեռացնել համակարգի պատկերակները:"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"լինել կարգավիճակի գոտի"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 44f13f5..5d2ffd4 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ambil screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Dapat mengambil screenshot tampilan."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Pratinjau, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"nonaktifkan atau ubah bilah status"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Mengizinkan apl menonaktifkan bilah status atau menambah dan menghapus ikon sistem."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"jadikan bilah status"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index eb9d2f7..b304edc 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Taka skjámynd"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Getur tekið skjámynd af skjánum."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Forskoðun, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"slökkva á eða breyta stöðustiku"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Leyfir forriti að slökkva á stöðustikunni eða bæta við og fjarlægja kerfistákn."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"vera stöðustikan"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index a82eb71..00b79b6 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Acquisire screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Può acquisire uno screenshot del display."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> in anteprima"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"disattivazione o modifica della barra di stato"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Consente all\'applicazione di disattivare la barra di stato o di aggiungere e rimuovere icone di sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ruolo di barra di stato"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 9345826..861e294 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"צילום המסך"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ניתן לצלם צילום מסך של התצוגה."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"תצוגה מקדימה, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"השבתה או שינוי של שורת הסטטוס"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"מאפשרת לאפליקציה להשבית את שורת הסטטוס או להוסיף ולהסיר סמלי מערכת."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"להיות שורת הסטטוס"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 5934b06..a9365d5 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"スクリーンショットの撮影"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ディスプレイのスクリーンショットを撮影できます。"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"プレビュー - <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"ステータスバーの無効化や変更"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ステータスバーの無効化、システムアイコンの追加や削除をアプリに許可します。"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ステータスバーへの表示"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index e0ca395..9cfc999 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ეკრანის ანაბეჭდის გადაღება"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"შეუძლია ეკრანის ანაბეჭდის გადაღება."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"გადახედვა, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"სტატუსის ზოლის გათიშვა ან ცვლილება"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"აპს შეეძლება სტატუსების ზოლის გათიშვა და სისტემის ხატულების დამატება/წაშლა."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"სტატუსის ზოლის ჩანაცვლება"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index c5f87b0..ebfd196 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Скриншот жасау"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Дисплейдің скриншотын жасай аласыз."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Алғы көрініс, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"күйін көрсету тақтасын өшіру немесе өзгерту"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Қолданбаға күй жолағын өшіруге немесе жүйелік белгішелерді қосуға және жоюға рұқсат береді."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"күй жолағы болу"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index d882e64..5f6cd38 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ថតអេក្រង់"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"អាចថតអេក្រង់នៃផ្ទាំងអេក្រង់បាន។"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"មើលសាកល្បង <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"បិទ ឬកែរបារស្ថានភាព"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ឲ្យកម្មវិធីបិទរបារស្ថានភាព ឬបន្ថែម និងលុបរូបតំណាងប្រព័ន្ធ។"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ធ្វើជារបារស្ថានភាព"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 1d9fe73..ec92812 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ಪ್ರದರ್ಶನದ ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಲ್ಲದು."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"ಪೂರ್ವವೀಕ್ಷಣೆ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಇಲ್ಲವೇ ಮಾರ್ಪಡಿಸಿ"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಥವಾ ಸೇರಿಸಲು ಮತ್ತು ಸಿಸ್ಟಂ ಐಕಾನ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿರಲು"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 94dec8d..5a1af5e 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"스크린샷 촬영"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"디스플레이 스크린샷을 촬영할 수 있습니다."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"미리보기, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"상태 표시줄 사용 중지 또는 수정"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"앱이 상태 표시줄을 사용중지하거나 시스템 아이콘을 추가 및 제거할 수 있도록 허용합니다."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"상태 표시줄에 위치"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index b1c819c..6731984 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Скриншот тартып алуу"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Дисплейдин скриншотун тартып алсаңыз болот."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Алдын ала көрүү, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"абал тилкесин өчүрүү же өзгөртүү"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Колдонмого абал тилкесин өчүрүү же тутум сүрөтчөлөрүн кошуу же алып салуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"абал тилкесинин милдетин аткаруу"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 9c514bb..12adb17 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ຖ່າຍຮູບໜ້າຈໍ"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ສາມາດຖ່າຍຮູບໜ້າຈໍໄດ້."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"ຕົວຢ່າງ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"ປິດການນນຳໃຊ້ ຫຼື ແກ້ໄຂແຖບສະຖານະ"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ອະນຸຍາດໃຫ້ແອັບຯປິດການເຮັດວຽກຂອງແຖບສະຖານະ ຫຼືເພີ່ມ ແລະລຶບໄອຄອນລະບົບອອກໄດ້."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ເປັນແຖບສະຖານະ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 34aecab..3a95d2c 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -358,6 +358,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ekrano kopijos kūrimas"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Galima sukurti vaizdo ekrano kopiją."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Peržiūra, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"išjungti ar keisti būsenos juostą"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Leidžiama programai neleisti būsenos juostos arba pridėti ir pašalinti sistemos piktogramas."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"būti būsenos juosta"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 1c1918f..7e5ee3b 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ekrānuzņēmuma izveide"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Var izveidot displeja ekrānuzņēmumu."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> (priekšskatījums)"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"atspējot vai pārveidot statusa joslu"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Ļauj lietotnei atspējot statusa joslu vai pievienot un noņemt sistēmas ikonas."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"Būt par statusa joslu"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index f347c7e..3df020a 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Зачувување слика од екранот"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Може да зачува слика од екранот."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Преглед, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"оневозможи или измени статусна лента"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Дозволува апликацијата да ја оневозможи статусната лента или да додава или отстранува системски икони."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"да стане статусна лента"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 7002f3ce..b719ba1 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"സ്ക്രീന്ഷോട്ട് എടുക്കുക"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ഡിസ്പ്ലേയുടെ സ്ക്രീൻഷോട്ട് എടുക്കാൻ കഴിയും."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"പ്രിവ്യൂ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"സ്റ്റാറ്റസ് ബാർ പ്രവർത്തനരഹിതമാക്കുക അല്ലെങ്കിൽ പരിഷ്ക്കരിക്കുക"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"നില ബാർ പ്രവർത്തരഹിതമാക്കുന്നതിന് അല്ലെങ്കിൽ സിസ്റ്റം ഐക്കണുകൾ ചേർക്കുന്നതിനും നീക്കംചെയ്യുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"സ്റ്റാറ്റസ് ബാർ ആയിരിക്കുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 437cced..e6f57a3 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Дэлгэцийн зургийг дарах"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Дэлгэцийн зургийг дарах боломжтой."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Урьдчилан үзэх, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"статус самбарыг идэвхгүй болгох болон өөрчлөх"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Апп нь статус самбарыг идэвхгүй болгох эсвэл систем дүрсийг нэмэх, хасах боломжтой."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"статусын хэсэг болох"</string>
@@ -828,7 +830,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"Нууц үгний дүрмийг тохируулах"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"Дэлгэц түгжих нууц үг болон ПИН кодны урт болон нийт тэмдэгтийн уртыг хянах."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"Дэлгэцийн түгжээг тайлах оролдлогыг хянах"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Дэлгэц түгжигдсэн үед нууц үг буруу оруулалтын тоог хянах ба хэрэв хэт олон удаа нууц үгийг буруу оруулбал таблетыг түгжих болон таблетын бүх датаг арилгана"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Дэлгэцийн түгжээг тайлах үед нууц үгийг буруу оруулах тоог хянах ба хэрэв хэт олон удаа нууц үгийг буруу оруулбал таблетыг түгжинэ эсвэл таблетын бүх өгөгдлийг устгана."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Дэлгэцийн түгжээг тайлахаар буруу оруулсан нууц үгийн тоог хянаж, нууц үгийг хэт олон удаа буруу оруулсан тохиолдолд таны Android TV төхөөрөмжийг түгжиж эсвэл үүний бүх өгөгдлийг устгана."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Дэлгэцийн түгжээг тайлахад буруу бичиж оруулсан нууц үгний тоог хянаж, инфотэйнмент системийг түгжих эсвэл хэт олон удаа нууц үгийг буруу бичиж оруулсан тохиолдолд инфотэйнмент системийн бүх өгөгдлийг устгана."</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Дэлгэц түгжигдсэн үед нууц үг буруу оруулалтын тоог хянах, ба хэрэв хэт олон удаа нууц үгийг буруу оруулбал утсыг түгжиж эсвэл утасны бүх өгөгдлийг арилгана"</string>
@@ -841,7 +843,7 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"Дэлгэц түгжих"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"Дэлгэц хэзээ яаж түгжихийг удирдах"</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"Бүх өгөгдлийг арилгах"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Үйлдвэрийн дата утгыг өгсөнөөр таблетын дата шууд арилгагдана."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Үйлдвэрийн өгөгдлийн төлөвт шилжсэнээр таблетын өгөгдлийг шууд арилгана уу."</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Таны Android TV төхөөрөмжийн өгөгдлийг танд анхааруулалгүйгээр үйлдвэрээс гарсан төлөвт шилжүүлэн устгана."</string>
<string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Үйлдвэрийн өгөгдлийн төлөвт үйлдлийг гүйцэтгэснээр инфотэйнмент системийн өгөгдлийг сануулгагүйгээр устгана."</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Сануулахгүйгээр утасны бүх өгөгдлийг арилгаж, үйлдвэрийн өгөгдлийн тохиргоонд шинэчилнэ"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 3d6aff2..a052966 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"स्क्रीनशॉट घ्या"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिस्प्लेचा स्क्रीनशॉट घेऊ शकतो."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"पूर्वावलोकन, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"स्टेटस बार अक्षम करा किंवा सुधारित करा"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"स्टेटस बार अक्षम करण्यासाठी किंवा सिस्टम चिन्हे जोडण्यासाठी आणि काढण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"स्टेटस बार होऊ द्या"</string>
@@ -828,7 +830,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करा"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रीन लॉक पासवर्ड आणि पिन मध्ये अनुमती दिलेले लांबी आणि वर्ण नियंत्रित करा."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रीन अनलॉक प्रयत्नांवर लक्ष ठेवा"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"टाइप केलेल्या अयोग्य पासवर्डांच्या अंकांचे परीक्षण करा. स्क्रीन अनलॉक केली जाते, तेव्हा टॅबलेट लॉक करा किंवा बरेच पासवर्ड टाइप केले असल्यास टॅबलेटचा सर्व डेटा मिटवा."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"टाइप केलेल्या चुकीच्या पासवर्डच्या संख्येचे निरीक्षण करा. स्क्रीन अनलॉक करताना, टॅबलेट लॉक करा किंवा अनेक चुकीचे पासवर्ड टाइप केले असल्यास, टॅबलेटचा सर्व डेटा मिटवा."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"स्क्रीन अनलॉक करताना टाइप केलेल्या चुकीच्या पासवर्ड संख्येचे परीक्षण करते आणि Android TV डिव्हाइस लॉक करते किंवा अनेक चुकीचे पासवर्ड टाइप केले असल्यास Android TV डिव्हाइसचा सर्व डेटा मिटवते."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"टाइप केलेल्या चुकीच्या पासवर्डच्या संख्येचे निरीक्षण करा. स्क्रीन अनलॉक करताना, इंफोटेनमेंट सिस्टीम लॉक करा किंवा अनेक चुकीचे पासवर्ड टाइप केले असल्यास, इंफोटेनमेंट सिस्टीमचा सर्व डेटा मिटवा."</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"स्क्रीन अनलॉक करताना टाइप केलेल्या अयोग्य पासवर्डच्या संख्येवर लक्ष ठेवा. बरेच पासवर्ड टाइप केले असल्यास फोन लॉक करा किंवा फोनचा सर्व डेटा मिटवा."</string>
@@ -841,7 +843,7 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"स्क्रीन लॉक करा"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"स्क्रीन कशी आणि केव्हा लॉक होते ते नियंत्रित करा."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"सर्व डेटा मिटवा"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"फॅक्टरी डेटा रीसेट करून चेतावणीशिवाय टॅब्लेटचा डेटा मिटवा."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"फॅक्टरी डेटा रीसेट करून चेतावणीशिवाय टॅबलेटचा डेटा मिटवा."</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"चेतावणी न देता फॅक्टरी डेटा रीसेट करून Android TV डिव्हाइसचा डेटा मिटवा."</string>
<string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"फॅक्टरी डेटा रीसेट करून कोणत्याही चेतावणीशिवाय इंफोटेनमेंट सिस्टीमचा डेटा मिटवा."</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"फॅक्टरी डेटा रीसेट करून चेतावणीशिवाय फोनचा डेटा मिटवा."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index da4a793..904d9150 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ambil tangkapan skrin"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Boleh mengambil tangkapan skrin paparan."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Pratonton, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"lumpuhkan atau ubah suai bar status"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Membenarkan apl melumpuhkan bar status atau menambah dan mengalih keluar ikon sistem."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"jadi bar status"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index d3fbd52..e965f47 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ဖန်သားပြင်ဓာတ်ပုံ ရိုက်ရန်"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ဖန်သားပြင်ပြသမှုကို ဓာတ်ပုံရိုက်နိုင်ပါသည်။"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> အစမ်းကြည့်ခြင်း"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"အခြေအနေပြဘားအား အလုပ်မလုပ်ခိုင်းရန်သို့မဟုတ် မွမ်းမံရန်"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"အက်ပ်အား အခြေအနေပြ ဘားကို ပိတ်ခွင့် သို့မဟတ် စနစ် အိုင်ကွန်များကို ထည့်ခြင်း ဖယ်ရှားခြင်း ပြုလုပ်ခွင့် ပြုသည်။"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"အခြေအနေပြ ဘားဖြစ်ပါစေ"</string>
@@ -828,7 +830,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"စကားဝှက်စည်းမျဥ်းကိုသတ်မှတ်ရန်"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"မျက်နှာပြင်သော့ခတ်သည့် စကားဝှက်များနှင့် PINများရှိ ခွင့်ပြုထားသည့် စာလုံးအရေအတွက်နှင့် အက္ခရာများအား ထိန်းချုပ်ရန်။"</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"မျက်နှာပြင်လော့ခ်ဖွင့်ရန် ကြိုးပမ်းမှုများကို စောင့်ကြည့်ခြင်း"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် တက်ဘလက်ကို သော့ခတ်ရန် သို့မဟုတ် တက်ဘလက် ဒေတာ အားလုံးကို ဖျက်ရန်။"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"မျက်နှာပြင် လော့ခ်ဖွင့်ရန် အတွက် မမှန်ကန်သော စကားဝှက် ထည့်သွင်းမှု အကြိမ်ရေကို စောင့်ကြည့်ပြီး မှားယွင်းသည့်စကားဝှက် ထည့်သွင်းမှု အလွန်များပါက တက်ဘလက်ကို လော့ခ်ချသည် (သို့) တက်ဘလက် ဒေတာ အားလုံးကို ဖျက်သည်။"</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"မျက်နှာပြင်ကို လော့ခ်ဖွင့်သည့်အခါ စကားဝှက်မှားယွင်းစွာ ရိုက်သွင်းသည့်အကြိမ်ရေကို စောင့်ကြည့်ပြီး မှားယွင်းသည့်အကြိမ်ရေ အလွန်များလာပါက သင့် Android TV စက်ပစ္စည်းကို လော့ခ်ချခြင်း သို့မဟုတ် သင့် Android TV ရှိ အသုံးပြုသူဒေတာများအားလုံးကို ဖျက်ခြင်းတို့ ပြုလုပ်သွားပါမည်။"</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"ဖန်သားပြင်လော့ခ်ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက် စကားဝှက် မမှန်မကန် ရိုက်ထည့်မှု များနေလျှင် သတင်းနှင့်ဖျော်ဖြေရေး စနစ်ကို လော့ခ်ချသည် (သို့) ၎င်း၏ ဒေတာအားလုံးကို ဖျက်သည်။"</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"မျက်နှာပြင်ကို လောခ်ဖွင့်ရန်အတွက် ရိုက်ထည့်သည့် မှားယွင်းသောစကားဝှက် အကြိမ်ရေကို စောင့်ကြည့်ပြီး မမှန်သောစကားဝှက် ရိုက်ထည့်မှု အလွန်များနေလျှင် ဖုန်းကိုလော့ခ်ချသည် (သို့) ဖုန်း ဒေတာအားလုံးကို ဖျက်သည်။"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 247c21b..c6a2f44 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ta skjermdump"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan ikke ta en skjermdump av skjermen."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Forhåndsvisning, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"deaktivere eller endre statusfeltet"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Lar appen deaktivere statusfeltet eller legge til og fjerne systemikoner."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"vise appen i statusfeltet"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 85a5118..230e701 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -352,10 +352,12 @@
<string name="capability_title_canPerformGestures" msgid="9106545062106728987">"जेस्चरहरू सम्बन्धी कार्य गर्नुहोस्"</string>
<string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"ट्याप, स्वाइप गर्न, थिच्न र अन्य जेस्चरहरू सम्बन्धी कार्य गर्न सक्छ"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"फिंगरप्रिन्टका जेस्चरहरू"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"यसले यन्त्रको फिंगरप्रिन्टसम्बन्धी सेन्सरमा गरिएका इसाराहरूलाई खिच्न सक्छ।"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"यसले यन्त्रको फिंगरप्रिन्टसम्बन्धी सेन्सरमा गरिएका जेस्चर खिच्न सक्छ।"</string>
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"स्क्रिनसट लिनुहोस्"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिस्प्लेको स्क्रिनसट लिन सकिन्छ।"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"प्रिभ्यू, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"स्थिति पट्टिलाई अक्षम वा संशोधित गर्नुहोस्"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"स्थिति पट्टि असक्षम पार्न वा प्रणाली आइकनहरू थप्न र हटाउन एपलाई अनुमति दिन्छ।"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"स्टाटस बार हुन दिनुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 52884fb..5de3287 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Screenshot maken"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan een screenshot van het scherm maken."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Voorbeeld, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"statusbalk uitzetten of wijzigen"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Hiermee kan de app de statusbalk uitzetten of systeemiconen toevoegen en verwijderen."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"de statusbalk zijn"</string>
@@ -828,11 +830,11 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"Wachtwoordregels instellen"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"De lengte en het aantal tekens beheren die zijn toegestaan in wachtwoorden en pincodes voor schermvergrendeling."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"Pogingen voor schermontgrendeling bijhouden"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en de tablet vergrendelen of alle gegevens op de tablet wissen als te veel onjuiste wachtwoorden worden ingevoerd."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Houd bij hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en vergrendel de tablet of wis alle gegevens op de tablet als te veel onjuiste wachtwoorden worden ingevoerd."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en het Android TV-apparaat vergrendelen of alle gegevens van het Android TV-apparaat wissen als te veel onjuiste wachtwoorden worden ingevoerd."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld, en het infotainmentsysteem vergrendelen of alle gegevens op het infotainmentsysteem wissen bij te veel onjuiste wachtwoorden."</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en de telefoon vergrendelen of alle gegevens op de telefoon wissen als te veel onjuiste wachtwoorden worden ingevoerd."</string>
- <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en de tablet vergrendelen of alle gegevens van deze gebruiker wissen als te veel onjuiste wachtwoorden worden ingevoerd."</string>
+ <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"Houd bij hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en vergrendel de tablet of wis alle gegevens op de tablet als te veel onjuiste wachtwoorden worden ingevoerd."</string>
<string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en het Android TV-apparaat vergrendelen of alle gegevens van deze gebruiker wissen als te veel onjuiste wachtwoorden worden ingevoerd."</string>
<string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd als het scherm wordt ontgrendeld, en het infotainmentsysteem vergrendelen of alle gegevens van dit profiel wissen bij te veel onjuiste wachtwoorden."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en de telefoon vergrendelen of alle gegevens van deze gebruiker wissen bij te veel onjuiste wachtwoorden."</string>
@@ -841,7 +843,7 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"Het scherm vergrendelen"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"Beheer hoe en wanneer het scherm wordt vergrendeld."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"Alle gegevens wissen"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"De gegevens van de tablet zonder waarschuwing wissen door de fabrieksinstellingen te herstellen."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Wis de gegevens van de tablet zonder waarschuwing door de fabrieksinstellingen te herstellen."</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"De gegevens van het Android TV-apparaat zonder waarschuwing wissen door de fabrieksinstellingen terug te zetten."</string>
<string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"De gegevens van het infotainmentsysteem zonder waarschuwing wissen door de fabrieksinstellingen terug te zetten."</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Wis de gegevens van de telefoon zonder waarschuwing door de fabrieksinstellingen te herstellen."</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index d7f070b..6f186ff 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ସ୍କ୍ରିନସଟ୍ ନିଅନ୍ତୁ"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ଡିସପ୍ଲେର ଏକ ସ୍କ୍ରିନସଟ୍ ନିଆଯାଇପାରେ।"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"ପ୍ରିଭ୍ୟୁ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"ଷ୍ଟାଟସ୍ ବାର୍କୁ ଅକ୍ଷମ କିମ୍ୱା ସଂଶୋଧନ କରନ୍ତୁ"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ଆପ୍କୁ, ସ୍ଥିତି ବାର୍ ଅକ୍ଷମ କରିବାକୁ କିମ୍ବା ସିଷ୍ଟମ୍ ଆଇକନ୍ ଯୋଡ଼ିବା କିମ୍ବା ବାହାର କରିବାକୁ ଦେଇଥାଏ।"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ଷ୍ଟାଟସ୍ ବାର୍ ରହିବାକୁ ଦିଅନ୍ତୁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 473657f..7f83ddb 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਓ"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ਡਿਸਪਲੇ ਦਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈ ਸਕਦੀ ਹੈ।"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"ਪੂਰਵ-ਝਲਕ ਦੇਖੋ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"ਸਥਿਤੀ ਪੱਟੀ ਬੰਦ ਕਰੋ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਪੱਟੀ ਨੂੰ ਚਾਲੂ ਕਰਨ ਜਾਂ ਸਿਸਟਮ ਪ੍ਰਤੀਕਾਂ ਨੂੰ ਜੋੜਨ ਅਤੇ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ਸਥਿਤੀ ਪੱਟੀ ਬਣਨ ਦਿਓ"</string>
@@ -841,7 +843,7 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"ਸਕ੍ਰੀਨ ਲਾਕ ਕਰੋ"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"ਸਕ੍ਰੀਨ ਦਾ ਕਿਵੇਂ ਅਤੇ ਕਦੋਂ ਲਾਕ ਹੋਣਾ ਕੰਟਰੋਲ ਕਰੋ।"</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"ਇੱਕ ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਕਰਕੇ ਚਿਤਾਵਨੀ ਤੋਂ ਬਿਨਾਂ ਟੈਬਲੈੱਟ ਦਾ ਡਾਟਾ ਮਿਟਾਓ।"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਕਰ ਕੇ ਚਿਤਾਵਨੀ ਤੋਂ ਬਿਨਾਂ ਟੈਬਲੈੱਟ ਦਾ ਡਾਟਾ ਮਿਟਾਓ।"</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਕਰਕੇ ਬਿਨਾਂ ਚਿਤਾਵਨੀ ਦੇ ਤੁਹਾਡੇ Android TV ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।"</string>
<string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਕਰਕੇ ਚਿਤਾਵਨੀ ਤੋਂ ਬਿਨਾਂ ਵਾਹਨ ਆਡੀਓ ਸਿਸਟਮ ਦਾ ਡਾਟਾ ਮਿਟਾਓ।"</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਕਰ ਕੇ ਚਿਤਾਵਨੀ ਤੋਂ ਬਿਨਾਂ ਫ਼ੋਨ ਦਾ ਡਾਟਾ ਮਿਟਾਓ।"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index d8bc19c..a6937d2 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -358,6 +358,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Robienie zrzutu ekranu"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Może robić zrzuty ekranu wyświetlacza."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Podgląd, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"wyłączanie lub zmienianie paska stanu"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Pozwala aplikacji na wyłączanie paska stanu oraz dodawanie i usuwanie ikon systemowych."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"działanie jako pasek stanu"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 87e0ab3..d0dcc33 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fazer uma captura de tela"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pode fazer uma captura de tela."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Visualização, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"desativar ou modificar a barra de status"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que o app desative a barra de status ou adicione e remova ícones do sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ser a barra de status"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 271a049..4772ff8 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fazer captura de ecrã"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"É possível tirar uma captura de ecrã."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Pré-visualização, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"desativar ou modificar barra de estado"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permite à app desativar a barra de estado ou adicionar e remover ícones do sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ser apresentada na barra de estado"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 87e0ab3..d0dcc33 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fazer uma captura de tela"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pode fazer uma captura de tela."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Visualização, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"desativar ou modificar a barra de status"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que o app desative a barra de status ou adicione e remova ícones do sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"ser a barra de status"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index fb214be..0a31bf8 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fă o captură de ecran"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Poate face o captură de ecran."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Previzualizare, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"dezactivare sau modificare bare de stare"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permite aplicației să dezactiveze bara de stare sau să adauge și să elimine pictograme de sistem."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"să fie bara de stare"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 7d55445..1ae0499 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -358,6 +358,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Создавать скриншоты"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Создавать снимки экрана."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g>: предпросмотр"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"Отключение/изменение строки состояния"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Приложение сможет отключать строку состояния, а также добавлять и удалять системные значки."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"Замена строки состояния"</string>
@@ -830,7 +832,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"Настройка правил для паролей"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролировать длину и символы при вводе пароля и PIN-кода."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"Отслеживание попыток разблокировать экран"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Отслеживает попытки ввода пароля при разблокировке экрана и блокирует планшетный ПК или удаляет с него все данные, если было сделано слишком много таких попыток."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Отслеживать попытки ввода пароля при разблокировке экрана и блокировать планшет или удалять с него все данные, если было сделано слишком много таких попыток."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Блокировать устройство Android TV или удалять с него все ваши данные при слишком большом количестве неудачных попыток ввести пароль для разблокировки экрана."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Блокировать информационно-развлекательную систему или удалять из нее все данные, если совершено слишком много неудачных попыток ввести пароль для разблокировки экрана."</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Отслеживать попытки ввода пароля при разблокировке экрана и блокировать телефон или удалять с него все данные, если было сделано слишком много таких попыток."</string>
@@ -843,7 +845,7 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"Блокировка экрана"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"Управлять способом и временем блокировки экрана."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"Удаление всех данных"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Удалять все данные на планшетном ПК без предупреждения путем сброса настроек."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Удалять все данные на планшете без предупреждения путем сброса настроек."</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Удалять данные с устройства Android TV без предупреждения, выполняя восстановление заводских настроек."</string>
<string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Сбрасывать настройки без предупреждения, таким образом удаляя все данные из информационно-развлекательной системы."</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Удалять все данные на телефоне без предупреждения путем сброса настроек."</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index bc0f7ef..ee0cda2 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"තිර රුව ගන්න"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"සංදර්ශකයේ තිර රුවක් ගැනීමට හැකිය."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"පෙරදසුන, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"තත්ව තීරුව අබල කරන්න හෝ වෙනස් කරන්න"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"තත්ව තීරුව අක්රිය කිරීමට හෝ පද්ධති නිරූපක එකතු හෝ ඉවත් කිරීමට යෙදුමට අවසර දේ."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"තත්ත්ව තීරුව බවට පත්වීම"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index fa7aea5..3058de5 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -358,6 +358,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Vytvoriť snímku obrazovky"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Je možné vytvoriť snímku obrazovky."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Ukážka, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"zakázanie alebo zmeny stavového riadka"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Umožňuje aplikácii vypnúť stavový riadok alebo pridať a odstrániť systémové ikony."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"vydávanie sa za stavový riadok"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 2d3eaab..0215c39 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -358,6 +358,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ustvarjanje posnetka zaslona"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Lahko naredi posnetek zaslona."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Predogled, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"onemogočanje ali spreminjanje vrstice stanja"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Aplikacijam omogoča onemogočenje vrstice stanja ali dodajanje in odstranjevanje ikon sistema."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"postane vrstica stanja"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 55405d5..1f42949 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Nxirr një pamje të ekranit"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Mund të nxjerrë një pamje e ekranit."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Versioni paraprak, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"çaktivizo ose modifiko shiritin e statusit"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Lejon aplikacionin të çaktivizojë shiritin e statusit dhe të heqë ikonat e sistemit."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"të bëhet shiriti i statusit"</string>
@@ -828,7 +830,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"Cakto rregullat e fjalëkalimit"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrollo gjatësinë dhe karakteret e lejuara në fjalëkalimet dhe kodet PIN të kyçjes së ekranit."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"Monitoron tentativat e shkyçjes së ekranit"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Monitoro numrin e fjalëkalimeve të shkruar gabim kur shkyç ekranin. Kyç tabletin ose fshi të gjitha të dhënat e tij, nëse shkruhen shumë fjalëkalime të pasakta."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Monitoro numrin e fjalëkalimeve të shkruara gabim kur shkyç ekranin. Kyç tabletin ose fshi të gjitha të dhënat e tij, nëse shkruhen shumë fjalëkalime të pasakta."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Monitoro numrin e fjalëkalimeve të shkruara gabim kur shkyç ekranin dhe kyç pajisjen tënde Android TV ose spastro të gjitha të dhënat e pajisjes sate Android TV nëse shkruhen gabim shumë fjalëkalime."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Monitoro numrin e fjalëkalimeve të shkruara gabim kur shkyç ekranin dhe kyç sistemin info-argëtues ose spastro të gjitha të dhënat e tij nëse shkruhen shumë fjalëkalime të gabuara."</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Monitoron numrin e fjalëkalimeve të shkruar gabim kur shkyç ekranin. Kyç telefonin ose fshin të gjitha të dhënat e tij, nëse shkruhen shumë fjalëkalime të pasakta."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index f97b92e..6768e29 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -357,6 +357,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Направи снимак екрана"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Може да направи снимак екрана."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Преглед, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"онемогућавање или измена статусне траке"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Дозвољава апликацији да онемогући статусну траку или да додаје и уклања системске иконе."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"функционисање као статусна трака"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 4f5ad4a74..fb0caa9 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ta skärmbild"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan ta en skärmbild av skärmen."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Förhandsgranskar <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"inaktivera eller ändra statusfält"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Tillåter att appen inaktiverar statusfältet eller lägger till och tar bort systemikoner."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"visas i statusfältet"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 175cf2f..89ded88 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Piga picha ya skrini"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Inaweza kupiga picha ya skrini ya onyesho."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Onyesho la kukagua, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"zima au rekebisha mwambaa hali"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Inaruhusu programu kulemaza upau wa hali au kuongeza na kutoa aikoni za mfumo."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"kuwa sehemu ya arifa"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index b5706d6..1c65e61 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ஸ்கிரீன்ஷாட்டை எடுக்கும்"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"டிஸ்ப்ளேவை ஸ்கிரீன்ஷாட் எடுக்க முடியும்."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"மாதிரிக்காட்சி, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"நிலைப் பட்டியை முடக்குதல் அல்லது மாற்றுதல்"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"நிலைப் பட்டியை முடக்க அல்லது முறைமையில் ஐகான்களைச் சேர்க்க மற்றும் அகற்ற ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"நிலைப் பட்டியில் இருக்கும்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 51461f9..423cf88 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"స్క్రీన్షాట్ను తీయండి"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"డిస్ప్లే యొక్క స్క్రీన్షాట్ తీసుకోవచ్చు."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"ప్రివ్యూ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"స్టేటస్ బార్ను డిజేబుల్ చేయడం లేదా మార్చడం"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"స్టేటస్ బార్ను డిజేబుల్ చేయడానికి లేదా సిస్టమ్ చిహ్నాలను జోడించడానికి మరియు తీసివేయడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"స్టేటస్ పట్టీగా ఉండటం"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 3dc46e0..47d1c44 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ถ่ายภาพหน้าจอ"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ถ่ายภาพหน้าจอได้"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"ตัวอย่าง <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"ปิดการใช้งานหรือแก้ไขแถบสถานะ"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"อนุญาตให้แอปพลิเคชันปิดใช้งานแถบสถานะหรือเพิ่มและนำไอคอนระบบออก"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"เป็นแถบสถานะ"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 58ab9f8..1f9b48f 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Kumuha ng screenshot"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puwedeng kumuha ng screenshot ng display."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"i-disable o baguhin ang status bar"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Pinapayagan ang app na i-disable ang status bar o magdagdag at mag-alis ng mga icon ng system."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"maging status bar"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 4b12e87..60c4a70 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ekran görüntüsü al"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Ekran görüntüsü alınabilir."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Önizleme, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"durum çubuğunu devre dışı bırak veya değiştir"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Uygulamaya, durum çubuğunu devre dışı bırakma ve sistem simgelerini ekleyip kaldırma izni verir."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"durum çubuğunda olma"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 62623c8..f8f3a23 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -358,6 +358,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Робити знімки екрана"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Може робити знімки екрана."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> (попередній перегляд)"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"вимикати чи змін. рядок стану"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Дозволяє програмі вимикати рядок стану чи додавати та видаляти піктограми системи."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"відображатися як рядок стану"</string>
@@ -830,7 +832,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"Устан. правила пароля"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"Укажіть максимальну довжину та кількість символів для паролів розблокування екрана та PIN-кодів."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"Відстежувати спроби розблокування екрана"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Відстежувати кількість неправильних паролів, введених під час розблокування екрана, і блокувати планшетний ПК або стирати всі його дані, якщо введено забагато неправильних паролів."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Відстежувати кількість неправильних паролів, введених під час розблокування екрана, і блокувати планшет або стирати всі його дані, якщо введено забагато неправильних паролів."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Відстежуйте кількість неправильних паролів, введених під час розблокування екрана. Блокуйте пристрій Android TV або стирайте всі його дані, якщо пароль введено неправильно забагато разів."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Відстежуйте кількість неправильних паролів, введених під час розблокування екрана, і блокуйте інформаційно-розважальну систему або видаляйте всі її дані, якщо пароль введено неправильно забагато разів."</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Відстежувати кількість неправильних паролів, введених під час розблокування екрана, і блокувати телефон або стирати всі його дані, якщо введено забагато неправильних паролів."</string>
@@ -843,7 +845,7 @@
<string name="policylab_forceLock" msgid="7360335502968476434">"Блокувати екран"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"Контролювати, як і коли блокується екран."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"Видаляти всі дані"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Стирати дані планшетного ПК без попередження, відновлюючи заводські налаштування."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Стирати дані планшета без попередження, відновлюючи заводські налаштування."</string>
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Видаляйте дані пристрою Android TV без попередження шляхом відновлення заводських налаштувань."</string>
<string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Видаляйте всі дані інформаційно-розважальної системи без попередження, відновлюючи заводські налаштування."</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Стирати дані телефона без попередження, відновивши заводські налаштування."</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 1dc3e67..a07189a 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"اسکرین شاٹ لیں"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ڈسپلے کا اسکرین شاٹ لیا جا سکتا ہے۔"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"پیش منظر، <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"اسٹیٹس بار کو غیر فعال یا اس میں ترمیم کریں"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"ایپ کو اسٹیٹس بار غیر فعال کرنے یا سسٹم آئیکنز شامل کرنے اور ہٹانے کی اجازت دیتا ہے۔"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"بطور اسٹیٹس بار کام لیں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 430e567..b66d8c7 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Skrinshot olish"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Ekrandan skrinshot olishi mumkin."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Razm solish, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"holat panelini o‘zgartirish yoki o‘chirish"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Ilova holat panelini o‘chirib qo‘yishi hamda tizim ikonkalarini qo‘shishi yoki olib tashlashi mumkin."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"holat qatorida ko‘rinishi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index aeb9a39..e4aadac 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Chụp ảnh màn hình"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Có thể chụp ảnh màn hình."</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Bản xem trước, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"vô hiệu hóa hoặc sửa đổi thanh trạng thái"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Cho phép ứng dụng vô hiệu hóa thanh trạng thái hoặc thêm và xóa biểu tượng hệ thống."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"trở thành thanh trạng thái"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 9c5bb61..ac4681b 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"截取屏幕截图"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"可截取显示画面的屏幕截图。"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"预览,<xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"停用或修改状态栏"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"允许应用停用状态栏或者增删系统图标。"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"用作状态栏"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 4471cf0..1b1a9d5 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"擷取螢幕擷圖"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"可以擷取螢幕截圖。"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"預覽,<xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"停用或修改狀態列"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"允許應用程式停用狀態列,並可新增或移除系統圖示。"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"成為狀態列"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 0aa451a..76ed403 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"擷取螢幕畫面"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"可以擷取螢幕畫面。"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"預覽,<xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"停用或變更狀態列"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"允許應用程式停用狀態列,並可新增或移除系統圖示。"</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"以狀態列顯示"</string>
@@ -828,7 +830,7 @@
<string name="policylab_limitPassword" msgid="4851829918814422199">"設定密碼規則"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"管理螢幕鎖定密碼和 PIN 碼支援的字元和長度上限。"</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"監控螢幕解鎖嘗試次數"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"監控螢幕解鎖時密碼輸入錯誤的次數;如果密碼輸入錯誤的次數過多,則會鎖住平板電腦或全部清除平板電腦中的資料。"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"監控螢幕解鎖時密碼輸入錯誤的次數;如果錯誤次數過多,會鎖住平板電腦或清除平板電腦的所有資料。"</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"監控螢幕解鎖密碼輸入錯誤的次數。如果輸入錯誤的次數超過上限,系統會將 Android TV 裝置鎖定,或清除 Android TV 裝置的所有資料。"</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"監控密碼輸入錯誤的次數。解鎖螢幕時,如果密碼輸入錯誤次數過多,系統就會鎖住資訊娛樂系統或清除資訊娛樂系統的所有資料。"</string>
<string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"監控螢幕解鎖時密碼輸入錯誤的次數;如果密碼輸入錯誤的次數過多,則會鎖住手機或清除手機的所有資料。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index e80052a..b44d5cd 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -356,6 +356,8 @@
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Thatha isithombe-skrini"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Ingathatha isithombe-skrini sesiboniso"</string>
<string name="dream_preview_title" msgid="5570751491996100804">"Hlola kuqala, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for dream_accessibility_action_click (7392398629967797805) -->
+ <skip />
<string name="permlab_statusBar" msgid="8798267849526214017">"khubaza noma guqula ibha yomumo"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Ivumela uhlelo lokusebenza ukuthi yenze umudwa ochaza ngesimo ukuthi ungasebenzi noma ukufaka noma ukukhipha izithonjana zohlelo."</string>
<string name="permlab_statusBarService" msgid="2523421018081437981">"yiba yibha yesimo"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 3d4db80..37d39a7 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -4477,8 +4477,8 @@
</declare-styleable>
<!-- Specify one or more <code>polling-loop-filter</code> elements inside a
- <code>host-apdu-service</code> to indicate polling loop frames that
- your service can handle. -->
+ <code>host-apdu-service</code> or <code>offhost-apdu-service</code> to indicate polling
+ loop frames that your service can handle. -->
<!-- @FlaggedApi("android.nfc.nfc_read_polling_loop") -->
<declare-styleable name="PollingLoopFilter">
<!-- The polling loop frame. This attribute is mandatory. -->
@@ -4490,8 +4490,8 @@
</declare-styleable>
<!-- Specify one or more <code>polling-loop-pattern-filter</code> elements inside a
- <code>host-apdu-service</code> to indicate polling loop frames that
- your service can handle. -->
+ <code>host-apdu-service</code> or <code>offhost-apdu-service</code> to indicate polling
+ loop frames that your service can handle. -->
<!-- @FlaggedApi("android.nfc.nfc_read_polling_loop") -->
<declare-styleable name="PollingLoopPatternFilter">
<!-- The patter to match polling loop frames to, must to be compatible with
diff --git a/core/res/res/values/config_battery_stats.xml b/core/res/res/values/config_battery_stats.xml
index ae47899..8d97362 100644
--- a/core/res/res/values/config_battery_stats.xml
+++ b/core/res/res/values/config_battery_stats.xml
@@ -35,6 +35,9 @@
<!-- Mobile Radio power stats collection throttle period in milliseconds. -->
<integer name="config_defaultPowerStatsThrottlePeriodMobileRadio">3600000</integer>
+ <!-- Mobile Radio power stats collection throttle period in milliseconds. -->
+ <integer name="config_defaultPowerStatsThrottlePeriodWifi">3600000</integer>
+
<!-- PowerStats aggregation period in milliseconds. This is the interval at which the power
stats aggregation procedure is performed and the results stored in PowerStatsStore. -->
<integer name="config_powerStatsAggregationPeriod">14400000</integer>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 60289c1..e96240d 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1018,6 +1018,9 @@
<!-- The title to use when a dream is opened in preview mode. [CHAR LIMIT=NONE] -->
<string name="dream_preview_title">Preview, <xliff:g id="dream_name" example="Clock">%1$s</xliff:g></string>
+ <!-- The title to use when a dream is open in accessibility mode to let users know to double tap to dismiss the dream [CHAR LIMIT=32] -->
+ <string name="dream_accessibility_action_click">dismiss</string>
+
<!-- Permissions -->
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ead5827..1e5c5d9 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1528,6 +1528,7 @@
<java-symbol type="layout" name="number_picker" />
<java-symbol type="layout" name="permissions_package_list_item" />
<java-symbol type="layout" name="popup_menu_item_layout" />
+ <java-symbol type="layout" name="popup_menu_item_layout_material" />
<java-symbol type="layout" name="popup_menu_header_item_layout" />
<java-symbol type="layout" name="remote_views_adapter_default_loading_view" />
<java-symbol type="layout" name="search_bar" />
@@ -2337,6 +2338,7 @@
<java-symbol type="layout" name="notification_material_action_tombstone" />
<java-symbol type="layout" name="notification_template_material_base" />
<java-symbol type="layout" name="notification_template_material_heads_up_base" />
+ <java-symbol type="layout" name="notification_template_material_compact_heads_up_base" />
<java-symbol type="layout" name="notification_template_material_big_base" />
<java-symbol type="layout" name="notification_template_material_big_picture" />
<java-symbol type="layout" name="notification_template_material_inbox" />
@@ -4471,6 +4473,7 @@
<java-symbol type="string" name="capability_title_canTakeScreenshot" />
<java-symbol type="string" name="dream_preview_title" />
+ <java-symbol type="string" name="dream_accessibility_action_click" />
<java-symbol type="string" name="config_servicesExtensionPackage" />
@@ -5218,6 +5221,7 @@
<java-symbol type="bool" name="config_batteryStatsResetOnUnplugAfterSignificantCharge" />
<java-symbol type="integer" name="config_defaultPowerStatsThrottlePeriodCpu" />
<java-symbol type="integer" name="config_defaultPowerStatsThrottlePeriodMobileRadio" />
+ <java-symbol type="integer" name="config_defaultPowerStatsThrottlePeriodWifi" />
<java-symbol type="integer" name="config_powerStatsAggregationPeriod" />
<java-symbol type="integer" name="config_aggregatedPowerStatsSpanDuration" />
@@ -5380,6 +5384,7 @@
<java-symbol type="string" name="satellite_notification_open_message" />
<java-symbol type="string" name="satellite_notification_how_it_works" />
<java-symbol type="drawable" name="ic_satellite_alt_24px" />
+ <java-symbol type="drawable" name="ic_android_satellite_24px" />
<!-- DisplayManager configs. -->
<java-symbol type="bool" name="config_evenDimmerEnabled" />
diff --git a/core/tests/coretests/src/android/database/DatabaseUtilsTest.java b/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
index c9cb2cc..e25fdf9 100644
--- a/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseUtilsTest.java
@@ -90,6 +90,12 @@
assertEquals(ddl, getSqlStatementType("ALTER TABLE t1 ADD COLUMN j int"));
assertEquals(ddl, getSqlStatementType("CREATE TABLE t1 (i int)"));
+ // Verify that the answers are case-insensitive
+ assertEquals(sel, getSqlStatementType("select"));
+ assertEquals(sel, getSqlStatementType("sElect"));
+ assertEquals(sel, getSqlStatementType("sELECT"));
+ assertEquals(sel, getSqlStatementType("seLECT"));
+
// Short statements, leading comments, and WITH are decoded to "other" in the public API.
final int othr = STATEMENT_OTHER;
assertEquals(othr, getSqlStatementType("SE"));
diff --git a/core/tests/coretests/src/android/view/ViewFrameRateTest.java b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
index 0bf9a4c..4b9aaae 100644
--- a/core/tests/coretests/src/android/view/ViewFrameRateTest.java
+++ b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
@@ -419,6 +419,7 @@
FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY
})
public void frameRateAndCategory() throws Throwable {
+ mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE);
waitForFrameRateCategoryToSettle();
mActivityRule.runOnUiThread(() -> {
mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_LOW);
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index ccebd03..20fb6e3 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -754,39 +754,39 @@
@RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_aggregate() {
- View mView1 = new View(sContext);
- attachViewToWindow(mView1);
- ViewRootImpl viewRootImpl = mView1.getViewRootImpl();
+ mView = new View(sContext);
+ attachViewToWindow(mView);
+ mViewRootImpl = mView.getViewRootImpl();
sInstrumentation.runOnMainSync(() -> {
assertEquals(FRAME_RATE_CATEGORY_DEFAULT,
- viewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.getPreferredFrameRateCategory());
});
// reset the frame rate category counts
for (int i = 0; i < 5; i++) {
sInstrumentation.runOnMainSync(() -> {
- mView1.setRequestedFrameRate(mView1.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE);
- mView1.invalidate();
+ mView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE);
+ mView.invalidate();
});
sInstrumentation.waitForIdleSync();
}
sInstrumentation.runOnMainSync(() -> {
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_LOW, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_LOW, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_NORMAL, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_NORMAL, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH_HINT, 0, null);
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_LOW, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_LOW, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_NORMAL, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_NORMAL, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH_HINT, 0, null);
assertEquals(FRAME_RATE_CATEGORY_HIGH_HINT,
- viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_HIGH, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH_HINT, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_HIGH, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_NORMAL, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_HIGH, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_LOW, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_HIGH, viewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_HIGH, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH_HINT, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_HIGH, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_NORMAL, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_HIGH, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_LOW, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_HIGH, mViewRootImpl.getPreferredFrameRateCategory());
});
}
@@ -947,8 +947,9 @@
mView.invalidate();
runAfterDraw(() -> {
if (toolkitFrameRateVelocityMappingReadOnly()) {
- assertEquals(FRAME_RATE_CATEGORY_LOW,
- mViewRootImpl.getLastPreferredFrameRateCategory());
+ int expected = toolkitFrameRateBySizeReadOnly()
+ ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
+ assertEquals(expected, mViewRootImpl.getLastPreferredFrameRateCategory());
assertTrue(mViewRootImpl.getLastPreferredFrameRate() >= 60f);
} else {
assertEquals(FRAME_RATE_CATEGORY_HIGH,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
index a67821b..0297901 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
@@ -288,13 +288,16 @@
/** Sets the position of the dot and badge, animating them out and back in if requested. */
void animateDotBadgePositions(boolean onLeft) {
- mOnLeft = onLeft;
-
- if (onLeft != getDotOnLeft() && shouldDrawDot()) {
- animateDotScale(0f /* showDot */, () -> {
- invalidate();
- animateDotScale(1.0f, null /* after */);
- });
+ if (onLeft != getDotOnLeft()) {
+ if (shouldDrawDot()) {
+ animateDotScale(0f /* showDot */, () -> {
+ mOnLeft = onLeft;
+ invalidate();
+ animateDotScale(1.0f, null /* after */);
+ });
+ } else {
+ mOnLeft = onLeft;
+ }
}
// TODO animate badge
showBadge();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
index 74f087b..4e8afcc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
@@ -68,6 +68,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.protolog.common.ProtoLog;
+import com.android.wm.shell.Flags;
import com.android.wm.shell.R;
import com.android.wm.shell.common.AlphaOptimizedButton;
import com.android.wm.shell.common.TriangleShape;
@@ -446,6 +447,8 @@
mManageButton.setVisibility(GONE);
} else {
mTaskView = bubbleTaskView.getTaskView();
+ // reset the insets that might left after TaskView is shown in BubbleBarExpandedView
+ mTaskView.setCaptionInsets(null);
bubbleTaskView.setDelegateListener(mTaskViewListener);
// set a fixed width so it is not recalculated as part of a rotation. the width will be
@@ -668,6 +671,11 @@
}
}
+ /** Sets the alpha for the pointer. */
+ public void setPointerAlpha(float alpha) {
+ mPointerView.setAlpha(alpha);
+ }
+
/**
* Get alpha from underlying {@code TaskView} if this view is for a bubble.
* Or get alpha for the overflow view if this view is for overflow.
@@ -698,12 +706,14 @@
}
}
- /**
- * Sets the alpha of the background and the pointer view.
- */
+ /** Sets the alpha of the background. */
public void setBackgroundAlpha(float alpha) {
- mPointerView.setAlpha(alpha);
- setAlpha(alpha);
+ if (Flags.enableNewBubbleAnimations()) {
+ setAlpha(alpha);
+ } else {
+ mPointerView.setAlpha(alpha);
+ setAlpha(alpha);
+ }
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 8da85d2..dcc536b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -2358,9 +2358,9 @@
} else {
index = getBubbleIndex(mExpandedBubble);
}
- PointF p = mPositioner.getExpandedBubbleXY(index, getState());
+ PointF bubbleXY = mPositioner.getExpandedBubbleXY(index, getState());
final float translationY = mPositioner.getExpandedViewY(mExpandedBubble,
- mPositioner.showBubblesVertically() ? p.y : p.x);
+ mPositioner.showBubblesVertically() ? bubbleXY.y : bubbleXY.x);
mExpandedViewContainer.setTranslationX(0f);
mExpandedViewContainer.setTranslationY(translationY);
mExpandedViewContainer.setAlpha(1f);
@@ -2371,40 +2371,42 @@
? mStackAnimationController.getStackPosition().y
: mStackAnimationController.getStackPosition().x;
final float bubbleWillBeAt = showVertically
- ? p.y
- : p.x;
+ ? bubbleXY.y
+ : bubbleXY.x;
final float distanceAnimated = Math.abs(bubbleWillBeAt - relevantStackPosition);
// Wait for the path animation target to reach its end, and add a small amount of extra time
// if the bubble is moving a lot horizontally.
- long startDelay = 0L;
+ final long startDelay;
// Should not happen since we lay out before expanding, but just in case...
if (getWidth() > 0) {
startDelay = (long)
(ExpandedAnimationController.EXPAND_COLLAPSE_TARGET_ANIM_DURATION * 1.2f
+ (distanceAnimated / getWidth()) * 30);
+ } else {
+ startDelay = 0L;
}
// Set the pivot point for the scale, so the expanded view animates out from the bubble.
if (showVertically) {
float pivotX;
if (mStackOnLeftOrWillBe) {
- pivotX = p.x + mBubbleSize + mExpandedViewPadding;
+ pivotX = bubbleXY.x + mBubbleSize + mExpandedViewPadding;
} else {
- pivotX = p.x - mExpandedViewPadding;
+ pivotX = bubbleXY.x - mExpandedViewPadding;
}
mExpandedViewContainerMatrix.setScale(
1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT,
1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT,
pivotX,
- p.y + mBubbleSize / 2f);
+ bubbleXY.y + mBubbleSize / 2f);
} else {
mExpandedViewContainerMatrix.setScale(
1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT,
1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT,
- p.x + mBubbleSize / 2f,
- p.y + mBubbleSize + mExpandedViewPadding);
+ bubbleXY.x + mBubbleSize / 2f,
+ bubbleXY.y + mBubbleSize + mExpandedViewPadding);
}
mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java
index b87c2f6..7ceaaea 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java
@@ -125,6 +125,7 @@
private @Nullable Runnable mOnMinimalSizeChangeCallback;
private @Nullable TriConsumer<Boolean, Integer, Boolean> mOnShelfVisibilityChangeCallback;
private List<Consumer<Rect>> mOnPipExclusionBoundsChangeCallbacks = new ArrayList<>();
+ private List<Consumer<Float>> mOnAspectRatioChangedCallbacks = new ArrayList<>();
// the size of the current bounds relative to the max size spec
private float mBoundsScale;
@@ -297,7 +298,12 @@
/** Set the PIP aspect ratio. */
public void setAspectRatio(float aspectRatio) {
- mAspectRatio = aspectRatio;
+ if (Float.compare(mAspectRatio, aspectRatio) != 0) {
+ mAspectRatio = aspectRatio;
+ for (Consumer<Float> callback : mOnAspectRatioChangedCallbacks) {
+ callback.accept(mAspectRatio);
+ }
+ }
}
/** Get the PIP aspect ratio. */
@@ -527,6 +533,23 @@
mOnPipExclusionBoundsChangeCallbacks.remove(onPipExclusionBoundsChangeCallback);
}
+ /** Adds callback to listen on aspect ratio change. */
+ public void addOnAspectRatioChangedCallback(
+ @NonNull Consumer<Float> onAspectRatioChangedCallback) {
+ if (!mOnAspectRatioChangedCallbacks.contains(onAspectRatioChangedCallback)) {
+ mOnAspectRatioChangedCallbacks.add(onAspectRatioChangedCallback);
+ onAspectRatioChangedCallback.accept(mAspectRatio);
+ }
+ }
+
+ /** Removes callback to listen on aspect ratio change. */
+ public void removeOnAspectRatioChangedCallback(
+ @NonNull Consumer<Float> onAspectRatioChangedCallback) {
+ if (mOnAspectRatioChangedCallbacks.contains(onAspectRatioChangedCallback)) {
+ mOnAspectRatioChangedCallbacks.remove(onAspectRatioChangedCallback);
+ }
+ }
+
public LauncherState getLauncherState() {
return mLauncherState;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
index 73228de..6834e6d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
@@ -107,6 +107,7 @@
import com.android.wm.shell.taskview.TaskViewFactoryController;
import com.android.wm.shell.taskview.TaskViewTransitions;
import com.android.wm.shell.transition.HomeTransitionObserver;
+import com.android.wm.shell.transition.MixedTransitionHandler;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
import com.android.wm.shell.unfold.UnfoldAnimationController;
@@ -675,6 +676,22 @@
return new TaskViewTransitions(transitions);
}
+ // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
+ @BindsOptionalOf
+ @DynamicOverride
+ abstract MixedTransitionHandler optionalMixedTransitionHandler();
+
+ @WMSingleton
+ @Provides
+ static Optional<MixedTransitionHandler> provideMixedTransitionHandler(
+ @DynamicOverride Optional<MixedTransitionHandler> mixedTransitionHandler
+ ) {
+ if (mixedTransitionHandler.isPresent()) {
+ return mixedTransitionHandler;
+ }
+ return Optional.empty();
+ }
+
//
// Keyguard transitions (optional feature)
//
@@ -934,6 +951,7 @@
Optional<OneHandedController> oneHandedControllerOptional,
Optional<HideDisplayCutoutController> hideDisplayCutoutControllerOptional,
Optional<ActivityEmbeddingController> activityEmbeddingOptional,
+ Optional<MixedTransitionHandler> mixedTransitionHandler,
Transitions transitions,
StartingWindowController startingWindow,
ProtoLogController protoLogController,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
index 26e7acb..b574b81 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
@@ -87,6 +87,7 @@
import com.android.wm.shell.taskview.TaskViewTransitions;
import com.android.wm.shell.transition.DefaultMixedHandler;
import com.android.wm.shell.transition.HomeTransitionObserver;
+import com.android.wm.shell.transition.MixedTransitionHandler;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
import com.android.wm.shell.unfold.UnfoldAnimationController;
@@ -373,8 +374,9 @@
//
@WMSingleton
+ @DynamicOverride
@Provides
- static DefaultMixedHandler provideDefaultMixedHandler(
+ static MixedTransitionHandler provideMixedTransitionHandler(
ShellInit shellInit,
Optional<SplitScreenController> splitScreenOptional,
@Nullable PipTransitionController pipTransitionController,
@@ -655,7 +657,6 @@
@Provides
static Object provideIndependentShellComponentsToCreate(
DragAndDropController dragAndDropController,
- DefaultMixedHandler defaultMixedHandler,
Optional<DesktopTasksTransitionObserver> desktopTasksTransitionObserverOptional) {
return new Object();
}
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 57cf992..e885262 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
@@ -597,6 +597,17 @@
return;
}
+ if (mPipTransitionState.isEnteringPip()
+ && !mPipTransitionState.getInSwipePipToHomeTransition()) {
+ // If we are still entering PiP with Shell playing enter animation, jump-cut to
+ // the end of the enter animation and reschedule exitPip to run after enter-PiP
+ // has finished its transition and allowed the client to draw in PiP mode.
+ mPipTransitionController.end(() -> {
+ exitPip(animationDurationMs, requestEnterSplit);
+ });
+ return;
+ }
+
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
"exitPip: %s, state=%s", mTaskInfo.topActivity, mPipTransitionState);
final WindowContainerTransaction wct = new WindowContainerTransaction();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
index 10b7619..fdde3ee 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
@@ -43,7 +43,6 @@
import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP_TO_SPLIT;
import static com.android.wm.shell.transition.Transitions.TRANSIT_REMOVE_PIP;
-import android.animation.Animator;
import android.annotation.IntDef;
import android.app.ActivityManager;
import android.app.TaskInfo;
@@ -348,9 +347,16 @@
@Override
public void end() {
- Animator animator = mPipAnimationController.getCurrentAnimator();
- if (animator != null && animator.isRunning()) {
- animator.end();
+ end(null);
+ }
+
+ @Override
+ public void end(@Nullable Runnable onTransitionEnd) {
+ if (mPipAnimationController.isAnimating()) {
+ mPipAnimationController.getCurrentAnimator().end();
+ }
+ if (onTransitionEnd != null) {
+ onTransitionEnd.run();
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
index 32442f7..4f71a02 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
@@ -305,6 +305,14 @@
public void end() {
}
+ /**
+ * End the currently-playing PiP animation.
+ *
+ * @param onTransitionEnd callback to run upon finishing the playing transition.
+ */
+ public void end(@Nullable Runnable onTransitionEnd) {
+ }
+
/** Starts the {@link android.window.SystemPerformanceHinter.HighPerfSession}. */
public void startHighPerfSession() {}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
index c1adfff..d8ac8e9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
@@ -219,6 +219,7 @@
mMotionHelper, pipTaskOrganizer, mPipBoundsAlgorithm.getSnapAlgorithm(),
this::onAccessibilityShowMenu, this::updateMovementBounds,
this::animateToUnStashedState, mainExecutor);
+ mPipBoundsState.addOnAspectRatioChangedCallback(this::updateMinMaxSize);
// TODO(b/181599115): This should really be initializes as part of the pip controller, but
// until all PIP implementations derive from the controller, just initialize the touch handler
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java
index cc8e3e0..472003c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java
@@ -208,6 +208,7 @@
new PipResizeGestureHandler(context, pipBoundsAlgorithm, pipBoundsState,
mTouchState, this::updateMovementBounds, pipUiEventLogger,
menuController, mainExecutor, mPipPerfHintController);
+ mPipBoundsState.addOnAspectRatioChangedCallback(this::updateMinMaxSize);
if (PipUtils.isPip2ExperimentEnabled()) {
shellInit.addInitCallback(this::onInit, this);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
index 8746b8c..4bc0dc0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
@@ -61,9 +61,10 @@
/**
* A handler for dealing with transitions involving multiple other handlers. For example: an
- * activity in split-screen going into PiP.
+ * activity in split-screen going into PiP. Note this is provided as a handset-specific
+ * implementation of {@code MixedTransitionHandler}.
*/
-public class DefaultMixedHandler implements Transitions.TransitionHandler,
+public class DefaultMixedHandler implements MixedTransitionHandler,
RecentsTransitionHandler.RecentsMixedHandler {
private final Transitions mPlayer;
@@ -116,7 +117,7 @@
final IBinder mTransition;
protected final Transitions mPlayer;
- protected final DefaultMixedHandler mMixedHandler;
+ protected final MixedTransitionHandler mMixedHandler;
protected final PipTransitionController mPipHandler;
protected final StageCoordinator mSplitHandler;
protected final KeyguardTransitionHandler mKeyguardHandler;
@@ -142,7 +143,7 @@
int mInFlightSubAnimations = 0;
MixedTransition(int type, IBinder transition, Transitions player,
- DefaultMixedHandler mixedHandler, PipTransitionController pipHandler,
+ MixedTransitionHandler mixedHandler, PipTransitionController pipHandler,
StageCoordinator splitHandler, KeyguardTransitionHandler keyguardHandler) {
mType = type;
mTransition = transition;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java
index e9cd73b..b028bd6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java
@@ -41,7 +41,7 @@
private final ActivityEmbeddingController mActivityEmbeddingController;
DefaultMixedTransition(int type, IBinder transition, Transitions player,
- DefaultMixedHandler mixedHandler, PipTransitionController pipHandler,
+ MixedTransitionHandler mixedHandler, PipTransitionController pipHandler,
StageCoordinator splitHandler, KeyguardTransitionHandler keyguardHandler,
UnfoldTransitionHandler unfoldHandler,
ActivityEmbeddingController activityEmbeddingController) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHandler.java
new file mode 100644
index 0000000..ff429fb
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHandler.java
@@ -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.wm.shell.transition;
+
+/**
+ * Interface for a {@link Transitions.TransitionHandler} that can take the subset of transitions
+ * that it handles and further decompose those transitions into sub-transitions which can be
+ * independently delegated to separate handlers.
+ */
+public interface MixedTransitionHandler extends Transitions.TransitionHandler {
+
+ // TODO(b/335685449) this currently exists purely as a marker interface for use in form-factor
+ // specific/sysui dagger modules. Going forward, we should define this in a meaningful
+ // way so as to provide a clear basis for expectations/behaviours associated with mixed
+ // transitions and their default handlers.
+
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHelper.java
index 0974cd1..ffc0b76 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/MixedTransitionHelper.java
@@ -44,7 +44,7 @@
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction,
@NonNull Transitions.TransitionFinishCallback finishCallback,
- @NonNull Transitions player, @NonNull DefaultMixedHandler mixedHandler,
+ @NonNull Transitions player, @NonNull MixedTransitionHandler mixedHandler,
@NonNull PipTransitionController pipHandler, @NonNull StageCoordinator splitHandler) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Animating a mixed transition for "
+ "entering PIP while Split-Screen is foreground.");
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RecentsMixedTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RecentsMixedTransition.java
index 5b402a5..d6e64cf 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RecentsMixedTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RecentsMixedTransition.java
@@ -43,7 +43,7 @@
private final DesktopTasksController mDesktopTasksController;
RecentsMixedTransition(int type, IBinder transition, Transitions player,
- DefaultMixedHandler mixedHandler, PipTransitionController pipHandler,
+ MixedTransitionHandler mixedHandler, PipTransitionController pipHandler,
StageCoordinator splitHandler, KeyguardTransitionHandler keyguardHandler,
RecentsTransitionHandler recentsHandler,
DesktopTasksController desktopTasksController) {
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/CloseAllAppWithAppHeaderExitLandscape.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/CloseAllAppWithAppHeaderExitLandscape.kt
new file mode 100644
index 0000000..5563bb9
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/CloseAllAppWithAppHeaderExitLandscape.kt
@@ -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.wm.shell.flicker.service.desktopmode.flicker
+
+import android.tools.Rotation
+import android.tools.flicker.FlickerConfig
+import android.tools.flicker.annotation.ExpectedScenarios
+import android.tools.flicker.annotation.FlickerConfigProvider
+import android.tools.flicker.config.FlickerConfig
+import android.tools.flicker.config.FlickerServiceConfig
+import android.tools.flicker.junit.FlickerServiceJUnit4ClassRunner
+import com.android.wm.shell.flicker.service.desktopmode.flicker.DesktopModeFlickerScenarios.Companion.CLOSE_APP
+import com.android.wm.shell.flicker.service.desktopmode.flicker.DesktopModeFlickerScenarios.Companion.CLOSE_LAST_APP
+import com.android.wm.shell.flicker.service.desktopmode.scenarios.CloseAllAppsWithAppHeaderExit
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(FlickerServiceJUnit4ClassRunner::class)
+class CloseAllAppWithAppHeaderExitLandscape : CloseAllAppsWithAppHeaderExit(Rotation.ROTATION_90) {
+ @ExpectedScenarios(["CLOSE_APP", "CLOSE_LAST_APP"])
+ @Test
+ override fun closeAllAppsInDesktop() = super.closeAllAppsInDesktop()
+
+ companion object {
+ @JvmStatic
+ @FlickerConfigProvider
+ fun flickerConfigProvider(): FlickerConfig =
+ FlickerConfig()
+ .use(FlickerServiceConfig.DEFAULT)
+ .use(CLOSE_APP)
+ .use(CLOSE_LAST_APP)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/CloseAllAppWithAppHeaderExitPortrait.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/CloseAllAppWithAppHeaderExitPortrait.kt
new file mode 100644
index 0000000..3d16d2219
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/CloseAllAppWithAppHeaderExitPortrait.kt
@@ -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.wm.shell.flicker.service.desktopmode.flicker
+
+import android.tools.Rotation
+import android.tools.flicker.FlickerConfig
+import android.tools.flicker.annotation.ExpectedScenarios
+import android.tools.flicker.annotation.FlickerConfigProvider
+import android.tools.flicker.config.FlickerConfig
+import android.tools.flicker.config.FlickerServiceConfig
+import android.tools.flicker.junit.FlickerServiceJUnit4ClassRunner
+import com.android.wm.shell.flicker.service.desktopmode.flicker.DesktopModeFlickerScenarios.Companion.CLOSE_APP
+import com.android.wm.shell.flicker.service.desktopmode.flicker.DesktopModeFlickerScenarios.Companion.CLOSE_LAST_APP
+import com.android.wm.shell.flicker.service.desktopmode.scenarios.CloseAllAppsWithAppHeaderExit
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(FlickerServiceJUnit4ClassRunner::class)
+class CloseAllAppWithAppHeaderExitPortrait : CloseAllAppsWithAppHeaderExit(Rotation.ROTATION_0) {
+ @ExpectedScenarios(["CLOSE_APP", "CLOSE_LAST_APP"])
+ @Test
+ override fun closeAllAppsInDesktop() = super.closeAllAppsInDesktop()
+
+ companion object {
+ @JvmStatic
+ @FlickerConfigProvider
+ fun flickerConfigProvider(): FlickerConfig =
+ FlickerConfig()
+ .use(FlickerServiceConfig.DEFAULT)
+ .use(CLOSE_APP)
+ .use(CLOSE_LAST_APP)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/DesktopModeFlickerScenarios.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/DesktopModeFlickerScenarios.kt
new file mode 100644
index 0000000..75dfeba
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/DesktopModeFlickerScenarios.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.wm.shell.flicker.service.desktopmode.flicker
+
+import android.tools.flicker.AssertionInvocationGroup
+import android.tools.flicker.assertors.assertions.AppLayerIsInvisibleAtEnd
+import android.tools.flicker.assertors.assertions.AppLayerIsVisibleAlways
+import android.tools.flicker.assertors.assertions.AppLayerIsVisibleAtStart
+import android.tools.flicker.assertors.assertions.AppWindowHasDesktopModeInitialBoundsAtTheEnd
+import android.tools.flicker.assertors.assertions.AppWindowOnTopAtEnd
+import android.tools.flicker.assertors.assertions.AppWindowOnTopAtStart
+import android.tools.flicker.assertors.assertions.LauncherWindowMovesToTop
+import android.tools.flicker.config.AssertionTemplates
+import android.tools.flicker.config.FlickerConfigEntry
+import android.tools.flicker.config.ScenarioId
+import android.tools.flicker.config.desktopmode.Components
+import android.tools.flicker.extractors.ITransitionMatcher
+import android.tools.flicker.extractors.ShellTransitionScenarioExtractor
+import android.tools.traces.wm.Transition
+import android.tools.traces.wm.TransitionType
+
+class DesktopModeFlickerScenarios {
+ companion object {
+ val END_DRAG_TO_DESKTOP =
+ FlickerConfigEntry(
+ scenarioId = ScenarioId("END_DRAG_TO_DESKTOP"),
+ extractor =
+ ShellTransitionScenarioExtractor(
+ transitionMatcher =
+ object : ITransitionMatcher {
+ override fun findAll(
+ transitions: Collection<Transition>
+ ): Collection<Transition> {
+ return transitions.filter {
+ it.type == TransitionType.DESKTOP_MODE_END_DRAG_TO_DESKTOP
+ }
+ }
+ }
+ ),
+ assertions =
+ AssertionTemplates.COMMON_ASSERTIONS +
+ listOf(
+ AppLayerIsVisibleAlways(Components.DESKTOP_MODE_APP),
+ AppWindowOnTopAtEnd(Components.DESKTOP_MODE_APP),
+ AppWindowHasDesktopModeInitialBoundsAtTheEnd(
+ Components.DESKTOP_MODE_APP
+ )
+ )
+ .associateBy({ it }, { AssertionInvocationGroup.BLOCKING }),
+ )
+
+ val CLOSE_APP =
+ FlickerConfigEntry(
+ scenarioId = ScenarioId("CLOSE_APP"),
+ extractor =
+ ShellTransitionScenarioExtractor(
+ transitionMatcher =
+ object : ITransitionMatcher {
+ override fun findAll(
+ transitions: Collection<Transition>
+ ): Collection<Transition> {
+ return transitions.filter { it.type == TransitionType.CLOSE }
+ }
+ }
+ ),
+ assertions =
+ AssertionTemplates.COMMON_ASSERTIONS +
+ listOf(
+ AppWindowOnTopAtStart(Components.DESKTOP_MODE_APP),
+ AppLayerIsVisibleAtStart(Components.DESKTOP_MODE_APP),
+ AppLayerIsInvisibleAtEnd(Components.DESKTOP_MODE_APP),
+ )
+ .associateBy({ it }, { AssertionInvocationGroup.BLOCKING }),
+ )
+
+ val CLOSE_LAST_APP =
+ FlickerConfigEntry(
+ scenarioId = ScenarioId("CLOSE_LAST_APP"),
+ extractor =
+ ShellTransitionScenarioExtractor(
+ transitionMatcher =
+ object : ITransitionMatcher {
+ override fun findAll(
+ transitions: Collection<Transition>
+ ): Collection<Transition> {
+ val lastTransition =
+ transitions.findLast { it.type == TransitionType.CLOSE }
+ return if (lastTransition != null) listOf(lastTransition)
+ else emptyList()
+ }
+ }
+ ),
+ assertions =
+ AssertionTemplates.COMMON_ASSERTIONS +
+ listOf(
+ AppWindowOnTopAtStart(Components.DESKTOP_MODE_APP),
+ AppLayerIsVisibleAtStart(Components.DESKTOP_MODE_APP),
+ AppLayerIsInvisibleAtEnd(Components.DESKTOP_MODE_APP),
+ LauncherWindowMovesToTop()
+ )
+ .associateBy({ it }, { AssertionInvocationGroup.BLOCKING }),
+ )
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/EnterDesktopWithDragLandscape.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/EnterDesktopWithDragLandscape.kt
index 4c781d3..9dfafe9 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/EnterDesktopWithDragLandscape.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/EnterDesktopWithDragLandscape.kt
@@ -17,58 +17,28 @@
package com.android.wm.shell.flicker.service.desktopmode.flicker
import android.tools.Rotation
-import android.tools.flicker.AssertionInvocationGroup
import android.tools.flicker.FlickerConfig
import android.tools.flicker.annotation.ExpectedScenarios
import android.tools.flicker.annotation.FlickerConfigProvider
-import android.tools.flicker.assertors.assertions.AppLayerIsVisibleAlways
-import android.tools.flicker.assertors.assertions.AppWindowHasDesktopModeInitialBoundsAtTheEnd
-import android.tools.flicker.assertors.assertions.AppWindowOnTopAtEnd
-import android.tools.flicker.config.AssertionTemplates
import android.tools.flicker.config.FlickerConfig
-import android.tools.flicker.config.FlickerConfigEntry
import android.tools.flicker.config.FlickerServiceConfig
-import android.tools.flicker.config.ScenarioId
-import android.tools.flicker.config.desktopmode.Components
-import android.tools.flicker.extractors.ITransitionMatcher
-import android.tools.flicker.extractors.ShellTransitionScenarioExtractor
import android.tools.flicker.junit.FlickerServiceJUnit4ClassRunner
-import android.tools.traces.wm.Transition
-import android.tools.traces.wm.TransitionType
+import com.android.wm.shell.flicker.service.desktopmode.flicker.DesktopModeFlickerScenarios.Companion.END_DRAG_TO_DESKTOP
import com.android.wm.shell.flicker.service.desktopmode.scenarios.EnterDesktopWithDrag
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(FlickerServiceJUnit4ClassRunner::class)
class EnterDesktopWithDragLandscape : EnterDesktopWithDrag(Rotation.ROTATION_90) {
- @ExpectedScenarios(["END_DRAG_TO_DESKTOP"]) @Test override fun enterDesktopWithDrag() =
- super.enterDesktopWithDrag()
+ @ExpectedScenarios(["END_DRAG_TO_DESKTOP"])
+ @Test
+ override fun enterDesktopWithDrag() = super.enterDesktopWithDrag()
companion object {
- private val END_DRAG_TO_DESKTOP = FlickerConfigEntry(
- scenarioId = ScenarioId("END_DRAG_TO_DESKTOP"),
- extractor = ShellTransitionScenarioExtractor(
- transitionMatcher = object : ITransitionMatcher {
- override fun findAll(
- transitions: Collection<Transition>
- ): Collection<Transition> {
- return transitions.filter {
- it.type == TransitionType.DESKTOP_MODE_END_DRAG_TO_DESKTOP}
- }
- }),
- assertions = AssertionTemplates.COMMON_ASSERTIONS +
- listOf(
- AppLayerIsVisibleAlways(Components.DESKTOP_MODE_APP),
- AppWindowOnTopAtEnd(Components.DESKTOP_MODE_APP),
- AppWindowHasDesktopModeInitialBoundsAtTheEnd(Components.DESKTOP_MODE_APP)
- ).associateBy({ it }, { AssertionInvocationGroup.BLOCKING }),
- )
@JvmStatic
@FlickerConfigProvider
fun flickerConfigProvider(): FlickerConfig =
- FlickerConfig()
- .use(FlickerServiceConfig.DEFAULT)
- .use(END_DRAG_TO_DESKTOP)
+ FlickerConfig().use(FlickerServiceConfig.DEFAULT).use(END_DRAG_TO_DESKTOP)
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/EnterDesktopWithDragPortrait.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/EnterDesktopWithDragPortrait.kt
index d99d875..1c7d623 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/EnterDesktopWithDragPortrait.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/flicker/EnterDesktopWithDragPortrait.kt
@@ -17,58 +17,27 @@
package com.android.wm.shell.flicker.service.desktopmode.flicker
import android.tools.Rotation
-import android.tools.flicker.AssertionInvocationGroup
import android.tools.flicker.FlickerConfig
import android.tools.flicker.annotation.ExpectedScenarios
import android.tools.flicker.annotation.FlickerConfigProvider
-import android.tools.flicker.assertors.assertions.AppLayerIsVisibleAlways
-import android.tools.flicker.assertors.assertions.AppWindowHasDesktopModeInitialBoundsAtTheEnd
-import android.tools.flicker.assertors.assertions.AppWindowOnTopAtEnd
-import android.tools.flicker.config.AssertionTemplates
import android.tools.flicker.config.FlickerConfig
-import android.tools.flicker.config.FlickerConfigEntry
import android.tools.flicker.config.FlickerServiceConfig
-import android.tools.flicker.config.ScenarioId
-import android.tools.flicker.config.desktopmode.Components
-import android.tools.flicker.extractors.ITransitionMatcher
-import android.tools.flicker.extractors.ShellTransitionScenarioExtractor
import android.tools.flicker.junit.FlickerServiceJUnit4ClassRunner
-import android.tools.traces.wm.Transition
-import android.tools.traces.wm.TransitionType
+import com.android.wm.shell.flicker.service.desktopmode.flicker.DesktopModeFlickerScenarios.Companion.END_DRAG_TO_DESKTOP
import com.android.wm.shell.flicker.service.desktopmode.scenarios.EnterDesktopWithDrag
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(FlickerServiceJUnit4ClassRunner::class)
class EnterDesktopWithDragPortrait : EnterDesktopWithDrag(Rotation.ROTATION_0) {
- @ExpectedScenarios(["END_DRAG_TO_DESKTOP"]) @Test override fun enterDesktopWithDrag() =
- super.enterDesktopWithDrag()
+ @ExpectedScenarios(["END_DRAG_TO_DESKTOP"])
+ @Test
+ override fun enterDesktopWithDrag() = super.enterDesktopWithDrag()
companion object {
- private val END_DRAG_TO_DESKTOP = FlickerConfigEntry(
- scenarioId = ScenarioId("END_DRAG_TO_DESKTOP"),
- extractor = ShellTransitionScenarioExtractor(
- transitionMatcher = object : ITransitionMatcher {
- override fun findAll(
- transitions: Collection<Transition>
- ): Collection<Transition> {
- return transitions.filter {
- it.type == TransitionType.DESKTOP_MODE_END_DRAG_TO_DESKTOP}
- }
- }),
- assertions = AssertionTemplates.COMMON_ASSERTIONS +
- listOf(
- AppLayerIsVisibleAlways(Components.DESKTOP_MODE_APP),
- AppWindowOnTopAtEnd(Components.DESKTOP_MODE_APP),
- AppWindowHasDesktopModeInitialBoundsAtTheEnd(Components.DESKTOP_MODE_APP)
- ).associateBy({ it }, { AssertionInvocationGroup.BLOCKING }),
- )
-
@JvmStatic
@FlickerConfigProvider
fun flickerConfigProvider(): FlickerConfig =
- FlickerConfig()
- .use(FlickerServiceConfig.DEFAULT)
- .use(END_DRAG_TO_DESKTOP)
+ FlickerConfig().use(FlickerServiceConfig.DEFAULT).use(END_DRAG_TO_DESKTOP)
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/scenarios/CloseAllAppsWithAppHeaderExit.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/scenarios/CloseAllAppsWithAppHeaderExit.kt
new file mode 100644
index 0000000..0c2b501
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/scenarios/CloseAllAppsWithAppHeaderExit.kt
@@ -0,0 +1,77 @@
+/*
+ * 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.service.desktopmode.scenarios
+
+import android.app.Instrumentation
+import android.tools.NavBar
+import android.tools.Rotation
+import android.tools.traces.parsers.WindowManagerStateHelper
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import com.android.launcher3.tapl.LauncherInstrumentation
+import com.android.server.wm.flicker.helpers.DesktopModeAppHelper
+import com.android.server.wm.flicker.helpers.MailAppHelper
+import com.android.server.wm.flicker.helpers.NonResizeableAppHelper
+import com.android.server.wm.flicker.helpers.SimpleAppHelper
+import com.android.window.flags.Flags
+import com.android.wm.shell.flicker.service.common.Utils
+import org.junit.After
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+
+@Ignore("Base Test Class")
+abstract class CloseAllAppsWithAppHeaderExit
+@JvmOverloads
+constructor(val rotation: Rotation = Rotation.ROTATION_0) {
+
+ private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
+ private val tapl = LauncherInstrumentation()
+ private val wmHelper = WindowManagerStateHelper(instrumentation)
+ private val device = UiDevice.getInstance(instrumentation)
+ private val testApp = DesktopModeAppHelper(SimpleAppHelper(instrumentation))
+ private val mailApp = DesktopModeAppHelper(MailAppHelper(instrumentation))
+ private val nonResizeableApp = DesktopModeAppHelper(NonResizeableAppHelper(instrumentation))
+
+
+
+ @Rule @JvmField val testSetupRule = Utils.testSetupRule(NavBar.MODE_GESTURAL, rotation)
+
+ @Before
+ fun setup() {
+ Assume.assumeTrue(Flags.enableDesktopWindowingMode())
+ tapl.setEnableRotation(true)
+ tapl.setExpectedRotation(rotation.value)
+ testApp.enterDesktopWithDrag(wmHelper, device)
+ mailApp.launchViaIntent(wmHelper)
+ nonResizeableApp.launchViaIntent(wmHelper)
+ }
+
+ @Test
+ open fun closeAllAppsInDesktop() {
+ nonResizeableApp.closeDesktopApp(wmHelper, device)
+ mailApp.closeDesktopApp(wmHelper, device)
+ testApp.closeDesktopApp(wmHelper, device)
+ }
+
+ @After
+ fun teardown() {
+ testApp.exit(wmHelper)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/scenarios/EnterDesktopWithDrag.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/scenarios/EnterDesktopWithDrag.kt
index 0403b4f..9e9998e 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/scenarios/EnterDesktopWithDrag.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/desktopmode/scenarios/EnterDesktopWithDrag.kt
@@ -23,15 +23,18 @@
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.android.launcher3.tapl.LauncherInstrumentation
+import com.android.server.wm.flicker.helpers.DesktopModeAppHelper
import com.android.server.wm.flicker.helpers.SimpleAppHelper
+import com.android.window.flags.Flags
import com.android.wm.shell.flicker.service.common.Utils
-import com.android.wm.shell.flicker.utils.DesktopModeUtils
import org.junit.After
+import org.junit.Assume
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
+
@Ignore("Base Test Class")
abstract class EnterDesktopWithDrag
@JvmOverloads
@@ -41,19 +44,20 @@
private val tapl = LauncherInstrumentation()
private val wmHelper = WindowManagerStateHelper(instrumentation)
private val device = UiDevice.getInstance(instrumentation)
- private val testApp = SimpleAppHelper(instrumentation)
+ private val testApp = DesktopModeAppHelper(SimpleAppHelper(instrumentation))
@Rule @JvmField val testSetupRule = Utils.testSetupRule(NavBar.MODE_GESTURAL, rotation)
@Before
fun setup() {
+ Assume.assumeTrue(Flags.enableDesktopWindowingMode())
tapl.setEnableRotation(true)
tapl.setExpectedRotation(rotation.value)
}
@Test
open fun enterDesktopWithDrag() {
- DesktopModeUtils.enterDesktopWithDrag(wmHelper, device, testApp)
+ testApp.enterDesktopWithDrag(wmHelper, device)
}
@After
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/utils/DesktopModeUtils.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/utils/DesktopModeUtils.kt
deleted file mode 100644
index 345bc5e..0000000
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/utils/DesktopModeUtils.kt
+++ /dev/null
@@ -1,112 +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.flicker.utils
-
-import android.tools.device.apphelpers.StandardAppHelper
-import android.tools.helpers.SYSTEMUI_PACKAGE
-import android.tools.traces.component.IComponentMatcher
-import android.tools.traces.parsers.WindowManagerStateHelper
-import android.tools.traces.wm.WindowingMode
-import androidx.test.uiautomator.By
-import androidx.test.uiautomator.BySelector
-import androidx.test.uiautomator.UiDevice
-import androidx.test.uiautomator.Until
-
-/**
- * Provides a collection of utility functions for desktop mode testing.
- */
-object DesktopModeUtils {
- private const val TIMEOUT_MS = 3_000L
- private const val CAPTION = "desktop_mode_caption"
- private const val CAPTION_HANDLE = "caption_handle"
- private const val MAXIMIZE_BUTTON = "maximize_button_view"
-
- private val captionFullscreen: BySelector
- get() = By.res(SYSTEMUI_PACKAGE, CAPTION)
- private val captionHandle: BySelector
- get() = By.res(SYSTEMUI_PACKAGE, CAPTION_HANDLE)
- private val maximizeButton: BySelector
- get() = By.res(SYSTEMUI_PACKAGE, MAXIMIZE_BUTTON)
-
- /**
- * Wait for an app moved to desktop to finish its transition.
- */
- private fun waitForAppToMoveToDesktop(
- wmHelper: WindowManagerStateHelper,
- currentApp: IComponentMatcher,
- ) {
- wmHelper
- .StateSyncBuilder()
- .withWindowSurfaceAppeared(currentApp)
- .withFreeformApp(currentApp)
- .withAppTransitionIdle()
- .waitForAndVerify()
- }
-
- /**
- * Click maximise button on the app header for the given app.
- */
- fun maximiseDesktopApp(
- wmHelper: WindowManagerStateHelper,
- device: UiDevice,
- currentApp: StandardAppHelper
- ) {
- if (wmHelper.getWindow(currentApp)?.windowingMode
- != WindowingMode.WINDOWING_MODE_FREEFORM.value)
- error("expected a freeform window to maximise but window is not in freefrom mode")
-
- val maximizeButton =
- device.wait(Until.findObject(maximizeButton), TIMEOUT_MS)
- ?: error("Unable to find view $maximizeButton\n")
- maximizeButton.click()
- }
-
- /**
- * Move an app to Desktop by dragging the app handle at the top.
- */
- fun enterDesktopWithDrag(
- wmHelper: WindowManagerStateHelper,
- device: UiDevice,
- currentApp: StandardAppHelper,
- ) {
- currentApp.launchViaIntent(wmHelper)
- dragToDesktop(wmHelper, currentApp, device)
- waitForAppToMoveToDesktop(wmHelper, currentApp)
- }
-
- private fun dragToDesktop(
- wmHelper: WindowManagerStateHelper,
- currentApp: StandardAppHelper,
- device: UiDevice
- ) {
- val windowRect = wmHelper.getWindowRegion(currentApp).bounds
- val startX = windowRect.centerX()
-
- // Start dragging a little under the top to prevent dragging the notification shade.
- val startY = 10
-
- val displayRect =
- wmHelper.currentState.wmState.getDefaultDisplay()?.displayRect
- ?: throw IllegalStateException("Default display is null")
-
- // The position we want to drag to
- val endY = displayRect.centerY() / 2
-
- // drag the window to move to desktop
- device.drag(startX, startY, startX, endY, 100)
- }
-}
diff --git a/libs/hostgraphics/ADisplay.cpp b/libs/hostgraphics/ADisplay.cpp
index 9cc1f40..58fa082 100644
--- a/libs/hostgraphics/ADisplay.cpp
+++ b/libs/hostgraphics/ADisplay.cpp
@@ -94,14 +94,14 @@
int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) {
// This is running on host, so there are no physical displays available.
// Create 1 fake display instead.
- DisplayImpl** const impls = reinterpret_cast<DisplayImpl**>(
- malloc(sizeof(DisplayImpl*) + sizeof(DisplayImpl)));
+ DisplayImpl** const impls =
+ reinterpret_cast<DisplayImpl**>(malloc(sizeof(DisplayImpl*) + sizeof(DisplayImpl)));
DisplayImpl* const displayData = reinterpret_cast<DisplayImpl*>(impls + 1);
- displayData[0] = DisplayImpl{ADisplayType::DISPLAY_TYPE_INTERNAL,
- ADataSpace::ADATASPACE_UNKNOWN,
- AHardwareBuffer_Format::AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
- DisplayConfigImpl()};
+ displayData[0] =
+ DisplayImpl{ADisplayType::DISPLAY_TYPE_INTERNAL, ADataSpace::ADATASPACE_UNKNOWN,
+ AHardwareBuffer_Format::AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
+ DisplayConfigImpl()};
impls[0] = displayData;
*outDisplays = reinterpret_cast<ADisplay**>(impls);
return 1;
diff --git a/libs/hostgraphics/Fence.cpp b/libs/hostgraphics/Fence.cpp
index 9e54816..4383bf0 100644
--- a/libs/hostgraphics/Fence.cpp
+++ b/libs/hostgraphics/Fence.cpp
@@ -20,4 +20,4 @@
const sp<Fence> Fence::NO_FENCE = sp<Fence>(new Fence);
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/libs/hostgraphics/HostBufferQueue.cpp b/libs/hostgraphics/HostBufferQueue.cpp
index ec30437..7e14b88 100644
--- a/libs/hostgraphics/HostBufferQueue.cpp
+++ b/libs/hostgraphics/HostBufferQueue.cpp
@@ -15,18 +15,26 @@
*/
#include <gui/BufferQueue.h>
+#include <system/window.h>
namespace android {
class HostBufferQueue : public IGraphicBufferProducer, public IGraphicBufferConsumer {
public:
- HostBufferQueue() : mWidth(0), mHeight(0) { }
+ HostBufferQueue() : mWidth(0), mHeight(0) {}
- virtual status_t setConsumerIsProtected(bool isProtected) { return OK; }
+ // Consumer
+ virtual status_t setConsumerIsProtected(bool isProtected) {
+ return OK;
+ }
- virtual status_t detachBuffer(int slot) { return OK; }
+ virtual status_t detachBuffer(int slot) {
+ return OK;
+ }
- virtual status_t getReleasedBuffers(uint64_t* slotMask) { return OK; }
+ virtual status_t getReleasedBuffers(uint64_t* slotMask) {
+ return OK;
+ }
virtual status_t setDefaultBufferSize(uint32_t w, uint32_t h) {
mWidth = w;
@@ -35,22 +43,54 @@
return OK;
}
- virtual status_t setDefaultBufferFormat(PixelFormat defaultFormat) { return OK; }
+ virtual status_t setDefaultBufferFormat(PixelFormat defaultFormat) {
+ return OK;
+ }
- virtual status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace) { return OK; }
+ virtual status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace) {
+ return OK;
+ }
- virtual status_t discardFreeBuffers() { return OK; }
+ virtual status_t discardFreeBuffers() {
+ return OK;
+ }
virtual status_t acquireBuffer(BufferItem* buffer, nsecs_t presentWhen,
- uint64_t maxFrameNumber = 0) {
+ uint64_t maxFrameNumber = 0) {
buffer->mGraphicBuffer = mBuffer;
buffer->mSlot = 0;
return OK;
}
- virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) { return OK; }
+ virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) {
+ return OK;
+ }
- virtual status_t setConsumerUsageBits(uint64_t usage) { return OK; }
+ virtual status_t setConsumerUsageBits(uint64_t usage) {
+ return OK;
+ }
+
+ // Producer
+ virtual int query(int what, int* value) {
+ switch (what) {
+ case NATIVE_WINDOW_WIDTH:
+ *value = mWidth;
+ break;
+ case NATIVE_WINDOW_HEIGHT:
+ *value = mHeight;
+ break;
+ default:
+ *value = 0;
+ break;
+ }
+ return OK;
+ }
+
+ virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) {
+ *buf = mBuffer;
+ return OK;
+ }
+
private:
sp<GraphicBuffer> mBuffer;
uint32_t mWidth;
@@ -58,8 +98,7 @@
};
void BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
- sp<IGraphicBufferConsumer>* outConsumer) {
-
+ sp<IGraphicBufferConsumer>* outConsumer) {
sp<HostBufferQueue> obj(new HostBufferQueue());
*outProducer = obj;
diff --git a/libs/hostgraphics/PublicFormat.cpp b/libs/hostgraphics/PublicFormat.cpp
index af6d273..2a2eec6 100644
--- a/libs/hostgraphics/PublicFormat.cpp
+++ b/libs/hostgraphics/PublicFormat.cpp
@@ -30,4 +30,4 @@
return static_cast<PublicFormat>(format);
}
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/libs/hostgraphics/gui/BufferItem.h b/libs/hostgraphics/gui/BufferItem.h
index 01409e1..e95a923 100644
--- a/libs/hostgraphics/gui/BufferItem.h
+++ b/libs/hostgraphics/gui/BufferItem.h
@@ -17,16 +17,15 @@
#ifndef ANDROID_GUI_BUFFERITEM_H
#define ANDROID_GUI_BUFFERITEM_H
+#include <system/graphics.h>
#include <ui/Fence.h>
#include <ui/Rect.h>
-
-#include <system/graphics.h>
-
#include <utils/StrongPointer.h>
namespace android {
class Fence;
+
class GraphicBuffer;
// The only thing we need here for layoutlib is mGraphicBuffer. The rest of the fields are added
@@ -37,6 +36,7 @@
enum { INVALID_BUFFER_SLOT = -1 };
BufferItem() : mGraphicBuffer(nullptr), mFence(Fence::NO_FENCE) {}
+
~BufferItem() {}
sp<GraphicBuffer> mGraphicBuffer;
@@ -60,6 +60,6 @@
bool mTransformToDisplayInverse;
};
-}
+} // namespace android
#endif // ANDROID_GUI_BUFFERITEM_H
diff --git a/libs/hostgraphics/gui/BufferItemConsumer.h b/libs/hostgraphics/gui/BufferItemConsumer.h
index 707b313..c259411 100644
--- a/libs/hostgraphics/gui/BufferItemConsumer.h
+++ b/libs/hostgraphics/gui/BufferItemConsumer.h
@@ -17,32 +17,30 @@
#ifndef ANDROID_GUI_BUFFERITEMCONSUMER_H
#define ANDROID_GUI_BUFFERITEMCONSUMER_H
-#include <utils/RefBase.h>
-
#include <gui/ConsumerBase.h>
#include <gui/IGraphicBufferConsumer.h>
+#include <utils/RefBase.h>
namespace android {
class BufferItemConsumer : public ConsumerBase {
public:
- BufferItemConsumer(
- const sp<IGraphicBufferConsumer>& consumer,
- uint64_t consumerUsage,
- int bufferCount,
- bool controlledByApp) : mConsumer(consumer) {
- }
+ BufferItemConsumer(const sp<IGraphicBufferConsumer>& consumer, uint64_t consumerUsage,
+ int bufferCount, bool controlledByApp)
+ : mConsumer(consumer) {}
- status_t acquireBuffer(BufferItem *item, nsecs_t presentWhen, bool waitForFence = true) {
+ status_t acquireBuffer(BufferItem* item, nsecs_t presentWhen, bool waitForFence = true) {
return mConsumer->acquireBuffer(item, presentWhen, 0);
}
- status_t releaseBuffer(
- const BufferItem &item, const sp<Fence>& releaseFence = Fence::NO_FENCE) { return OK; }
+ status_t releaseBuffer(const BufferItem& item,
+ const sp<Fence>& releaseFence = Fence::NO_FENCE) {
+ return OK;
+ }
- void setName(const String8& name) { }
+ void setName(const String8& name) {}
- void setFrameAvailableListener(const wp<FrameAvailableListener>& listener) { }
+ void setFrameAvailableListener(const wp<FrameAvailableListener>& listener) {}
status_t setDefaultBufferSize(uint32_t width, uint32_t height) {
return mConsumer->setDefaultBufferSize(width, height);
@@ -56,16 +54,23 @@
return mConsumer->setDefaultBufferDataSpace(defaultDataSpace);
}
- void abandon() { }
+ void abandon() {}
- status_t detachBuffer(int slot) { return OK; }
+ status_t detachBuffer(int slot) {
+ return OK;
+ }
- status_t discardFreeBuffers() { return OK; }
+ status_t discardFreeBuffers() {
+ return OK;
+ }
- void freeBufferLocked(int slotIndex) { }
+ void freeBufferLocked(int slotIndex) {}
- status_t addReleaseFenceLocked(
- int slot, const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence) { return OK; }
+ status_t addReleaseFenceLocked(int slot, const sp<GraphicBuffer> graphicBuffer,
+ const sp<Fence>& fence) {
+ return OK;
+ }
+
private:
sp<IGraphicBufferConsumer> mConsumer;
};
diff --git a/libs/hostgraphics/gui/BufferQueue.h b/libs/hostgraphics/gui/BufferQueue.h
index aa3e726..67a8c00 100644
--- a/libs/hostgraphics/gui/BufferQueue.h
+++ b/libs/hostgraphics/gui/BufferQueue.h
@@ -29,7 +29,7 @@
enum { NO_BUFFER_AVAILABLE = IGraphicBufferConsumer::NO_BUFFER_AVAILABLE };
static void createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
- sp<IGraphicBufferConsumer>* outConsumer);
+ sp<IGraphicBufferConsumer>* outConsumer);
};
} // namespace android
diff --git a/libs/hostgraphics/gui/ConsumerBase.h b/libs/hostgraphics/gui/ConsumerBase.h
index 9002953..7f7309e 100644
--- a/libs/hostgraphics/gui/ConsumerBase.h
+++ b/libs/hostgraphics/gui/ConsumerBase.h
@@ -18,7 +18,6 @@
#define ANDROID_GUI_CONSUMERBASE_H
#include <gui/BufferItem.h>
-
#include <utils/RefBase.h>
namespace android {
@@ -28,10 +27,11 @@
struct FrameAvailableListener : public virtual RefBase {
// See IConsumerListener::onFrame{Available,Replaced}
virtual void onFrameAvailable(const BufferItem& item) = 0;
+
virtual void onFrameReplaced(const BufferItem& /* item */) {}
};
};
} // namespace android
-#endif // ANDROID_GUI_CONSUMERBASE_H
\ No newline at end of file
+#endif // ANDROID_GUI_CONSUMERBASE_H
diff --git a/libs/hostgraphics/gui/IGraphicBufferConsumer.h b/libs/hostgraphics/gui/IGraphicBufferConsumer.h
index 9eb67b2..14ac4fe 100644
--- a/libs/hostgraphics/gui/IGraphicBufferConsumer.h
+++ b/libs/hostgraphics/gui/IGraphicBufferConsumer.h
@@ -16,16 +16,16 @@
#pragma once
-#include <utils/RefBase.h>
-
#include <ui/PixelFormat.h>
-
#include <utils/Errors.h>
+#include <utils/RefBase.h>
namespace android {
class BufferItem;
+
class Fence;
+
class GraphicBuffer;
class IGraphicBufferConsumer : virtual public RefBase {
@@ -62,4 +62,4 @@
virtual status_t discardFreeBuffers() = 0;
};
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/libs/hostgraphics/gui/IGraphicBufferProducer.h b/libs/hostgraphics/gui/IGraphicBufferProducer.h
index a1efd0b..8fd8590 100644
--- a/libs/hostgraphics/gui/IGraphicBufferProducer.h
+++ b/libs/hostgraphics/gui/IGraphicBufferProducer.h
@@ -17,9 +17,8 @@
#ifndef ANDROID_GUI_IGRAPHICBUFFERPRODUCER_H
#define ANDROID_GUI_IGRAPHICBUFFERPRODUCER_H
-#include <utils/RefBase.h>
-
#include <ui/GraphicBuffer.h>
+#include <utils/RefBase.h>
namespace android {
@@ -31,6 +30,10 @@
// Disconnect any API originally connected from the process calling disconnect.
AllLocal
};
+
+ virtual int query(int what, int* value) = 0;
+
+ virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) = 0;
};
} // namespace android
diff --git a/libs/hostgraphics/gui/Surface.h b/libs/hostgraphics/gui/Surface.h
index 36d8fba..2774f89 100644
--- a/libs/hostgraphics/gui/Surface.h
+++ b/libs/hostgraphics/gui/Surface.h
@@ -17,25 +17,36 @@
#ifndef ANDROID_GUI_SURFACE_H
#define ANDROID_GUI_SURFACE_H
-#include <gui/IGraphicBufferProducer.h>
+#include <system/window.h>
#include <ui/ANativeObjectBase.h>
#include <utils/RefBase.h>
-#include <system/window.h>
+
+#include "gui/IGraphicBufferProducer.h"
namespace android {
class Surface : public ANativeObjectBase<ANativeWindow, Surface, RefBase> {
public:
- explicit Surface(const sp<IGraphicBufferProducer>& bufferProducer,
- bool controlledByApp = false) {
+ explicit Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp = false)
+ : mBufferProducer(bufferProducer) {
ANativeWindow::perform = hook_perform;
+ ANativeWindow::dequeueBuffer = hook_dequeueBuffer;
+ ANativeWindow::query = hook_query;
}
- static bool isValid(const sp<Surface>& surface) { return surface != nullptr; }
+
+ static bool isValid(const sp<Surface>& surface) {
+ return surface != nullptr;
+ }
+
void allocateBuffers() {}
- uint64_t getNextFrameNumber() const { return 0; }
+ uint64_t getNextFrameNumber() const {
+ return 0;
+ }
- int setScalingMode(int mode) { return 0; }
+ int setScalingMode(int mode) {
+ return 0;
+ }
virtual int disconnect(int api,
IGraphicBufferProducer::DisconnectMode mode =
@@ -47,24 +58,88 @@
// TODO: implement this
return 0;
}
- virtual int unlockAndPost() { return 0; }
- virtual int query(int what, int* value) const { return 0; }
+
+ virtual int unlockAndPost() {
+ return 0;
+ }
+
+ virtual int query(int what, int* value) const {
+ return mBufferProducer->query(what, value);
+ }
+
+ status_t setDequeueTimeout(nsecs_t timeout) {
+ return OK;
+ }
+
+ nsecs_t getLastDequeueStartTime() const {
+ return 0;
+ }
virtual void destroy() {}
- int getBuffersDataSpace() { return 0; }
+ int getBuffersDataSpace() {
+ return 0;
+ }
protected:
virtual ~Surface() {}
- static int hook_perform(ANativeWindow* window, int operation, ...) { return 0; }
+ static int hook_perform(ANativeWindow* window, int operation, ...) {
+ va_list args;
+ va_start(args, operation);
+ Surface* c = getSelf(window);
+ int result = c->perform(operation, args);
+ va_end(args);
+ return result;
+ }
+
+ static int hook_query(const ANativeWindow* window, int what, int* value) {
+ const Surface* c = getSelf(window);
+ return c->query(what, value);
+ }
+
+ static int hook_dequeueBuffer(ANativeWindow* window, ANativeWindowBuffer** buffer,
+ int* fenceFd) {
+ Surface* c = getSelf(window);
+ return c->dequeueBuffer(buffer, fenceFd);
+ }
+
+ virtual int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd) {
+ mBufferProducer->requestBuffer(0, &mBuffer);
+ *buffer = mBuffer.get();
+ return OK;
+ }
+
+ virtual int cancelBuffer(ANativeWindowBuffer* buffer, int fenceFd) {
+ return 0;
+ }
+
+ virtual int queueBuffer(ANativeWindowBuffer* buffer, int fenceFd) {
+ return 0;
+ }
+
+ virtual int perform(int operation, va_list args) {
+ return 0;
+ }
+
+ virtual int setSwapInterval(int interval) {
+ return 0;
+ }
+
+ virtual int setBufferCount(int bufferCount) {
+ return 0;
+ }
private:
// can't be copied
Surface& operator=(const Surface& rhs);
+
Surface(const Surface& rhs);
+
+ const sp<IGraphicBufferProducer> mBufferProducer;
+ sp<GraphicBuffer> mBuffer;
};
} // namespace android
-#endif // ANDROID_GUI_SURFACE_H
+#endif // ANDROID_GUI_SURFACE_H
diff --git a/libs/hostgraphics/ui/Fence.h b/libs/hostgraphics/ui/Fence.h
index 04d535c..187c311 100644
--- a/libs/hostgraphics/ui/Fence.h
+++ b/libs/hostgraphics/ui/Fence.h
@@ -17,8 +17,8 @@
#ifndef ANDROID_FENCE_H
#define ANDROID_FENCE_H
-#include <utils/String8.h>
#include <utils/RefBase.h>
+#include <utils/String8.h>
typedef int64_t nsecs_t;
@@ -26,11 +26,14 @@
class Fence : public LightRefBase<Fence> {
public:
- Fence() { }
- Fence(int) { }
+ Fence() {}
+
+ Fence(int) {}
+
static const sp<Fence> NO_FENCE;
static constexpr nsecs_t SIGNAL_TIME_PENDING = INT64_MAX;
static constexpr nsecs_t SIGNAL_TIME_INVALID = -1;
+
static sp<Fence> merge(const char* name, const sp<Fence>& f1, const sp<Fence>& f2) {
return NO_FENCE;
}
@@ -40,16 +43,22 @@
}
enum class Status {
- Invalid, // Fence is invalid
- Unsignaled, // Fence is valid but has not yet signaled
- Signaled, // Fence is valid and has signaled
+ Invalid, // Fence is invalid
+ Unsignaled, // Fence is valid but has not yet signaled
+ Signaled, // Fence is valid and has signaled
};
- status_t wait(int timeout) { return OK; }
+ status_t wait(int timeout) {
+ return OK;
+ }
- status_t waitForever(const char* logname) { return OK; }
+ status_t waitForever(const char* logname) {
+ return OK;
+ }
- int dup() const { return 0; }
+ int dup() const {
+ return 0;
+ }
inline Status getStatus() {
// The sync_wait call underlying wait() has been measured to be
diff --git a/libs/hostgraphics/ui/GraphicBuffer.h b/libs/hostgraphics/ui/GraphicBuffer.h
index ac88e44..cda45e46 100644
--- a/libs/hostgraphics/ui/GraphicBuffer.h
+++ b/libs/hostgraphics/ui/GraphicBuffer.h
@@ -19,31 +19,51 @@
#include <stdint.h>
#include <sys/types.h>
+#include <ui/ANativeObjectBase.h>
+#include <ui/PixelFormat.h>
+#include <ui/Rect.h>
+#include <utils/RefBase.h>
#include <vector>
-#include <ui/PixelFormat.h>
-#include <ui/Rect.h>
-
-#include <utils/RefBase.h>
-
namespace android {
-class GraphicBuffer : virtual public RefBase {
+class GraphicBuffer : public ANativeObjectBase<ANativeWindowBuffer, GraphicBuffer, RefBase> {
public:
- GraphicBuffer(uint32_t w, uint32_t h):width(w),height(h) {
- data.resize(w*h);
+ GraphicBuffer(uint32_t w, uint32_t h) {
+ data.resize(w * h);
+ reserved[0] = data.data();
+ width = w;
+ height = h;
}
- uint32_t getWidth() const { return static_cast<uint32_t>(width); }
- uint32_t getHeight() const { return static_cast<uint32_t>(height); }
- uint32_t getStride() const { return static_cast<uint32_t>(width); }
- uint64_t getUsage() const { return 0; }
- PixelFormat getPixelFormat() const { return PIXEL_FORMAT_RGBA_8888; }
- //uint32_t getLayerCount() const { return static_cast<uint32_t>(layerCount); }
- Rect getBounds() const { return Rect(width, height); }
- status_t lockAsyncYCbCr(uint32_t inUsage, const Rect& rect,
- android_ycbcr *ycbcr, int fenceFd) { return OK; }
+ uint32_t getWidth() const {
+ return static_cast<uint32_t>(width);
+ }
+
+ uint32_t getHeight() const {
+ return static_cast<uint32_t>(height);
+ }
+
+ uint32_t getStride() const {
+ return static_cast<uint32_t>(width);
+ }
+
+ uint64_t getUsage() const {
+ return 0;
+ }
+
+ PixelFormat getPixelFormat() const {
+ return PIXEL_FORMAT_RGBA_8888;
+ }
+
+ Rect getBounds() const {
+ return Rect(width, height);
+ }
+
+ status_t lockAsyncYCbCr(uint32_t inUsage, const Rect& rect, android_ycbcr* ycbcr, int fenceFd) {
+ return OK;
+ }
status_t lockAsync(uint32_t inUsage, const Rect& rect, void** vaddr, int fenceFd,
int32_t* outBytesPerPixel = nullptr, int32_t* outBytesPerStride = nullptr) {
@@ -51,11 +71,11 @@
return OK;
}
- status_t unlockAsync(int *fenceFd) { return OK; }
+ status_t unlockAsync(int* fenceFd) {
+ return OK;
+ }
private:
- uint32_t width;
- uint32_t height;
std::vector<uint32_t> data;
};
diff --git a/libs/hwui/pipeline/skia/ShaderCache.cpp b/libs/hwui/pipeline/skia/ShaderCache.cpp
index b870023..8e07a2f 100644
--- a/libs/hwui/pipeline/skia/ShaderCache.cpp
+++ b/libs/hwui/pipeline/skia/ShaderCache.cpp
@@ -15,14 +15,18 @@
*/
#include "ShaderCache.h"
+
#include <GrDirectContext.h>
#include <SkData.h>
#include <gui/TraceUtils.h>
#include <log/log.h>
#include <openssl/sha.h>
+
#include <algorithm>
#include <array>
+#include <mutex>
#include <thread>
+
#include "FileBlobCache.h"
#include "Properties.h"
diff --git a/libs/hwui/renderthread/HintSessionWrapper.cpp b/libs/hwui/renderthread/HintSessionWrapper.cpp
index 6993d52..7a155c5 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.cpp
+++ b/libs/hwui/renderthread/HintSessionWrapper.cpp
@@ -45,7 +45,7 @@
LOG_ALWAYS_FATAL_IF(handle_ == nullptr, "Failed to dlopen libandroid.so!");
BIND_APH_METHOD(getManager);
- BIND_APH_METHOD(createSession);
+ BIND_APH_METHOD(createSessionInternal);
BIND_APH_METHOD(closeSession);
BIND_APH_METHOD(updateTargetWorkDuration);
BIND_APH_METHOD(reportActualWorkDuration);
@@ -122,7 +122,8 @@
int64_t targetDurationNanos =
mLastTargetWorkDuration == 0 ? kDefaultTargetDuration : mLastTargetWorkDuration;
mHintSessionFuture = CommonPool::async([=, this, tids = mPermanentSessionTids] {
- return mBinding->createSession(manager, tids.data(), tids.size(), targetDurationNanos);
+ return mBinding->createSessionInternal(manager, tids.data(), tids.size(),
+ targetDurationNanos, SessionTag::HWUI);
});
return false;
}
diff --git a/libs/hwui/renderthread/HintSessionWrapper.h b/libs/hwui/renderthread/HintSessionWrapper.h
index 14e7a53..859cc57 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.h
+++ b/libs/hwui/renderthread/HintSessionWrapper.h
@@ -17,6 +17,7 @@
#pragma once
#include <android/performance_hint.h>
+#include <private/performance_hint_private.h>
#include <future>
#include <optional>
@@ -80,9 +81,10 @@
virtual ~HintSessionBinding() = default;
virtual void init();
APerformanceHintManager* (*getManager)();
- APerformanceHintSession* (*createSession)(APerformanceHintManager* manager,
- const int32_t* tids, size_t tidCount,
- int64_t defaultTarget) = nullptr;
+ APerformanceHintSession* (*createSessionInternal)(APerformanceHintManager* manager,
+ const int32_t* tids, size_t tidCount,
+ int64_t defaultTarget,
+ SessionTag tag) = nullptr;
void (*closeSession)(APerformanceHintSession* session) = nullptr;
void (*updateTargetWorkDuration)(APerformanceHintSession* session,
int64_t targetDuration) = nullptr;
diff --git a/libs/hwui/tests/unit/HintSessionWrapperTests.cpp b/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
index c16602c..a8db0f4 100644
--- a/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
+++ b/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
@@ -52,8 +52,8 @@
void init() override;
MOCK_METHOD(APerformanceHintManager*, fakeGetManager, ());
- MOCK_METHOD(APerformanceHintSession*, fakeCreateSession,
- (APerformanceHintManager*, const int32_t*, size_t, int64_t));
+ MOCK_METHOD(APerformanceHintSession*, fakeCreateSessionInternal,
+ (APerformanceHintManager*, const int32_t*, size_t, int64_t, SessionTag));
MOCK_METHOD(void, fakeCloseSession, (APerformanceHintSession*));
MOCK_METHOD(void, fakeUpdateTargetWorkDuration, (APerformanceHintSession*, int64_t));
MOCK_METHOD(void, fakeReportActualWorkDuration, (APerformanceHintSession*, int64_t));
@@ -72,22 +72,28 @@
// Must be static so we can point to them as normal fn pointers with HintSessionBinding
static APerformanceHintManager* stubGetManager() { return sMockBinding->fakeGetManager(); };
- static APerformanceHintSession* stubCreateSession(APerformanceHintManager* manager,
- const int32_t* ids, size_t idsSize,
- int64_t initialTarget) {
- return sMockBinding->fakeCreateSession(manager, ids, idsSize, initialTarget);
+ static APerformanceHintSession* stubCreateSessionInternal(APerformanceHintManager* manager,
+ const int32_t* ids, size_t idsSize,
+ int64_t initialTarget,
+ SessionTag tag) {
+ return sMockBinding->fakeCreateSessionInternal(manager, ids, idsSize, initialTarget,
+ SessionTag::HWUI);
}
- static APerformanceHintSession* stubManagedCreateSession(APerformanceHintManager* manager,
- const int32_t* ids, size_t idsSize,
- int64_t initialTarget) {
+ static APerformanceHintSession* stubManagedCreateSessionInternal(
+ APerformanceHintManager* manager, const int32_t* ids, size_t idsSize,
+ int64_t initialTarget, SessionTag tag) {
sMockBinding->allowCreationToFinish.get_future().wait();
- return sMockBinding->fakeCreateSession(manager, ids, idsSize, initialTarget);
+ return sMockBinding->fakeCreateSessionInternal(manager, ids, idsSize, initialTarget,
+ SessionTag::HWUI);
}
- static APerformanceHintSession* stubSlowCreateSession(APerformanceHintManager* manager,
- const int32_t* ids, size_t idsSize,
- int64_t initialTarget) {
+ static APerformanceHintSession* stubSlowCreateSessionInternal(APerformanceHintManager* manager,
+ const int32_t* ids,
+ size_t idsSize,
+ int64_t initialTarget,
+ SessionTag tag) {
std::this_thread::sleep_for(50ms);
- return sMockBinding->fakeCreateSession(manager, ids, idsSize, initialTarget);
+ return sMockBinding->fakeCreateSessionInternal(manager, ids, idsSize, initialTarget,
+ SessionTag::HWUI);
}
static void stubCloseSession(APerformanceHintSession* session) {
sMockBinding->fakeCloseSession(session);
@@ -139,14 +145,14 @@
mWrapper = std::make_shared<HintSessionWrapper>(uiThreadId, renderThreadId);
mWrapper->mBinding = sMockBinding;
EXPECT_CALL(*sMockBinding, fakeGetManager).WillOnce(Return(managerPtr));
- ON_CALL(*sMockBinding, fakeCreateSession).WillByDefault(Return(sessionPtr));
+ ON_CALL(*sMockBinding, fakeCreateSessionInternal).WillByDefault(Return(sessionPtr));
ON_CALL(*sMockBinding, fakeSetThreads).WillByDefault(Return(0));
}
void HintSessionWrapperTests::MockHintSessionBinding::init() {
sMockBinding->getManager = &stubGetManager;
- if (sMockBinding->createSession == nullptr) {
- sMockBinding->createSession = &stubCreateSession;
+ if (sMockBinding->createSessionInternal == nullptr) {
+ sMockBinding->createSessionInternal = &stubCreateSessionInternal;
}
sMockBinding->closeSession = &stubCloseSession;
sMockBinding->updateTargetWorkDuration = &stubUpdateTargetWorkDuration;
@@ -163,14 +169,14 @@
TEST_F(HintSessionWrapperTests, destructorClosesBackgroundSession) {
EXPECT_CALL(*sMockBinding, fakeCloseSession(sessionPtr)).Times(1);
- sMockBinding->createSession = stubSlowCreateSession;
+ sMockBinding->createSessionInternal = stubSlowCreateSessionInternal;
mWrapper->init();
mWrapper = nullptr;
Mock::VerifyAndClearExpectations(sMockBinding.get());
}
TEST_F(HintSessionWrapperTests, sessionInitializesCorrectly) {
- EXPECT_CALL(*sMockBinding, fakeCreateSession(managerPtr, _, Gt(1), _)).Times(1);
+ EXPECT_CALL(*sMockBinding, fakeCreateSessionInternal(managerPtr, _, Gt(1), _, _)).Times(1);
mWrapper->init();
waitForWrapperReady();
}
@@ -219,7 +225,7 @@
// Here we test whether queueing delayedDestroy works while creation is still happening, if
// creation happens after
EXPECT_CALL(*sMockBinding, fakeCloseSession(sessionPtr)).Times(1);
- sMockBinding->createSession = &stubManagedCreateSession;
+ sMockBinding->createSessionInternal = &stubManagedCreateSessionInternal;
// Start creating the session and destroying it at the same time
mWrapper->init();
@@ -246,7 +252,7 @@
// Here we test whether queueing delayedDestroy works while creation is still happening, if
// creation happens before
EXPECT_CALL(*sMockBinding, fakeCloseSession(sessionPtr)).Times(1);
- sMockBinding->createSession = &stubManagedCreateSession;
+ sMockBinding->createSessionInternal = &stubManagedCreateSessionInternal;
// Start creating the session and destroying it at the same time
mWrapper->init();
@@ -352,7 +358,7 @@
}
TEST_F(HintSessionWrapperTests, setThreadsUpdatesSessionThreads) {
- EXPECT_CALL(*sMockBinding, fakeCreateSession(managerPtr, _, Gt(1), _)).Times(1);
+ EXPECT_CALL(*sMockBinding, fakeCreateSessionInternal(managerPtr, _, Gt(1), _, _)).Times(1);
EXPECT_CALL(*sMockBinding, fakeSetThreads(sessionPtr, testing::IsSupersetOf({11, 22})))
.Times(1);
mWrapper->init();
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index c664d3d..ffd6e16 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -545,16 +545,17 @@
? SCANNING_STATE_SCANNING_FULL
: SCANNING_STATE_WHILE_INTERACTIVE);
- if (scanRequest.isScreenOffScan()) {
- mScreenOffScanRequestCount++;
- } else {
- mScreenOnScanRequestCount++;
- }
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
}
+ if (scanRequest.isScreenOffScan()) {
+ mScreenOffScanRequestCount++;
+ } else {
+ mScreenOnScanRequestCount++;
+ }
+
mScanRequestsMap.put(token.mId, scanRequest);
return token;
}
@@ -580,27 +581,29 @@
}
boolean shouldUpdate =
- mScreenOffScanRequestCount == 1
- && (request.isScreenOffScan() || mScreenOnScanRequestCount == 1);
+ request.isScreenOffScan()
+ ? mScreenOffScanRequestCount == 1
+ : mScreenOnScanRequestCount == 1 && mScreenOffScanRequestCount == 0;
if (shouldUpdate) {
try {
- if (request.isScreenOffScan() && mScreenOnScanRequestCount == 0) {
+ if (!request.isScreenOffScan() || mScreenOnScanRequestCount == 0) {
mImpl.updateScanningState(SCANNING_STATE_NOT_SCANNING);
} else {
mImpl.updateScanningState(SCANNING_STATE_WHILE_INTERACTIVE);
}
- if (request.isScreenOffScan()) {
- mScreenOffScanRequestCount--;
- } else {
- mScreenOnScanRequestCount--;
- }
} catch (RemoteException ex) {
ex.rethrowFromSystemServer();
}
}
+ if (request.isScreenOffScan()) {
+ mScreenOffScanRequestCount--;
+ } else {
+ mScreenOnScanRequestCount--;
+ }
+
mScanRequestsMap.remove(token.mId);
}
}
diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java
index 3432b3f..86113df 100644
--- a/media/java/android/media/RingtoneManager.java
+++ b/media/java/android/media/RingtoneManager.java
@@ -16,7 +16,6 @@
package android.media;
-import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -573,12 +572,13 @@
FileUtils.closeQuietly(cursor);
throw new FileNotFoundException("No item found for " + baseUri);
} else if (cursor.getCount() > 1) {
+ int resultCount = cursor.getCount();
// Find more than 1 result.
// We are not sure which one is the right ringtone file so just abandon this case.
FileUtils.closeQuietly(cursor);
throw new FileNotFoundException(
"Find multiple ringtone candidates by title+ringtone_type query: count: "
- + cursor.getCount());
+ + resultCount);
}
if (cursor.moveToFirst()) {
ringtoneUri = ContentUris.withAppendedId(baseUri, cursor.getLong(0));
diff --git a/media/java/android/media/RoutingSessionInfo.java b/media/java/android/media/RoutingSessionInfo.java
index 2202766..a3c8b68 100644
--- a/media/java/android/media/RoutingSessionInfo.java
+++ b/media/java/android/media/RoutingSessionInfo.java
@@ -84,7 +84,6 @@
*
* @hide
*/
- @FlaggedApi(FLAG_ENABLE_BUILT_IN_SPEAKER_ROUTE_SUITABILITY_STATUSES)
@IntDef(value = {TRANSFER_REASON_FALLBACK, TRANSFER_REASON_SYSTEM_REQUEST, TRANSFER_REASON_APP})
@Retention(RetentionPolicy.SOURCE)
public @interface TransferReason {}
@@ -382,14 +381,12 @@
}
/** @hide */
- @FlaggedApi(FLAG_ENABLE_BUILT_IN_SPEAKER_ROUTE_SUITABILITY_STATUSES)
@Nullable
public UserHandle getTransferInitiatorUserHandle() {
return mTransferInitiatorUserHandle;
}
/** @hide */
- @FlaggedApi(FLAG_ENABLE_BUILT_IN_SPEAKER_ROUTE_SUITABILITY_STATUSES)
@Nullable
public String getTransferInitiatorPackageName() {
return mTransferInitiatorPackageName;
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 8a13c03..4492c85 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -2088,28 +2088,24 @@
}
return BAD_VALUE;
}
- size_t offset = static_cast<size_t>(env->GetIntField(param, gFields.bufferInfoOffset));
- size_t size = static_cast<size_t>(env->GetIntField(param, gFields.bufferInfoSize));
+ ssize_t offset = static_cast<ssize_t>(env->GetIntField(param, gFields.bufferInfoOffset));
+ ssize_t size = static_cast<ssize_t>(env->GetIntField(param, gFields.bufferInfoSize));
uint32_t flags = static_cast<uint32_t>(env->GetIntField(param, gFields.bufferInfoFlags));
- if (flags == 0 && size == 0) {
+ if (i == 0) {
+ *initialOffset = offset;
+ }
+ if (CC_UNLIKELY((offset < 0)
+ || (size < 0)
+ || ((INT32_MAX - offset) < size)
+ || ((offset - (*initialOffset)) != *totalSize))) {
if (errorDetailMsg) {
- *errorDetailMsg = "Error: Queuing an empty BufferInfo";
+ *errorDetailMsg = "Error: offset/size in BufferInfo";
}
return BAD_VALUE;
}
- if (i == 0) {
- *initialOffset = offset;
- if (CC_UNLIKELY(*initialOffset < 0)) {
- if (errorDetailMsg) {
- *errorDetailMsg = "Error: offset/size in BufferInfo";
- }
- return BAD_VALUE;
- }
- }
- if (CC_UNLIKELY(((ssize_t)(UINT32_MAX - offset) < (ssize_t)size)
- || ((offset - *initialOffset) != *totalSize))) {
+ if (flags == 0 && size == 0) {
if (errorDetailMsg) {
- *errorDetailMsg = "Error: offset/size in BufferInfo";
+ *errorDetailMsg = "Error: Queuing an empty BufferInfo";
}
return BAD_VALUE;
}
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index 1c203e3..346c87d 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -366,6 +366,7 @@
APerformanceHint_setIHintManagerForTesting;
APerformanceHint_sendHint;
APerformanceHint_getThreadIds;
+ APerformanceHint_createSessionInternal;
extern "C++" {
ASurfaceControl_registerSurfaceStatsListener*;
ASurfaceControl_unregisterSurfaceStatsListener*;
diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp
index fbb35e2..83056b2 100644
--- a/native/android/performance_hint.cpp
+++ b/native/android/performance_hint.cpp
@@ -463,6 +463,15 @@
return manager->createSession(threadIds, size, initialTargetWorkDurationNanos);
}
+APerformanceHintSession* APerformanceHint_createSessionInternal(
+ APerformanceHintManager* manager, const int32_t* threadIds, size_t size,
+ int64_t initialTargetWorkDurationNanos, SessionTag tag) {
+ VALIDATE_PTR(manager)
+ VALIDATE_PTR(threadIds)
+ return manager->createSession(threadIds, size, initialTargetWorkDurationNanos,
+ static_cast<hal::SessionTag>(tag));
+}
+
int64_t APerformanceHint_getPreferredUpdateRateNanos(APerformanceHintManager* manager) {
VALIDATE_PTR(manager)
return manager->getPreferredRateNanos();
@@ -486,9 +495,9 @@
delete session;
}
-int APerformanceHint_sendHint(void* session, SessionHint hint) {
+int APerformanceHint_sendHint(APerformanceHintSession* session, SessionHint hint) {
VALIDATE_PTR(session)
- return reinterpret_cast<APerformanceHintSession*>(session)->sendHint(hint);
+ return session->sendHint(hint);
}
int APerformanceHint_setThreads(APerformanceHintSession* session, const pid_t* threadIds,
@@ -498,11 +507,10 @@
return session->setThreads(threadIds, size);
}
-int APerformanceHint_getThreadIds(void* aPerformanceHintSession, int32_t* const threadIds,
+int APerformanceHint_getThreadIds(APerformanceHintSession* session, int32_t* const threadIds,
size_t* const size) {
- VALIDATE_PTR(aPerformanceHintSession)
- return static_cast<APerformanceHintSession*>(aPerformanceHintSession)
- ->getThreadIds(threadIds, size);
+ VALIDATE_PTR(session)
+ return session->getThreadIds(threadIds, size);
}
int APerformanceHint_setPreferPowerEfficiency(APerformanceHintSession* session, bool enabled) {
diff --git a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
index 974e6e6..58f56b8 100644
--- a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
+++ b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
@@ -30,9 +30,7 @@
#include <memory>
#include <vector>
-using aidl::android::hardware::power::SessionConfig;
-using aidl::android::hardware::power::SessionTag;
-using aidl::android::hardware::power::WorkDuration;
+namespace hal = aidl::android::hardware::power;
using aidl::android::os::IHintManager;
using aidl::android::os::IHintSession;
using ndk::ScopedAStatus;
@@ -45,7 +43,7 @@
public:
MOCK_METHOD(ScopedAStatus, createHintSessionWithConfig,
(const SpAIBinder& token, const ::std::vector<int32_t>& tids, int64_t durationNanos,
- SessionTag tag, std::optional<SessionConfig>* config,
+ hal::SessionTag tag, std::optional<hal::SessionConfig>* config,
std::shared_ptr<IHintSession>* _aidl_return),
(override));
MOCK_METHOD(ScopedAStatus, getHintSessionPreferredRate, (int64_t * _aidl_return), (override));
@@ -71,7 +69,7 @@
MOCK_METHOD(ScopedAStatus, setMode, (int32_t mode, bool enabled), (override));
MOCK_METHOD(ScopedAStatus, close, (), (override));
MOCK_METHOD(ScopedAStatus, reportActualWorkDuration2,
- (const ::std::vector<WorkDuration>& workDurations), (override));
+ (const ::std::vector<hal::WorkDuration>& workDurations), (override));
MOCK_METHOD(SpAIBinder, asBinder, (), (override));
MOCK_METHOD(bool, isRemote, (), (override));
};
@@ -95,7 +93,7 @@
return APerformanceHint_getManager();
}
APerformanceHintSession* createSession(APerformanceHintManager* manager,
- int64_t targetDuration = 56789L) {
+ int64_t targetDuration = 56789L, bool isHwui = false) {
mMockSession = ndk::SharedRefBase::make<NiceMock<MockIHintSession>>();
int64_t sessionId = 123;
std::vector<int32_t> tids;
@@ -104,8 +102,8 @@
ON_CALL(*mMockIHintManager,
createHintSessionWithConfig(_, Eq(tids), Eq(targetDuration), _, _, _))
- .WillByDefault(DoAll(SetArgPointee<4>(
- std::make_optional<SessionConfig>({.id = sessionId})),
+ .WillByDefault(DoAll(SetArgPointee<4>(std::make_optional<hal::SessionConfig>(
+ {.id = sessionId})),
SetArgPointee<5>(std::shared_ptr<IHintSession>(mMockSession)),
[] { return ScopedAStatus::ok(); }));
@@ -124,6 +122,10 @@
ON_CALL(*mMockSession, reportActualWorkDuration2(_)).WillByDefault([] {
return ScopedAStatus::ok();
});
+ if (isHwui) {
+ return APerformanceHint_createSessionInternal(manager, tids.data(), tids.size(),
+ targetDuration, SessionTag::HWUI);
+ }
return APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration);
}
@@ -131,7 +133,7 @@
std::shared_ptr<NiceMock<MockIHintSession>> mMockSession = nullptr;
};
-bool equalsWithoutTimestamp(WorkDuration lhs, WorkDuration rhs) {
+bool equalsWithoutTimestamp(hal::WorkDuration lhs, hal::WorkDuration rhs) {
return lhs.workPeriodStartTimestampNanos == rhs.workPeriodStartTimestampNanos &&
lhs.cpuDurationNanos == rhs.cpuDurationNanos &&
lhs.gpuDurationNanos == rhs.gpuDurationNanos && lhs.durationNanos == rhs.durationNanos;
@@ -194,6 +196,16 @@
APerformanceHint_closeSession(session);
}
+TEST_F(PerformanceHintTest, TestHwuiSessionCreation) {
+ EXPECT_CALL(*mMockIHintManager,
+ createHintSessionWithConfig(_, _, _, hal::SessionTag::HWUI, _, _))
+ .Times(1);
+ APerformanceHintManager* manager = createManager();
+ APerformanceHintSession* session = createSession(manager, 56789L, true);
+ ASSERT_TRUE(session);
+ APerformanceHint_closeSession(session);
+}
+
TEST_F(PerformanceHintTest, SetThreads) {
APerformanceHintManager* manager = createManager();
@@ -249,8 +261,8 @@
return false;
}
for (int i = 0; i < expected.size(); ++i) {
- WorkDuration expectedWorkDuration = expected[i];
- WorkDuration actualWorkDuration = arg[i];
+ hal::WorkDuration expectedWorkDuration = expected[i];
+ hal::WorkDuration actualWorkDuration = arg[i];
if (!equalsWithoutTimestamp(expectedWorkDuration, actualWorkDuration)) {
*result_listener << "WorkDuration at [" << i << "] is different: "
<< "Expected: " << expectedWorkDuration.toString()
@@ -273,7 +285,7 @@
usleep(2); // Sleep for longer than preferredUpdateRateNanos.
struct TestPair {
- WorkDuration duration;
+ hal::WorkDuration duration;
int expectedResult;
};
std::vector<TestPair> testPairs{
@@ -282,7 +294,7 @@
{{1, -20, 1, 13, -8}, EINVAL},
};
for (auto&& pair : testPairs) {
- std::vector<WorkDuration> actualWorkDurations;
+ std::vector<hal::WorkDuration> actualWorkDurations;
actualWorkDurations.push_back(pair.duration);
EXPECT_CALL(*mMockSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
diff --git a/nfc/java/android/nfc/NfcAdapter.java b/nfc/java/android/nfc/NfcAdapter.java
index 29867d9..25fecac 100644
--- a/nfc/java/android/nfc/NfcAdapter.java
+++ b/nfc/java/android/nfc/NfcAdapter.java
@@ -1250,7 +1250,11 @@
/**
* Controls whether the NFC adapter will allow transactions to proceed or be in observe mode
* and simply observe and notify the APDU service of polling loop frames. See
- * {@link #isObserveModeSupported()} for a description of observe mode.
+ * {@link #isObserveModeSupported()} for a description of observe mode. Only the package of the
+ * currently preferred service (the service set as preferred by the current foreground
+ * application via {@link CardEmulation#setPreferredService(Activity, ComponentName)} or the
+ * current Default Wallet Role Holder {@link android.app.role.RoleManager#ROLE_WALLET}),
+ * otherwise a call to this method will fail and return false.
*
* @param enabled false disables observe mode to allow the transaction to proceed while true
* enables observe mode and does not allow transactions to proceed.
diff --git a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java
index 572e20d..a470f93 100644
--- a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -410,7 +410,12 @@
boolean autoTransact = a.getBoolean(
com.android.internal.R.styleable.PollingLoopFilter_autoTransact,
false);
- mAutoTransact.put(plf, autoTransact);
+ if (!mOnHost && !autoTransact) {
+ Log.e(TAG, "Ignoring polling-loop-filter " + plf
+ + " for offhost service that isn't autoTranact");
+ } else {
+ mAutoTransact.put(plf, autoTransact);
+ }
a.recycle();
} else if (eventType == XmlPullParser.START_TAG
&& "polling-loop-pattern-filter".equals(tagName) && currentGroup == null) {
@@ -422,7 +427,12 @@
boolean autoTransact = a.getBoolean(
com.android.internal.R.styleable.PollingLoopFilter_autoTransact,
false);
- mAutoTransactPatterns.put(Pattern.compile(plf), autoTransact);
+ if (!mOnHost && !autoTransact) {
+ Log.e(TAG, "Ignoring polling-loop-filter " + plf
+ + " for offhost service that isn't autoTranact");
+ } else {
+ mAutoTransactPatterns.put(Pattern.compile(plf), autoTransact);
+ }
a.recycle();
}
}
@@ -729,8 +739,10 @@
@FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP)
public void addPollingLoopFilter(@NonNull String pollingLoopFilter,
boolean autoTransact) {
+ if (!mOnHost && !autoTransact) {
+ return;
+ }
mAutoTransact.put(pollingLoopFilter, autoTransact);
-
}
/**
@@ -755,8 +767,10 @@
@FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP)
public void addPollingLoopPatternFilter(@NonNull String pollingLoopPatternFilter,
boolean autoTransact) {
+ if (!mOnHost && !autoTransact) {
+ return;
+ }
mAutoTransactPatterns.put(Pattern.compile(pollingLoopPatternFilter), autoTransact);
-
}
/**
diff --git a/packages/CrashRecovery/aconfig/flags.aconfig b/packages/CrashRecovery/aconfig/flags.aconfig
index cddbb6b..8cdef38 100644
--- a/packages/CrashRecovery/aconfig/flags.aconfig
+++ b/packages/CrashRecovery/aconfig/flags.aconfig
@@ -16,3 +16,11 @@
description: "Enables various dependencies of crashrecovery module"
bug: "289203818"
}
+
+flag {
+ name: "allow_rescue_party_flag_resets"
+ namespace: "crashrecovery"
+ description: "Enables rescue party flag resets"
+ bug: "287618292"
+ is_fixed_read_only: true
+}
diff --git a/packages/CredentialManager/res/values-af/strings.xml b/packages/CredentialManager/res/values-af/strings.xml
index b0bac45..2c73eb7 100644
--- a/packages/CredentialManager/res/values-af/strings.xml
+++ b/packages/CredentialManager/res/values-af/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Gebruik jou gestoorde toegangsleutel vir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Gebruik jou gestoorde wagwoord vir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Gebruik jou rekening vir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Kies ’n gestoorde wagwoord 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 dcf98a0..cc6d07c 100644
--- a/packages/CredentialManager/res/values-am/strings.xml
+++ b/packages/CredentialManager/res/values-am/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"የተቀመጠ የይለፍ ቁልፍዎን ለ<xliff:g id="APP_NAME">%1$s</xliff:g> ይጠቀሙ"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የተቀመጠውን የይለፍ ቃልዎ ይጠቀሙ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"መለያዎን ለ<xliff:g id="APP_NAME">%1$s</xliff:g> ይጠቀሙ"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"በ<xliff:g id="USERNAME">%2$s</xliff:g> ወደ <xliff:g id="APP_NAME">%1$s</xliff:g> ለመግባት የማያ ገጽ መቆለፊያዎን ይጠቀሙ"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"ለ<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"ለ<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 c5939da..b106214 100644
--- a/packages/CredentialManager/res/values-as/strings.xml
+++ b/packages/CredentialManager/res/values-as/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"আপুনি <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছেভ কৰি থোৱা পাছকী ব্যৱহাৰ কৰক"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"আপুনি <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছেভ কৰি থোৱা পাছৱৰ্ড ব্যৱহাৰ কৰক"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে থকা আপোনাৰ একাউণ্ট ব্যৱহাৰ কৰক"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> ব্যৱহাৰ কৰি <xliff:g id="APP_NAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ আপোনাৰ স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 db7b8b5..7c33676 100644
--- a/packages/CredentialManager/res/values-az/strings.xml
+++ b/packages/CredentialManager/res/values-az/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanılmış giriş açarından istifadə edin"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanılmış paroldan istifadə edin"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün hesabınızdan istifadə edin"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<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_unlock_options_for" msgid="7096423827682163270">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün giriş seçimlərini kiliddən çıxarı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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış parol 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 ddc8304..5661868 100644
--- a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Koristite sačuvani pristupni ključ za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Koristite sačuvanu lozinku za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Koristite nalog za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Koristite otključavanje ekrana da biste se prijavili u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> kao <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Otključajte 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Izaberite sačuvanu lozinku 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 c302ea2..2d98870e 100644
--- a/packages/CredentialManager/res/values-be/strings.xml
+++ b/packages/CredentialManager/res/values-be/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Выкарыстайце захаваны ключ доступу для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Выкарыстайце захаваны пароль для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Выкарыстайце ўліковы запіс для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Выкарыстайце спосаб разблакіроўкі экрана, каб увайсці ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" як <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Разблакіруйце спосабы ўваходу для праграмы \"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Выберыце захаваны пароль для праграмы \"<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 46ec564..8a8e5fa 100644
--- a/packages/CredentialManager/res/values-bn/strings.xml
+++ b/packages/CredentialManager/res/values-bn/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার সেভ করা পাসকী ব্যবহার করুন"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার সেভ করা পাসওয়ার্ড ব্যবহার করুন"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার অ্যাকাউন্ট ব্যবহার করুন"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"আপনার \'স্ক্রিন লক\' ব্যবহার করে <xliff:g id="USERNAME">%2$s</xliff:g> আইডির মাধ্যমে <xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করুন"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 23ed34c1..c2d452db 100644
--- a/packages/CredentialManager/res/values-bs/strings.xml
+++ b/packages/CredentialManager/res/values-bs/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Koristite 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="688557784207167647">"Koristite sačuvanu lozinku za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Koristite račun za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Koristite zaključavanje ekrana da se prijavite u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> pomoću korisničkog imena <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Otključajte načine 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Odaberite sačuvanu lozinku za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ca/strings.xml b/packages/CredentialManager/res/values-ca/strings.xml
index 0f96a9c..32405a4 100644
--- a/packages/CredentialManager/res/values-ca/strings.xml
+++ b/packages/CredentialManager/res/values-ca/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Utilitza la clau d\'accés desada per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Utilitza la contrasenya desada per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Utilitza el teu compte per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Utilitza el bloqueig de pantalla per iniciar la sessió a <xliff:g id="APP_NAME">%1$s</xliff:g> amb <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Desbloqueja les opcions d\'inici de sessió per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Tria una clau d\'accés desada per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Tria una clau d\'accés desada per a <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 64f52cd..ca7bdde 100644
--- a/packages/CredentialManager/res/values-cs/strings.xml
+++ b/packages/CredentialManager/res/values-cs/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Použijte pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> uložený přístupový klíč"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Použijte pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> uložené heslo"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Použijte pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> svůj účet"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Odemkněte 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Vyberte uložené heslo 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 14e68a1..a2c0cba2 100644
--- a/packages/CredentialManager/res/values-da/strings.xml
+++ b/packages/CredentialManager/res/values-da/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Brug din gemte adgangsnøgle til <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Brug din gemte adgangskode til <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Brug din konto til <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Lås loginmetoder for <xliff:g id="APP_NAME">%1$s</xliff:g> op"</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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Vælg en gemt adgangskode 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 fbcdc94..ccff535 100644
--- a/packages/CredentialManager/res/values-de/strings.xml
+++ b/packages/CredentialManager/res/values-de/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Gespeicherten Passkey für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Gespeichertes Passwort für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Dein Konto für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Ein gespeichertes Passwort für <xliff:g id="APP_NAME">%1$s</xliff:g> auswählen"</string>
diff --git a/packages/CredentialManager/res/values-es-rUS/strings.xml b/packages/CredentialManager/res/values-es-rUS/strings.xml
index 2a190a4..ef27359 100644
--- a/packages/CredentialManager/res/values-es-rUS/strings.xml
+++ b/packages/CredentialManager/res/values-es-rUS/strings.xml
@@ -20,7 +20,7 @@
<string name="app_name" msgid="4539824758261855508">"Credential Manager"</string>
<string name="string_cancel" msgid="6369133483981306063">"Cancelar"</string>
<string name="string_continue" msgid="1346732695941131882">"Continuar"</string>
- <string name="string_more_options" msgid="2763852250269945472">"Guardar otra forma"</string>
+ <string name="string_more_options" msgid="2763852250269945472">"Guardar de otra forma"</string>
<string name="string_learn_more" msgid="4541600451688392447">"Más información"</string>
<string name="content_description_show_password" msgid="3283502010388521607">"Mostrar contraseña"</string>
<string name="content_description_hide_password" msgid="6841375971631767996">"Ocultar contraseña"</string>
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"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="688557784207167647">"Usar la contraseña guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Usar tu cuenta para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Desbloquear las opciones para acceder 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Elige una contraseña 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 ef54dcb..ce2c123 100644
--- a/packages/CredentialManager/res/values-es/strings.xml
+++ b/packages/CredentialManager/res/values-es/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Usa 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="688557784207167647">"Usa la contraseña que tienes guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Usa tu cuenta para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Usa tu 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_unlock_options_for" msgid="7096423827682163270">"Desbloquea las opciones 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">"Elige una llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Elige una contraseña 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 582a0d0..662390a 100644
--- a/packages/CredentialManager/res/values-et/strings.xml
+++ b/packages/CredentialManager/res/values-et/strings.xml
@@ -40,7 +40,7 @@
<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>
<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_password_title" msgid="4481366993598649224">"Kas salvestada parool rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> sisselogimiseks?"</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>
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Kasutage 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="688557784207167647">"Kasutage rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud parooli"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Kasutage rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks kontot"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Avage rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks sisselogimisviisid"</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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Valige rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud parool"</string>
diff --git a/packages/CredentialManager/res/values-eu/strings.xml b/packages/CredentialManager/res/values-eu/strings.xml
index 4edf87d..6a4974d 100644
--- a/packages/CredentialManager/res/values-eu/strings.xml
+++ b/packages/CredentialManager/res/values-eu/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Erabili <xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gordetako sarbide-gakoa"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Erabili <xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gordetako pasahitza"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Erabili zure kontua <xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Desblokeatu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko aukerak"</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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Aukeratu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gordetako pasahitza"</string>
diff --git a/packages/CredentialManager/res/values-fi/strings.xml b/packages/CredentialManager/res/values-fi/strings.xml
index 806085a..7aa9cb1 100644
--- a/packages/CredentialManager/res/values-fi/strings.xml
+++ b/packages/CredentialManager/res/values-fi/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Käytä tallennettua avainkoodia: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Käytetä tallennettua salasanaa: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Käytä tiliä: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Kirjaudu sisään (<xliff:g id="APP_NAME">%1$s</xliff:g>) käyttämällä näytön lukituksen avaustapaa tilillä <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Avaa 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<xliff:g id="APP_NAME">%1$s</xliff:g>: valitse tallennettu salasana"</string>
diff --git a/packages/CredentialManager/res/values-fr/strings.xml b/packages/CredentialManager/res/values-fr/strings.xml
index 05c3473..c406857 100644
--- a/packages/CredentialManager/res/values-fr/strings.xml
+++ b/packages/CredentialManager/res/values-fr/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"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="688557784207167647">"Utiliser votre mot de passe enregistré pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Utiliser votre compte pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Choisir un mot de passe enregistré 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 9a3430f..c959ade 100644
--- a/packages/CredentialManager/res/values-gl/strings.xml
+++ b/packages/CredentialManager/res/values-gl/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Usa 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="688557784207167647">"Usa o contrasinal gardado para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Usa a túa conta para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Desbloquea 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Escolle un contrasinal gardado 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 23204c8..65c3eff 100644
--- a/packages/CredentialManager/res/values-gu/strings.xml
+++ b/packages/CredentialManager/res/values-gu/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે તમારી સાચવેલી પાસકીનો ઉપયોગ કરો"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે તમારા સાચવેલા પાસવર્ડનો ઉપયોગ કરો"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે તમારા એકાઉન્ટનો ઉપયોગ કરો"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> વડે <xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે તમારા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 c829c6b..b40648c 100644
--- a/packages/CredentialManager/res/values-hi/strings.xml
+++ b/packages/CredentialManager/res/values-hi/strings.xml
@@ -20,7 +20,7 @@
<string name="app_name" msgid="4539824758261855508">"CredentialManager"</string>
<string name="string_cancel" msgid="6369133483981306063">"रद्द करें"</string>
<string name="string_continue" msgid="1346732695941131882">"जारी रखें"</string>
- <string name="string_more_options" msgid="2763852250269945472">"दूसरा तरीका सेव करें"</string>
+ <string name="string_more_options" msgid="2763852250269945472">"दूसरे तरीके से सेव करें"</string>
<string name="string_learn_more" msgid="4541600451688392447">"ज़्यादा जानें"</string>
<string name="content_description_show_password" msgid="3283502010388521607">"पासवर्ड दिखाएं"</string>
<string name="content_description_hide_password" msgid="6841375971631767996">"पासवर्ड छिपाएं"</string>
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए, सेव की गई पासकी का इस्तेमाल करें"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए सेव किया हुआ पासवर्ड इस्तेमाल करें"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> में साइन करने के लिए अपने खाते का इस्तेमाल करें"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> से <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए, स्क्रीन लॉक का इस्तेमाल करें"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 5facb15..2d90646 100644
--- a/packages/CredentialManager/res/values-hr/strings.xml
+++ b/packages/CredentialManager/res/values-hr/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Upotrijebite spremljeni pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Upotrijebite spremljenu zaporku za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Upotrijebite račun za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Otključajte 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Odaberite spremljenu zaporku 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 14153c0..41fe127 100644
--- a/packages/CredentialManager/res/values-hu/strings.xml
+++ b/packages/CredentialManager/res/values-hu/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Mentett azonosítókulcs használata a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Mentett jelszó használata a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Fiók használata a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Mentett jelszó kiválasztása a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz"</string>
diff --git a/packages/CredentialManager/res/values-hy/strings.xml b/packages/CredentialManager/res/values-hy/strings.xml
index af97aa7..d23874b 100644
--- a/packages/CredentialManager/res/values-hy/strings.xml
+++ b/packages/CredentialManager/res/values-hy/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Օգտագործեք <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար պահված ձեր մուտքի բանալին"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Օգտագործեք <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար պահված ձեր գաղտնաբառը"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Օգտագործեք ձեր հաշիվը՝ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելված մուտք գործելու համար"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Օգտագործեք ձեր էկրանի կողպումը՝ <xliff:g id="USERNAME">%2$s</xliff:g> հաշվի միջոցով <xliff:g id="APP_NAME">%1$s</xliff:g> հավելված մուտք գործելու համար"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Ապակողպեք մուտք գործելու տարբերակներ <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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Ընտրեք պահված գաղտնաբառ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար"</string>
diff --git a/packages/CredentialManager/res/values-in/strings.xml b/packages/CredentialManager/res/values-in/strings.xml
index 7564afa..9f74b8e 100644
--- a/packages/CredentialManager/res/values-in/strings.xml
+++ b/packages/CredentialManager/res/values-in/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Gunakan kunci sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Gunakan sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Gunakan akun Anda untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Pilih 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 cc405b4..e5462d1 100644
--- a/packages/CredentialManager/res/values-is/strings.xml
+++ b/packages/CredentialManager/res/values-is/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"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="688557784207167647">"Nota vistað aðgangsorð fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Nota reikninginn þinn fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Opna innskráningaraðferð 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Veldu vistað aðgangsorð 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 94f90e2b..54c1fc3 100644
--- a/packages/CredentialManager/res/values-it/strings.xml
+++ b/packages/CredentialManager/res/values-it/strings.xml
@@ -40,7 +40,7 @@
<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>
<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_password_title" msgid="4481366993598649224">"Salvare la 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>
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Usa la passkey salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Usa la password salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Usa il tuo account per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Usa il blocco schermo per accedere all\'app <xliff:g id="APP_NAME">%1$s</xliff:g> con <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Sblocca 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Scegli una password salvata per <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 97506ec..2fd31ee 100644
--- a/packages/CredentialManager/res/values-kk/strings.xml
+++ b/packages/CredentialManager/res/values-kk/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған кіру кілті пайдаланыңыз"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған құпия сөзді пайдаланыңыз"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін аккаунтыңызды пайдаланыңыз"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына <xliff:g id="USERNAME">%2$s</xliff:g> аккаунтымен кіру үшін экран құлпын қолданыңыз."</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 2d46093..bfc31a1 100644
--- a/packages/CredentialManager/res/values-kn/strings.xml
+++ b/packages/CredentialManager/res/values-kn/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಸೇವ್ ಮಾಡಿದ ನಿಮ್ಮ ಪಾಸ್ಕೀ ಅನ್ನು ಬಳಸಿ"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಸೇವ್ ಮಾಡಿದ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಬಳಸಿ"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ <xliff:g id="USERNAME">%2$s</xliff:g> ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 0465c13..468f4e7 100644
--- a/packages/CredentialManager/res/values-ko/strings.xml
+++ b/packages/CredentialManager/res/values-ko/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에 대해 저장된 패스키를 사용하시겠습니까?"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에 대해 저장된 비밀번호를 사용하시겠습니까?"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱에 계정을 사용하시겠습니까?"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"화면 잠금을 사용하여 <xliff:g id="USERNAME">%2$s</xliff:g> 계정으로 <xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인합니다."</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 49f946d..4172b51 100644
--- a/packages/CredentialManager/res/values-ky/strings.xml
+++ b/packages/CredentialManager/res/values-ky/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн сакталган киргизүүчү ачкычты колдонуңуз"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн сакталган сырсөздү колдонуңуз"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн аккаунтуңузду колдонуңуз"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна <xliff:g id="USERNAME">%2$s</xliff:g> аккаунту менен кирүү үчүн экрандын кулпусун колдонуңуз"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 b476e2c..e236e09 100644
--- a/packages/CredentialManager/res/values-lt/strings.xml
+++ b/packages/CredentialManager/res/values-lt/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Naudokite išsaugotą prieigos raktą, skirtą programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Naudokite išsaugotą slaptažodį, skirtą programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Naudokite paskyrą, skirtą programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Atrakinkite prisijungimo parinktis, skirtas programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Išsaugoto slaptažodžio, 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 b3a733b..258f1b9 100644
--- a/packages/CredentialManager/res/values-lv/strings.xml
+++ b/packages/CredentialManager/res/values-lv/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Saglabātās piekļuves atslēgas izmantošana lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Saglabātās paroles izmantošana lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Sava konta izmantošana lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Izmantojiet ekrāna bloķēšanas opciju, 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_unlock_options_for" msgid="7096423827682163270">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> pierakstīšanās opciju atbloķēšana"</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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Saglabātas paroles izvēle lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-mk/strings.xml b/packages/CredentialManager/res/values-mk/strings.xml
index e7e8185..62806f6 100644
--- a/packages/CredentialManager/res/values-mk/strings.xml
+++ b/packages/CredentialManager/res/values-mk/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Користете го зачуваниот криптографски клуч за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Користете ја зачуваната лозинка за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Користете ја вашата сметка за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Користете го заклучувањето екран за да се најавувате на <xliff:g id="APP_NAME">%1$s</xliff:g> со <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Отклучете ги опциите за најавување за <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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Изберете зачувана лозинка за <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 3a2e73a..7eebec5 100644
--- a/packages/CredentialManager/res/values-mr/strings.xml
+++ b/packages/CredentialManager/res/values-mr/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमची सेव्ह केलेली पासकी वापरा"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमचा सेव्ह केलेला पासवर्ड वापरा"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमचे खाते वापरा"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> वापरून <xliff:g id="APP_NAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी तुमचे स्क्रीन लॉक वापरा"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 cf224da..2f6086a 100644
--- a/packages/CredentialManager/res/values-my/strings.xml
+++ b/packages/CredentialManager/res/values-my/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သင်သိမ်းထားသော လျှို့ဝှက်ကီးကို သုံးပါ"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သင်သိမ်းထားသော စကားဝှက်ကို သုံးပါ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သင့်အကောင့်ကို သုံးပါ"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="APP_NAME">%1$s</xliff:g> သို့ <xliff:g id="USERNAME">%2$s</xliff:g> ဖြင့် လက်မှတ်ထိုးဝင်ရန် သင့်ဖန်သားပြင်လော့ခ်ကို သုံးနိုင်သည်"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 a353784..07775e0 100644
--- a/packages/CredentialManager/res/values-ne/strings.xml
+++ b/packages/CredentialManager/res/values-ne/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> चलाउन सेभ गरिएको पासकी प्रयोग गर्नुहोस्"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> चलाउन सेभ गरिएको पासवर्ड प्रयोग गर्नुहोस्"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> चलाउन आफ्नो खाता प्रयोग गर्नुहोस्"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> प्रयोग गरी <xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न आफ्नो स्क्रिन लक प्रयोग गर्नुहोस्"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 1e2bbe8..336b29f 100644
--- a/packages/CredentialManager/res/values-or/strings.xml
+++ b/packages/CredentialManager/res/values-or/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଆପଣଙ୍କ ସେଭ କରାଯାଇଥିବା ପାସକୀ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଆପଣଙ୍କ ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଆପଣଙ୍କ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରନ୍ତୁ"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> ମାଧ୍ୟମରେ <xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବା ପାଇଁ ଆପଣଙ୍କ ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 1caec50..517fd82 100644
--- a/packages/CredentialManager/res/values-pa/strings.xml
+++ b/packages/CredentialManager/res/values-pa/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣੀ ਰੱਖਿਅਤ ਕੀਤੀ ਪਾਸਕੀ ਵਰਤੋ"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣਾ ਰੱਖਿਅਤ ਕੀਤਾ ਪਾਸਵਰਡ ਵਰਤੋ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣਾ ਖਾਤਾ ਵਰਤੋ"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> ਨਾਲ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਆਪਣੇ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 2a1b6a6..bc8a969 100644
--- a/packages/CredentialManager/res/values-pt-rBR/strings.xml
+++ b/packages/CredentialManager/res/values-pt-rBR/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"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="688557784207167647">"Usar a senha salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Usar sua conta para o app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Escolha uma senha salva para o 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 2a1b6a6..bc8a969 100644
--- a/packages/CredentialManager/res/values-pt/strings.xml
+++ b/packages/CredentialManager/res/values-pt/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"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="688557784207167647">"Usar a senha salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Usar sua conta para o app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Escolha uma senha 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 2fd84cf..9e42dbb 100644
--- a/packages/CredentialManager/res/values-ro/strings.xml
+++ b/packages/CredentialManager/res/values-ro/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Folosește cheia de acces salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Folosește parola salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Folosește-ți contul pentru <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Deblochează 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Alege o parolă 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 690af93..ec2a2d6 100644
--- a/packages/CredentialManager/res/values-ru/strings.xml
+++ b/packages/CredentialManager/res/values-ru/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Используйте сохраненный ключ доступа для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Используйте сохраненный пароль для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Используйте аккаунт для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Используйте способ разблокировки экрана для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" (<xliff:g id="USERNAME">%2$s</xliff:g>)."</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Разблокируйте способы входа для приложения \"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Выберите сохраненный пароль для приложения \"<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 f5696f7..dc0d846 100644
--- a/packages/CredentialManager/res/values-si/strings.xml
+++ b/packages/CredentialManager/res/values-si/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ සුරැකි මුරයතුර භාවිතා කරන්න"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ සුරැකි මුරපදය භාවිතා කරන්න"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ ගිණුම භාවිතා කරන්න"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> සමඟින් <xliff:g id="APP_NAME">%1$s</xliff:g> වෙත පුරනය වීමට ඔබේ තිර අගුල භාවිත කරන්න"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 4029c53..8e6b32c 100644
--- a/packages/CredentialManager/res/values-sk/strings.xml
+++ b/packages/CredentialManager/res/values-sk/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Použite svoj uložený prístupový kľúč pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Použite uložené heslo pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Použite svoj účet pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Odomknite 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Vyberte uložené heslo 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 c9c1091..437ced1 100644
--- a/packages/CredentialManager/res/values-sl/strings.xml
+++ b/packages/CredentialManager/res/values-sl/strings.xml
@@ -48,7 +48,7 @@
<string name="passwords" msgid="5419394230391253816">"gesel"</string>
<string name="sign_ins" msgid="4710739369149469208">"prijave"</string>
<string name="sign_in_info" msgid="2627704710674232328">"podatkov za prijavo"</string>
- <string name="save_credential_to_title" msgid="3172811692275634301">"Mesto shranjevanja: <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g>"</string>
+ <string name="save_credential_to_title" msgid="3172811692275634301">"Mesto shranjevanja za: <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g>"</string>
<string name="create_passkey_in_other_device_title" msgid="2360053098931886245">"Želite ustvariti ključ za dostop v drugi napravi?"</string>
<string name="save_password_on_other_device_title" msgid="5829084591948321207">"Želite shraniti geslo v drugi napravi?"</string>
<string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"Želite shraniti prijavo v drugi napravi?"</string>
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Uporaba shranjenega ključa za dostop za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Uporaba shranjenega gesla za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Uporaba vašega računa za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Odklepanje 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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Izberite shranjeno geslo za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sq/strings.xml b/packages/CredentialManager/res/values-sq/strings.xml
index 73ac0b3..8dc0fc2 100644
--- a/packages/CredentialManager/res/values-sq/strings.xml
+++ b/packages/CredentialManager/res/values-sq/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Përdor fjalëkalimin tënd të ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Përdor fjalëkalimin tënd të ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Përdor llogarinë tënde për <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Përdor kyçjen e ekranit për t\'u identifikuar në \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" me <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Shkyç opsionet e identifikimit për <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Zgjidh një çelës kalimi të ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Zgjidh një fjalëkalim të ruajtur për <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 a87636b..d28cefe 100644
--- a/packages/CredentialManager/res/values-sr/strings.xml
+++ b/packages/CredentialManager/res/values-sr/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Користите сачувани приступни кључ за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Користите сачувану лозинку за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Користите налог за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Користите откључавање екрана да бисте се пријавили у апликацију <xliff:g id="APP_NAME">%1$s</xliff:g> као <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Откључајте опције пријављивања за: <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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Изаберите сачувану лозинку за: <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 e5480a4..3386373 100644
--- a/packages/CredentialManager/res/values-sw/strings.xml
+++ b/packages/CredentialManager/res/values-sw/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Tumia ufunguo wako wa siri uliohifadhi wa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Tumia nenosiri lako ulilohifadhi la <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Tumia akaunti yako ya <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Fungua chaguo za kuingia katika akaunti ya <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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Chagua nenosiri lililohifadhiwa ambalo 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 59b86eb..3b98438 100644
--- a/packages/CredentialManager/res/values-te/strings.xml
+++ b/packages/CredentialManager/res/values-te/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సేవ్ చేసిన పాస్-కీ వివరాలను ఉపయోగించండి"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సేవ్ చేసిన పాస్వర్డ్ను ఉపయోగించండి"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ ఖాతాను ఉపయోగించండి"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"మీ స్క్రీన్ లాక్ను ఉపయోగించి <xliff:g id="USERNAME">%2$s</xliff:g>తో <xliff:g id="APP_NAME">%1$s</xliff:g>కు సైన్ ఇన్ చేయండి"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 e8058e8..bb47574 100644
--- a/packages/CredentialManager/res/values-th/strings.xml
+++ b/packages/CredentialManager/res/values-th/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"ใช้พาสคีย์ที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"ใช้รหัสผ่านที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"ใช้บัญชีสำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"ใช้การล็อกหน้าจอเพื่อลงชื่อเข้าใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ด้วย <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"ปลดล็อกตัวเลือกการลงชื่อเข้าใช้สำหรับ <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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"เลือกรหัสผ่านที่บันทึกไว้สำหรับ <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 cf6b2e3..3c9c3b7 100644
--- a/packages/CredentialManager/res/values-tr/strings.xml
+++ b/packages/CredentialManager/res/values-tr/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı geçiş anahtarınızı kullanın"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı şifrenizi kullanın"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> için hesabınızı kullanın"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<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_unlock_options_for" msgid="7096423827682163270">"<xliff:g id="APP_NAME">%1$s</xliff:g> için oturum açma seçeneklerinin kilidini açın"</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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı bir şifre kullanın"</string>
diff --git a/packages/CredentialManager/res/values-uk/strings.xml b/packages/CredentialManager/res/values-uk/strings.xml
index 6b0590a..a3f79ca 100644
--- a/packages/CredentialManager/res/values-uk/strings.xml
+++ b/packages/CredentialManager/res/values-uk/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Використайте свій збережений ключ доступу для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"Використайте свій збережений пароль для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Використайте свій обліковий запис для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"Використовуйте свій спосіб розблокування екрана, щоб входити в додаток <xliff:g id="APP_NAME">%1$s</xliff:g> як користувач <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"Розблокуйте способи входу для додатка <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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Виберіть збережений пароль для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ur/strings.xml b/packages/CredentialManager/res/values-ur/strings.xml
index ff3f0d3..1a39abb 100644
--- a/packages/CredentialManager/res/values-ur/strings.xml
+++ b/packages/CredentialManager/res/values-ur/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اپنی محفوظ کردہ پاس کی استعمال کریں"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> کیلئے آپ کا محفوظ کردہ پاس ورڈ استعمال کریں"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اپنا اکاؤنٹ استعمال کریں"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<xliff:g id="USERNAME">%2$s</xliff:g> کے ساتھ <xliff:g id="APP_NAME">%1$s</xliff:g> میں سائن ان کرنے کے لیے اپنا اسکرین لاک استعمال کریں"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<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 7bb974a..db0c96b 100644
--- a/packages/CredentialManager/res/values-uz/strings.xml
+++ b/packages/CredentialManager/res/values-uz/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga saqlangan kalit orqali kiring"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan parol orqali kiring"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga hisobingiz orqali kiring"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"<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_unlock_options_for" msgid="7096423827682163270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga kirish usulini tasdiqlang"</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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan parolni tanlang"</string>
diff --git a/packages/CredentialManager/res/values-vi/strings.xml b/packages/CredentialManager/res/values-vi/strings.xml
index aa253a4..91eecd8 100644
--- a/packages/CredentialManager/res/values-vi/strings.xml
+++ b/packages/CredentialManager/res/values-vi/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"Dùng khoá truy cậ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="688557784207167647">"Dùng mật khẩu bạn đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"Dùng tài khoản của bạn cho <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"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_unlock_options_for" msgid="7096423827682163270">"Mở khoá các phương thức đă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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Chọn mật khẩu đã 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 42dbfaf..4d6a371 100644
--- a/packages/CredentialManager/res/values-zh-rCN/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rCN/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"使用已保存的通行密钥登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"使用已保存的密码登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"使用您的账号登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"使用您的屏锁以 <xliff:g id="USERNAME">%2$s</xliff:g> 的身份登录 <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"解锁“<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"选择一个已保存的密码来登录“<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 56e0b90..44f5eaa 100644
--- a/packages/CredentialManager/res/values-zh-rHK/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rHK/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"使用已儲存的 <xliff:g id="APP_NAME">%1$s</xliff:g> 密鑰"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"使用已儲存的 <xliff:g id="APP_NAME">%1$s</xliff:g> 密碼"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"透過你的帳戶使用 <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"使用螢幕鎖定方式以 <xliff:g id="USERNAME">%2$s</xliff:g> 登入 <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"解鎖 <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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"選擇已儲存的「<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 59d0607..d5f3093 100644
--- a/packages/CredentialManager/res/values-zh-rTW/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rTW/strings.xml
@@ -71,8 +71,7 @@
<string name="get_dialog_title_use_passkey_for" msgid="479261099705979148">"使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼金鑰"</string>
<string name="get_dialog_title_use_password_for" msgid="688557784207167647">"使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="4233553937542583226">"使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」的帳戶"</string>
- <!-- no translation found for get_dialog_description_single_tap (2797059565126030879) -->
- <skip />
+ <string name="get_dialog_description_single_tap" msgid="2797059565126030879">"用 <xliff:g id="USERNAME">%2$s</xliff:g> 登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」時使用螢幕鎖定功能進行驗證"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7096423827682163270">"解鎖「<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>
<string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"選擇已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼"</string>
diff --git a/packages/InputDevices/res/values-be/strings.xml b/packages/InputDevices/res/values-be/strings.xml
index a8c11be..011ad66 100644
--- a/packages/InputDevices/res/values-be/strings.xml
+++ b/packages/InputDevices/res/values-be/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Беларуская"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Мангольская"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Грузінская"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Тайская (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-bg/strings.xml b/packages/InputDevices/res/values-bg/strings.xml
index 6d82a0b..68f120a 100644
--- a/packages/InputDevices/res/values-bg/strings.xml
+++ b/packages/InputDevices/res/values-bg/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"беларуски"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"монголски"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"грузински"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"тайландски (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-bn/strings.xml b/packages/InputDevices/res/values-bn/strings.xml
index 3fc1315..74b2462 100644
--- a/packages/InputDevices/res/values-bn/strings.xml
+++ b/packages/InputDevices/res/values-bn/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"বেলারুশীয়"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"মঙ্গোলিয়ান"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"জর্জিয়ান"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"থাই (কেডমানি)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-bs/strings.xml b/packages/InputDevices/res/values-bs/strings.xml
index b2cf525..ea8d91e 100644
--- a/packages/InputDevices/res/values-bs/strings.xml
+++ b/packages/InputDevices/res/values-bs/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"bjeloruska"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"mongolski"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"gruzijski"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"tajlandski (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-da/strings.xml b/packages/InputDevices/res/values-da/strings.xml
index 4a6c70c..e399f2c 100644
--- a/packages/InputDevices/res/values-da/strings.xml
+++ b/packages/InputDevices/res/values-da/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Hviderussisk"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongolsk"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgisk"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Thai (kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-de/strings.xml b/packages/InputDevices/res/values-de/strings.xml
index 628a742..75fb724 100644
--- a/packages/InputDevices/res/values-de/strings.xml
+++ b/packages/InputDevices/res/values-de/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Belarussisch"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongolisch"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgisch"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Thailändisch (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-es-rUS/strings.xml b/packages/InputDevices/res/values-es-rUS/strings.xml
index 05f5473..755491e 100644
--- a/packages/InputDevices/res/values-es-rUS/strings.xml
+++ b/packages/InputDevices/res/values-es-rUS/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Bielorruso"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongol"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgiano"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Tailandés (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-es/strings.xml b/packages/InputDevices/res/values-es/strings.xml
index cd68ad8..9387812 100644
--- a/packages/InputDevices/res/values-es/strings.xml
+++ b/packages/InputDevices/res/values-es/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Bielorruso"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongol"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgiano"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Tailandés (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-et/strings.xml b/packages/InputDevices/res/values-et/strings.xml
index 9b37264..1543669 100644
--- a/packages/InputDevices/res/values-et/strings.xml
+++ b/packages/InputDevices/res/values-et/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"valgevene"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"mongoli"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"gruusia"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"tai (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml
index 61c6415..098ed6f 100644
--- a/packages/InputDevices/res/values-eu/strings.xml
+++ b/packages/InputDevices/res/values-eu/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Bielorrusiarra"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongoliarra"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgiarra"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Thailandiarra (kedmanee-a)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-fi/strings.xml b/packages/InputDevices/res/values-fi/strings.xml
index 0e8efff..567c416 100644
--- a/packages/InputDevices/res/values-fi/strings.xml
+++ b/packages/InputDevices/res/values-fi/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"valkovenäjä"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"mongoli"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"georgia"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"thai (kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-gl/strings.xml b/packages/InputDevices/res/values-gl/strings.xml
index 827071e..897f7d2 100644
--- a/packages/InputDevices/res/values-gl/strings.xml
+++ b/packages/InputDevices/res/values-gl/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Belaruso"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongol"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Xeorxiano"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Tailandés (kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-gu/strings.xml b/packages/InputDevices/res/values-gu/strings.xml
index df095ae..3627c5c 100644
--- a/packages/InputDevices/res/values-gu/strings.xml
+++ b/packages/InputDevices/res/values-gu/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"બેલારુશિયન"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"મોંગોલિયન"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"જ્યોર્જિઅન"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"થાઇ (કેડમાની)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml
index 550759d..4fbcde0 100644
--- a/packages/InputDevices/res/values-hi/strings.xml
+++ b/packages/InputDevices/res/values-hi/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"बेलारूसी"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"मंगोलियन"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"जॉर्जियन कीबोर्ड का लेआउट"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"थाई (केडमेनी)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-hr/strings.xml b/packages/InputDevices/res/values-hr/strings.xml
index e955e77..c5f46c4 100644
--- a/packages/InputDevices/res/values-hr/strings.xml
+++ b/packages/InputDevices/res/values-hr/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"bjeloruski"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongolski"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Gruzijska"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"tajlandski (kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-hy/strings.xml b/packages/InputDevices/res/values-hy/strings.xml
index 9722342..cf0a9c7 100644
--- a/packages/InputDevices/res/values-hy/strings.xml
+++ b/packages/InputDevices/res/values-hy/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"բելառուսերեն"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Մոնղոլերեն"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"վրացերեն"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"թայերեն (քեդմանի)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-kk/strings.xml b/packages/InputDevices/res/values-kk/strings.xml
index 43bea18..4c7779e 100644
--- a/packages/InputDevices/res/values-kk/strings.xml
+++ b/packages/InputDevices/res/values-kk/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Белорус"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Моңғол"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Грузин"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Тай (кедмани)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ko/strings.xml b/packages/InputDevices/res/values-ko/strings.xml
index b442492..6c06d2d 100644
--- a/packages/InputDevices/res/values-ko/strings.xml
+++ b/packages/InputDevices/res/values-ko/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"벨라루스어"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"몽골어"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"조지아어"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"태국어(Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ky/strings.xml b/packages/InputDevices/res/values-ky/strings.xml
index 36cd539..67047d3 100644
--- a/packages/InputDevices/res/values-ky/strings.xml
+++ b/packages/InputDevices/res/values-ky/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Беларусча"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Монголчо"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Грузинче"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Тайча (Kedmanee баскычтобу)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-mk/strings.xml b/packages/InputDevices/res/values-mk/strings.xml
index c2bc8c0..16df119 100644
--- a/packages/InputDevices/res/values-mk/strings.xml
+++ b/packages/InputDevices/res/values-mk/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"белоруски"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"монголски"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"грузиски"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"тајландски (кедмани)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-mn/strings.xml b/packages/InputDevices/res/values-mn/strings.xml
index 7aad90d..f013532 100644
--- a/packages/InputDevices/res/values-mn/strings.xml
+++ b/packages/InputDevices/res/values-mn/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Беларусь хэл"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Монгол"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Гүрж"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Тай (кедмани)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-my/strings.xml b/packages/InputDevices/res/values-my/strings.xml
index d87a7b4..4d71a7b 100644
--- a/packages/InputDevices/res/values-my/strings.xml
+++ b/packages/InputDevices/res/values-my/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"ဘီလာရုဇ်"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"မွန်ဂိုလီးယား"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"ဂျော်ဂျီယာ"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"ထိုင်း (ကတ်မနီး)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-nl/strings.xml b/packages/InputDevices/res/values-nl/strings.xml
index a93772f..bb8acd0 100644
--- a/packages/InputDevices/res/values-nl/strings.xml
+++ b/packages/InputDevices/res/values-nl/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Wit-Russisch"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongools"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgisch"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Thai (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-or/strings.xml b/packages/InputDevices/res/values-or/strings.xml
index 47af22e..d1c2ccc 100644
--- a/packages/InputDevices/res/values-or/strings.xml
+++ b/packages/InputDevices/res/values-or/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"ବେଲାରୁସିଆନ୍"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"ମଙ୍ଗୋଲିଆନ୍"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"ଜର୍ଜିଆନ୍"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"ଥାଇ (କେଡମାନି)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-pt-rBR/strings.xml b/packages/InputDevices/res/values-pt-rBR/strings.xml
index aba7afc4..24db406 100644
--- a/packages/InputDevices/res/values-pt-rBR/strings.xml
+++ b/packages/InputDevices/res/values-pt-rBR/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Bielorrusso"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongol"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgiano"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Tailandês (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-pt/strings.xml b/packages/InputDevices/res/values-pt/strings.xml
index aba7afc4..24db406 100644
--- a/packages/InputDevices/res/values-pt/strings.xml
+++ b/packages/InputDevices/res/values-pt/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Bielorrusso"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongol"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgiano"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Tailandês (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ro/strings.xml b/packages/InputDevices/res/values-ro/strings.xml
index 4cdd54a..49cb306 100644
--- a/packages/InputDevices/res/values-ro/strings.xml
+++ b/packages/InputDevices/res/values-ro/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Belarusă"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongolă"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgiană"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Thailandeză (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sl/strings.xml b/packages/InputDevices/res/values-sl/strings.xml
index ab70e08..36f10c7 100644
--- a/packages/InputDevices/res/values-sl/strings.xml
+++ b/packages/InputDevices/res/values-sl/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"beloruščina"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"mongolščina"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"gruzinščina"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"tajščina (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sq/strings.xml b/packages/InputDevices/res/values-sq/strings.xml
index d01b2bc..51da8d7 100644
--- a/packages/InputDevices/res/values-sq/strings.xml
+++ b/packages/InputDevices/res/values-sq/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Bjellorusisht"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongolisht"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Gjeorgjisht"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Tajlandisht (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sv/strings.xml b/packages/InputDevices/res/values-sv/strings.xml
index a255d24..878f1ed 100644
--- a/packages/InputDevices/res/values-sv/strings.xml
+++ b/packages/InputDevices/res/values-sv/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"vitryska"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"mongoliska"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"georgiska"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Thai (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ta/strings.xml b/packages/InputDevices/res/values-ta/strings.xml
index 355f78d..e6edc61 100644
--- a/packages/InputDevices/res/values-ta/strings.xml
+++ b/packages/InputDevices/res/values-ta/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"பெலரூசியன்"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"மங்கோலியன்"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"ஜார்ஜியன்"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"தாய் (கேட்மேனி)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-tl/strings.xml b/packages/InputDevices/res/values-tl/strings.xml
index 21ad909..c82a067 100644
--- a/packages/InputDevices/res/values-tl/strings.xml
+++ b/packages/InputDevices/res/values-tl/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Belarusian"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Mongolian"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Georgian"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Thai (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-tr/strings.xml b/packages/InputDevices/res/values-tr/strings.xml
index a1ac7fd..74b77e7 100644
--- a/packages/InputDevices/res/values-tr/strings.xml
+++ b/packages/InputDevices/res/values-tr/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Belarusça"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Moğolca"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Gürcüce"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Tayca (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-uk/strings.xml b/packages/InputDevices/res/values-uk/strings.xml
index dcc5bcf..e78d826 100644
--- a/packages/InputDevices/res/values-uk/strings.xml
+++ b/packages/InputDevices/res/values-uk/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Білоруська"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Монгольська"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Грузинська"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Тайська (кедмані)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-vi/strings.xml b/packages/InputDevices/res/values-vi/strings.xml
index f7c3658..d58ac65 100644
--- a/packages/InputDevices/res/values-vi/strings.xml
+++ b/packages/InputDevices/res/values-vi/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Tiếng Belarus"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Tiếng Mông Cổ"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"Tiếng Georgia"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"Tiếng Thái (Kedmanee)"</string>
</resources>
diff --git a/packages/InputDevices/res/values-zh-rCN/strings.xml b/packages/InputDevices/res/values-zh-rCN/strings.xml
index 7d0a128..6a1a5b1 100644
--- a/packages/InputDevices/res/values-zh-rCN/strings.xml
+++ b/packages/InputDevices/res/values-zh-rCN/strings.xml
@@ -50,6 +50,5 @@
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"白俄罗斯语"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"蒙古语"</string>
<string name="keyboard_layout_georgian" msgid="4596185456863747454">"格鲁吉亚语"</string>
- <!-- no translation found for keyboard_layout_thai_kedmanee (6637147314580760938) -->
- <skip />
+ <string name="keyboard_layout_thai_kedmanee" msgid="6637147314580760938">"泰语 (Kedmanee)"</string>
</resources>
diff --git a/packages/PackageInstaller/AndroidManifest.xml b/packages/PackageInstaller/AndroidManifest.xml
index bf69d3b..4437475 100644
--- a/packages/PackageInstaller/AndroidManifest.xml
+++ b/packages/PackageInstaller/AndroidManifest.xml
@@ -23,6 +23,7 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" />
+ <uses-permission android:name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER" />
<uses-permission android:name="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" />
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.xml
index 77979f0..8755247 100644
--- a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.xml
@@ -16,11 +16,12 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:viewportWidth="18"
- android:viewportHeight="18"
- android:width="24dp"
- android:height="24dp">
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="@color/settingslib_materialColorOnPrimaryContainer">
<path
- android:pathData="M7 10l5 5 5 -5z"
- android:fillColor="@color/settingslib_materialColorOnPrimaryContainer"/>
+ android:fillColor="@android:color/white"
+ android:pathData="M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6 -1.41,-1.41z"/>
</vector>
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt
index 8f67354..7ea4b18 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt
@@ -27,7 +27,7 @@
import kotlinx.coroutines.flow.flowOn
/** Content change flow for the given [uri]. */
-internal fun Context.contentChangeFlow(
+fun Context.contentChangeFlow(
uri: Uri,
sendInitial: Boolean = true,
): Flow<Unit> = callbackFlow {
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index dde6041..f9800b3 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Gekoppel (geen foon nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Gekoppel (geen media nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Gekoppel (geen foon of media nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktief, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterykrag"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktief, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterykrag, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterykrag"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterykrag"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterykrag, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterykrag"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Links <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Regs <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktief"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Gestoor"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktief, net links"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktief, net regs"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktief, links en regs"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktiewe (net media), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-battery"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiewe (net media), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>-battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>-battery"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Gekoppelde (steun oudiodeling), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-battery"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Gekoppelde (steun oudiodeling), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>-battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>-battery"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Gekoppelde (steun oudiodeling), linkerkantse <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Gekoppelde (steun oudiodeling), regterkantse <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktief (net media)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Steun oudiodeling"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktief (net media), net linkerkant"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index ccd2beb..729ac28 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"ተገናኝቷል (ምንም ስልክ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"ተገናኝቷል (ምንም ማህደረ መረጃ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"ተገናኝቷል (ምንም ስልክ ወይም ማህደረ መረጃ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ንቁ፣ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ገቢር፣ ግ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ባትሪ፣ ቀ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ባትሪ"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"ግ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ባትሪ፣ ቀ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ባትሪ"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ግራ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ቀኝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ንቁ"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"ተቀምጧል"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ገቢር፣ ግራ ብቻ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ገቢር፣ ቀኝ ብቻ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ገቢር፣ ግራ እና ቀኝ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"ገቢር (ሚዲያ ብቻ), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"ገቢር (ሚዲያ ብቻ), ግ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ባትሪ፣ ቀ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ባትሪ"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"የተገናኘ (የድምፅ ማጋራት ይደግፋል), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"የተገናኘ (የድምፅ ማጋራት ይደግፋል) ግ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ባትሪ፣ ቀ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ባትሪ"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"የተገናኘ (የድምፅ ማጋራት ይደግፋል)፣ ግራ<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"የተገናኘ (የድምፅ ማጋራት ይደግፋል)፣ ቀኝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"ገቢር (ሚዲያ ብቻ)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ድምፅ ማጋራትን ይደግፋል"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"ገቢር (ሚዲያ ብቻ)፣ ግራ ብቻ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 40e836e..9f13551 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"متّصل (بدون هاتف)، ومستوى البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"متّصل (بدون وسائط)، ومستوى البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"متّصل (بدون هاتف أو وسائط)، ومستوى البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"نشط، ومستوى البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"مفعّلة، مستوى البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، المعدّل: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"مستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"مستوى شحن البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"مستوى البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، المعدّل: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"مستوى شحن البطارية في سماعة الرأس اليسرى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"مستوى شحن البطارية في سماعة الرأس اليمنى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"نشط"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"محفوظ"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"السمّاعة الطبية اليسرى فقط مفعَّلة"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"السمّاعة الطبية اليمنى فقط مفعَّلة"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"السمّاعتان اليسرى واليمنى مفعَّلتان"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"البلوتوث مفعَّل (للوسائط فقط)، مستوى شحن البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"البلوتوث مفعَّل (للوسائط فقط)، مستوى الشحن في السماعة اليسرى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، مستوى الشحن في السماعة اليمنى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"البلوتوث متصل (ميزة \"مشاركة الصوت\" متاحة)، مستوى شحن البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"البلوتوث متصل (ميزة \"مشاركة الصوت\" متاحة)، مستوى الشحن في السماعة اليسرى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، مستوى الشحن في السماعة اليمنى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"البلوتوث متصل (ميزة \"مشاركة الصوت\" متاحة)، مستوى الشحن في السماعة اليسرى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"البلوتوث متصل (ميزة \"مشاركة الصوت\" متاحة)، مستوى الشحن في السماعة اليمنى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"البلوتوث مفعَّل (للوسائط فقط)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"تتوفّر ميزة \"مشاركة الصوت\""</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"السماعة اليسرى فقط مشغَّلة (للوسائط فقط)"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 0ec52d9..62c1201 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"সংযোগ কৰা হ’ল (ফ\'ন নাই), বেটাৰীৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"সংযোগ কৰা হ’ল (মিডিয়া নাই), বেটাৰীৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"সংযোগ কৰা হ’ল (কোনো ফ\'ন বা মিডিয়া নাই), বেটাৰীৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"সক্ৰিয়, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰী"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"সক্ৰিয়, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> বেটাৰী, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> বেটাৰী"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰী"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"বেটাৰী <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> বেটাৰী, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> বেটাৰী"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"বাওঁফালে <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"সোঁফালে <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"সক্ৰিয়"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"ছেভ কৰা হৈছে"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"কেৱল বাঁওফালৰটো সক্ৰিয় হৈছে"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"কেৱল সোঁফালৰটো সক্ৰিয় হৈছে"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"বাওঁ আৰু সোঁ দুয়োফালৰ সক্ৰিয় হৈছে"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"সক্ৰিয় হৈ আছে (কেৱল মিডিয়া), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰী"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"সক্ৰিয় হৈ আছে (কেৱল মিডিয়া), বাওঁ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> বেটাৰী, সোঁ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> বেটাৰী"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"সংযুক্ত হৈ আছে (অডিঅ’ শ্বেয়াৰিং সমৰ্থন কৰে), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰী"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"সংযুক্ত হৈ আছে (অডিঅ’ শ্বেয়াৰিং সমৰ্থন কৰে), বাওঁ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> বেটাৰী, সোঁ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> বেটাৰী"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"সংযুক্ত হৈ আছে (অডিঅ’ শ্বেয়াৰিং সমৰ্থন কৰে), বাওঁ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"সংযুক্ত হৈ আছে (অডিঅ’ শ্বেয়াৰিং সমৰ্থন কৰে), সোঁ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"সক্ৰিয় হৈ আছে (কেৱল মিডিয়া)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"অডিঅ’ শ্বেয়াৰিং সমৰ্থন কৰে"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"সক্ৰিয় হৈ আছে (কেৱল মিডিয়া), কেৱল বাওঁ"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index e97f999..b1bbf34 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Qoşuludur (telefon yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Qoşuludur (media yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Qoşuludur (telefon və ya media yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batareya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batareya"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batareya: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batareya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batareya"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Sol <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Sağ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Yadda saxlandı"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, yalnız sol"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, yalnız sağ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, sol və sağ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktiv (yalnız media), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiv (yalnız media), Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batareya, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batareya"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Qoşulub (audio paylaşma dəstəklənir), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Qoşulub (audio paylaşma dəstəklənir), Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batareya, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batareya"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Qoşulub (audio paylaşma dəstəklənir), sol <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Qoşulub (audio paylaşma dəstəklənir), sağ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktiv (yalnız media)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Audio paylaşma dəstəklənir"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktiv (yalnız media), yalnız sol"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 22aa147..4af26f2 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Povezano (bez telefona), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Povezano (bez medija), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Povezano (bez telefona ili medija), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivan, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterije, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterija, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterije, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Leva <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Desna <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivan"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Sačuvano"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo s leve strane"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, s desne strane"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, s leve i desne strane"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktivan (samo za medije), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktivan (samo za medije), levo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterije, desno: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Povezan (podržava deljenje zvuka), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Povezan (podržava deljenje zvuka), levo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterije, desno: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Povezan (podržava deljenje zvuka), levo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Povezan (podržava deljenje zvuka), desno <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktivan (samo za medije)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Podržava deljenje zvuka"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktivan (samo za medije), samo levo"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 2658891..9998c9e 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без званкоў). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без аўдыя). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без званкоў і аўдыя). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Уключана, зарад <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Актыўна, Л: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, П: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Узровень зараду: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, П: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Левы: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Правы: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Уключана"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Захавана"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Уключана, толькі для левага вуха"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Уключана, толькі для правага вуха"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Уключана, для левага і правага вуха"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Выкарыстоўваецца (толькі для мультымедыя), зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Выкарыстоўваецца (толькі для мультымедыя), зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (левы навушнік), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (правы навушнік)"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Падключана (падтрымліваецца абагульванне аўдыя), зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Падключана (падтрымліваецца абагульванне аўдыя), зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (левы навушнік), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (правы навушнік)"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Падключана (падтрымліваецца абагульванне аўдыя), зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (левы навушнік)"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Падключана (падтрымліваецца абагульванне аўдыя), зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (правы навушнік)"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Выкарыстоўваецца (толькі для мультымедыя)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Падтрымліваецца абагульванне аўдыя"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Выкарыстоўваецца (толькі для мультымедыя), толькі левы навушнік"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – да поўнай зарадкі засталося: <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – Зарадка аптымізавана"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – зараджаецца"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – Прылада зарадзіцца поўнасцю да <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – Прылада зарадзіцца поўнасцю да <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Прылада зарадзіцца поўнасцю да <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Прылада зарадзіцца поўнасцю да <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Невядома"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Зарадка"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Хуткая зарадка"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Зараджаны"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Акумулятар поўнасцю зараджаны"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Зарадка прыпынена"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Ідзе зарадка"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ідзе хуткая зарадка"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Кантралюецца адміністратарам"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Пад кіраваннем Абмежаванага наладжвання"</string>
<string name="disabled" msgid="8017887509554714950">"Адключанае"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Адна планка на тэлефоне."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"2 планкі тэлефона."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"3 планкі тэлефона."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Магутнасць сігналу: чатыры палоскі."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Поўны сігнал тэлефона."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Няма дадзеных."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Адна планка дадзеных."</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 85eaccd..03065c6 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Свързано (без телефон), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Свързано (без мултимедия), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Свързано (без телефон или мултимедия), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активно. Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активно. Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерия. Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерия"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерия. Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерия"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Вляво: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Вдясно: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активно"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Запазено"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно – само лявото"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно – само дясното"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно – лявото и дясното"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Активно (само за мултимедия), батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Активно (само за мултимедия), Л: батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Д: батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Свързано (поддържа споделяне на звука), батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Свързано (поддържа споделяне на звука), Л: батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Д: батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Свързано (поддържа споделяне на звука), лява – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Свързано (поддържа споделяне на звука), дясна – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Активно (само за мултимедия)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Поддържа споделяне на звука"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Активно (само за мултимедия), само лявата"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – Оставащо време до пълно зареждане: <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – Зареждането е оптимизирано"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – зарежда се"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – ще се зареди напълно до <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – ще се зареди напълно до <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Ще се зареди напълно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Ще се зареди напълно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Неизвестно"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Зарежда се"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Зарежда се бързо"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Заредена"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Напълно заредено"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Зареждането е поставено на пауза"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Зарежда се"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Зарежда се бързо"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролира се от администратор"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Управлява се чрез ограничена настройка"</string>
<string name="disabled" msgid="8017887509554714950">"Деактивирано"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Телефонът е с една чертичка."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Телефонът е с две чертички."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Телефонът е с три чертички."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Телефонът е с четири чертички."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Сигналът за телефона е пълен."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Няма данни."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Данните са с една чертичка."</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index d4485b8..b69a542 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"কানেক্ট করা আছে (ফোনের অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"কানেক্ট করা আছে (মিডিয়ার অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"কানেক্ট করা আছে (ফোনের বা মিডিয়ার অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"চালু আছে, চার্জ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"চালু, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ব্যাটারি, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ব্যাটারি"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"চার্জ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ব্যাটারি, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ব্যাটারি"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"বাঁদিকের হেডসেটে <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বাকি আছে"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ডানদিকের হেডসেটে <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বাকি আছে"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"চালু আছে"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"সেভ করা আছে"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"শুধুমাত্র বাঁদিকের হিয়ারিং এড অ্যাক্টিভ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"শুধুমাত্র ডানদিকের হিয়ারিং এড অ্যাক্টিভ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"বাঁ ও ডানদিকের হিয়ারিং এড, অ্যাক্টিভ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"চালু আছে (শুধুমাত্র মিডিয়া), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ব্যাটারি"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"চালু আছে (শুধুমাত্র মিডিয়া), বাঁদিক: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ব্যাটারি, ডানদিক: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ব্যাটারি"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"কানেক্ট করা আছে (অডিও শেয়ারিংয়ে কাজ করে), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ব্যাটারি"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"কানেক্ট করা আছে (অডিও শেয়ারিংয়ে কাজ করে), বাঁদিক: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ব্যাটারি, ডানদিক: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ব্যাটারি"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"কানেক্ট করা আছে (অডিও শেয়ারিংয়ে কাজ করে), বাঁদিক <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"কানেক্ট করা আছে (অডিও শেয়ারিংয়ে কাজ করে), ডানদিক <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"চালু আছে (শুধুমাত্র মিডিয়া)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"অডিও শেয়ারিংয়ে কাজ করে"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"চালু আছে (শুধুমাত্র মিডিয়া), শুধুমাত্র বাঁদিক"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>-এ ব্যাটারি পুরো চার্জ হয়ে যাবে"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - চার্জিং অপ্টিমাইজ করা হয়েছে"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - চার্জ করা হচ্ছে"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - <xliff:g id="TIME">%3$s</xliff:g>-এর মধ্যে পুরো চার্জ হয়ে যাবে"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>-এর মধ্যে পুরো চার্জ হয়ে যাবে"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"<xliff:g id="TIME">%1$s</xliff:g>-এর মধ্যে পুরো চার্জ হয়ে যাবে"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g>-এর মধ্যে পুরো চার্জ হয়ে যাবে"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"অজানা"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"চার্জ হচ্ছে"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"দ্রুত চার্জ হচ্ছে"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"চার্জ হয়েছে"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"সম্পূর্ণ চার্জ আছে"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"চার্জিং হোল্ডে আছে"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"চার্জ হচ্ছে"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ফাস্ট চার্জিং"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"প্রশাসকের দ্বারা নিয়ন্ত্রিত"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"এটি বিধিনিষেধ সেটিং থেকে নিয়ন্ত্রণ করা হয়"</string>
<string name="disabled" msgid="8017887509554714950">"অক্ষম হয়েছে"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"এক দন্ড ফোনের সংকেত রয়েছে৷"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"দুই দন্ড ফোনের সংকেত রয়েছে৷"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"তিন দন্ড ফোনের সংকেত রয়েছে৷"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"ফোনে চারটি বার দেখা যাচ্ছে।"</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"ফোনের সংকেত পূর্ণ রয়েছে৷"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"কোনো ডেটা নেই৷"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"এক দন্ড ডেটার সংকেত৷"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 4f9c1f8..2cc6dc5 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Povezano (bez telefona ili medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivan, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lijeva <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Desna <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivan"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Sačuvano"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo lijevi"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desni"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, lijevi i desni"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktivno (samo za medijski sadržaj), baterija: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktivno (samo za medijski sadržaj), baterija L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, baterija D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Povezano (podržava dijeljenje zvuka), baterija: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Povezano (podržava dijeljenje zvuka), baterija L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, baterija D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Povezano (podržava dijeljenje zvuka), lijevo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Povezano (podržava dijeljenje zvuka), desno: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktivno (samo za medijski sadržaj)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Podržava dijeljenje zvuka"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktivno (samo za medijski sadržaj), samo lijevo"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do potpune napunjenosti"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – punjenje je optimizirano"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – punjenje"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – Napunjeno do <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – Potpuno napunjeno do <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Potpuno napunjeno do <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Napunjeno do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Nepoznato"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Punjenje"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Brzo punjenje"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Napunjeno"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Potpuno napunjeno"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Punjenje je na čekanju"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Punjenje"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Brzo punjenje"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pod kontrolom administratora"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolira ograničena postavka"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefonski signal na jednoj crtici."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefonski signal na dvije crtice."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefonski signal na tri crtice."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Četiri crtice na telefonu."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Telefonski signal pun."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Nema podataka."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Prijenos podataka na jednoj crtici."</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 9ea570f..5a4a923 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al telèfon), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al telèfon ni al contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Actiu, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Actiu, E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateria"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateria"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Esquerre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Dret: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Actiu"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Desat"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actiu, només l\'esquerre"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Actiu, només el dret"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Actiu, esquerre i dret"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Actiu (només contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Actiu (només contingut multimèdia), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connectat (admet compartició d\'àudio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connectat (admet compartició d\'àudio), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connectat (admet compartició d\'àudio), esquerre <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connectat (admet compartició d\'àudio), dret <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Actiu (només contingut multimèdia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Admet compartició d\'àudio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Actiu (només contingut multimèdia), només esquerre"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index b204662..9a3ba63 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefonu), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez médií), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefonu a médií), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivní, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterie"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivní, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterie, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterie"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterie"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterie, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterie"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Vlevo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Vpravo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivní"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Uloženo"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivní, pouze levé"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivní, pouze pravé"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivní, levé a pravé"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktivní (pouze média), baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktivní (pouze média), baterie: L <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, P <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Připojeno (podporuje sdílení zvuku), baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Připojeno (podporuje sdílení zvuku), baterie: L <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, P <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Připojeno (podporuje sdílení zvuku), levé <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Připojeno (podporuje sdílení zvuku), pravé <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktivní (pouze média)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Podporuje sdílení zvuku"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktivní (pouze média), pouze levé"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index b4fee14..c7f1c6e 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Forbundet med <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen telefon) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Forbundet med <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Forbundet med <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen telefon eller medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivt, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batteri: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Venstre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri. Højre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Venstre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Højre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Gemt"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, kun venstre"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, kun højre"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, venstre og højre"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktiveret (kun for medier), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiveret (kun for medier), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Forbundet (understøtter lyddeling), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Forbundet (understøtter lyddeling), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Forbundet (understøtter lyddeling), venstre <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Forbundet (understøtter lyddeling), højre <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktiveret (kun for medier)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Understøtter lyddeling"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktiveret (kun for medier), kun venstre"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – fuldt opladet om <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – opladning er optimeret"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – oplades"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – Opladet senest kl. <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – Fuldt opladet senest kl. <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Fuldt opladet senest kl. <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Opladet senest kl. <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Ukendt"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Oplader"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Oplader hurtigt"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Opladet"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Fuldt opladet"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Opladningen er blevet sat på pause"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Opladning"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Lynopladning"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolleret af administratoren"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Styres af en begrænset indstilling"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiveret"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefon en bjælke."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefon to bjælker."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefon tre bjælker."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Telefonen har fire bjælker."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Telefonsignal fuldt."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Ingen data."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Data en bjælke."</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 91d108d..cc962b4 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (kein Telefon-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (kein Medien-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (weder Telefon- noch Medien-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, Akkustand L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Akku – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Akkustand L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Links – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Rechts – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Gespeichert"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, nur links"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, nur rechts"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, links und rechts"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktiv (nur Medien), Akku: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiv (nur Medien), Akku links: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Akku rechts: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Verbunden (unterstützt Audiofreigabe), Akku: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Verbunden (unterstützt Audiofreigabe), Akku links: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Akku rechts: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Verbunden (unterstützt Audiofreigabe), Akku links: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Verbunden (unterstützt Audiofreigabe), Akku rechts: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktiv (nur Medien)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Unterstützt Audiofreigabe"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktiv (nur Medien), nur links"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – voll in <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – Laden wird optimiert"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – Wird geladen"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – Vollständig geladen in <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – Vollständig geladen in <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Vollständig geladen in <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Vollständig geladen in <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Unbekannt"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Wird aufgeladen"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Schnelles Aufladen"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Aufgeladen"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Vollständig geladen"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Ladevorgang angehalten"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Wird geladen"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Schnelles Laden"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Durch den Administrator verwaltet"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Gesteuert durch eingeschränkte Einstellung"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiviert"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefonsignal - ein Balken"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefonsignal - zwei Balken"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefonsignal - drei Balken"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Smartphone – vier Balken."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Volle Telefonsignalstärke"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Keine Daten"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Datensignal - ein Balken"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index ade0b33..2ea96a7 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Σε σύνδεση (χωρίς τηλέφωνο), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Σε σύνδεση (χωρίς μέσα), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Σε σύνδεση (χωρίς τηλέφωνο ή μέσα), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ενεργό, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ενεργό, Α: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> μπαταρία, Δ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> μπαταρία"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Α: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> μπαταρία, Δ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> μπαταρία"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Αριστερό <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Δεξί <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ενεργό"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Αποθηκεύτηκε"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ενεργό, μόνο το αριστερό"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ενεργό, μόνο το δεξί"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ενεργό, αριστερό και δεξί"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Ενεργό (μόνο για μέσα), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Ενεργό (μόνο για μέσα), Α: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> μπαταρία, Δ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> μπαταρία"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Συνδεδεμένο (υποστηρίζει κοινή χρήση ήχου), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Συνδεδεμένο (υποστηρίζει κοινή χρήση ήχου), Α: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> μπαταρία, Δ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> μπαταρία"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Συνδεδεμένο (υποστηρίζει κοινή χρήση ήχου), αριστερό <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Συνδεδεμένο (υποστηρίζει κοινή χρήση ήχου), δεξί <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Ενεργό (μόνο για μέσα)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Υποστηρίζει κοινή χρήση ήχου"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ενεργό (μόνο για μέσα), μόνο αριστερό"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 227f2eb..d4f14f4 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Saved"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Active (media only), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Active (media only), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connected (supports audio sharing), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connected (supports audio sharing), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connected (supports audio sharing), left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connected (supports audio sharing), right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Active (media only)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Supports audio sharing"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Active (media only), left only"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 6a799a8..6b49bc9 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -94,24 +94,29 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <string name="bluetooth_active_battery_level" msgid="2685517576209066008">"Active. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"Active. L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string>
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered" msgid="1616774716076301755">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="5725764679536058365">"Left: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="8377995536997790142">"Right: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Saved"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Active (media only), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Active (media only), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connected (supports audio sharing), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connected (supports audio sharing), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connected (supports audio sharing), left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connected (supports audio sharing), right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Active (media only). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Active (media only). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connected (supports audio sharing). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_untethered_lea_support" msgid="803110681688633362">"Connected (supports audio sharing). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="7707464334346454950">"Connected (supports audio sharing). Left: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="8941549024377771038">"Connected (supports audio sharing). Right: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_no_battery_level_lea_support" msgid="5721725041048434075">"Connected (supports audio sharing)"</string>
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Active (media only)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Supports audio sharing"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Active (media only), left only"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 227f2eb..d4f14f4 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Saved"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Active (media only), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Active (media only), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connected (supports audio sharing), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connected (supports audio sharing), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connected (supports audio sharing), left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connected (supports audio sharing), right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Active (media only)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Supports audio sharing"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Active (media only), left only"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 227f2eb..d4f14f4 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Saved"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Active (media only), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Active (media only), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connected (supports audio sharing), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connected (supports audio sharing), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connected (supports audio sharing), left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connected (supports audio sharing), right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Active (media only)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Supports audio sharing"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Active (media only), left only"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 7638057..c255633 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -94,24 +94,29 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Active, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+ <string name="bluetooth_active_battery_level" msgid="2685517576209066008">"Active. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"Active. L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string>
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level_untethered" msgid="1616774716076301755">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_untethered_left" msgid="5725764679536058365">"Left: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level_untethered_right" msgid="8377995536997790142">"Right: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Active"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Saved"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Active (media only), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Active (media only), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connected (supports audio sharing), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connected (supports audio sharing), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connected (supports audio sharing), left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connected (supports audio sharing), right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Active (media only). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Active (media only). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connected (supports audio sharing). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_untethered_lea_support" msgid="803110681688633362">"Connected (supports audio sharing). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="7707464334346454950">"Connected (supports audio sharing). Left: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="8941549024377771038">"Connected (supports audio sharing). Right: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string>
+ <string name="bluetooth_no_battery_level_lea_support" msgid="5721725041048434075">"Connected (supports audio sharing)"</string>
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Active (media only)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Supports audio sharing"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Active (media only), left only"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index bad913c..6a40c42 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Conectado (sin teléfono) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Conectado (sin archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Conectado (sin teléfono ni archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Activado (batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Activo, I: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"I: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Izquierdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Derecho: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Activado"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Guardado"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo; solo oído izquierdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo; solo oído derecho"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activo; oídos izquierdo y derecho"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Activo (solo para contenido multimedia); <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Activo (solo para contenido multimedia); I: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería; D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Conectado (admite el uso compartido de audio); <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Conectado (admite el uso compartido de audio); I: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería; D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Conectado (admite el uso compartido de audio); izquierdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Conectado (admite el uso compartido de audio); derecho: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Activo (solo para contenido multimedia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Admite el uso compartido de audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Activo (solo para contenido multimedia); solo izquierdo"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> para completar"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Carga optimizada"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - Cargando"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Carga completa: <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Carga completa: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Carga completa: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Carga completa: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconocido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Cargando"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Cargando rápidamente"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Cargada"</string>
<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>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Cargando"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carga rápida"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</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>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Una barra de teléfono"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Dos barras de teléfono"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Tres barras de teléfono"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Teléfono con cuatro barras."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Señal de teléfono completa"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"No hay datos."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Una barra de datos"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index b4627d2..ab75219 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Conectado (sin audio de teléfono) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Conectado (sin audio multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Conectado (sin audio de teléfono ni multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Activo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Activo L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batería <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Izquierda <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Derecha <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Activo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Guardado"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo, solo oído izquierdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo, solo oído derecho"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activo, oídos izquierdo y derecho"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Activo (solo multimedia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Activo (solo multimedia), izquierdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería, derecho: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Conectado (permite compartir audio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Conectado (permite compartir audio), izquierdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería, derecho: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Conectado (permite compartir audio), izquierdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Conectado (permite compartir audio), derecho: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Activo (solo multimedia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Permite compartir audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Activo (solo multimedia), solo el izquierdo"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> hasta la carga completa"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Carga optimizada"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ Cargar"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Carga completa a las <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Carga completa a las <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Carga completa a las <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Carga completa a las <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconocido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Cargando"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Carga rápida"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Cargada"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Carga pausada"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Cargando"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carga rápida"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlado por ajustes restringidos"</string>
<string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Una barra de cobertura"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Dos barras de cobertura"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Tres barras de cobertura"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Teléfono con cuatro barras."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Cobertura al máximo"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Sin datos"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Una barra de datos"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 57ce62a..c730457 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Ühendatud (telefoni pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Ühendatud (meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Ühendatud (telefoni ega meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiivne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiivne, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> akut, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> akut"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Akutase: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> akut, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> akut"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Vasakpoolne: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Parempoolne: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiivne"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Salvestatud"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiivne, ainult vasak"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiivne, ainult parem"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiivne, vasak ja parem"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktiivne (ainult meedia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> aku täituvus"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiivne (ainult meedia), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> aku täituvus, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> aku täituvus"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Ühendatud (toetab heli jagamist), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> aku täituvus"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Ühendatud (toetab heli jagamist), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> aku täituvus, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> aku täituvus"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Ühendatud (toetab heli jagamist), vasak <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Ühendatud (toetab heli jagamist), parem <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktiivne (ainult meedia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Toetab heli jagamist"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktiivne (ainult meedia), ainult vasak"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – täislaadimiseks kulub <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – laadimine on optimeeritud"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – laadimine"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – täis kell <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – aku saab täis kell <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Aku saab täis kell <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Täis kell <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Tundmatu"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Laadimine"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Kiirlaadimine"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Laetud"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Täielikult laetud"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Laadimine on ootele pandud"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Laadimine"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Kiirlaadimine"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Juhib administraator"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Haldavad piiranguga seaded"</string>
<string name="disabled" msgid="8017887509554714950">"Keelatud"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefonisignaal: üks pulk."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefonisignaal: kaks pulka."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefonisignaal: kolm pulka."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Telefoni neli riba."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Telefonisignaal on tugev."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Andmed puuduvad."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Andmesignaal: üks pulk."</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 781457d..0668fb2 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Konektatuta (telefonoaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Konektatuta (gailuaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Konektatuta (telefonoaren edo gailuaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktibo. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktibo. Ezk. gailuaren bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. Esk- gailuaren bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ezk. gailuaren bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. Esk- gailuaren bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Ezkerrekoa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Eskuinekoa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktibo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Gordeta"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktibo, ezkerrekoa soilik"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktibo, eskuinekoa soilik"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktibo, ezkerreko eta eskuineko audifonoak"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktibo (multimedia-edukia soilik); bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktibo (multimedia-edukia soilik); L aldearen bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. R aldearen bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Konektatuta (audioa partekatzeko eginbidea onartzen du); bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Konektatuta (audioa partekatzeko eginbidea onartzen du); L aldearen bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. R aldearen bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Konektatuta (audioa partekatzeko eginbidea onartzen du); ezkerreko aldearen bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Konektatuta (audioa partekatzeko eginbidea onartzen du); eskuineko aldearen bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktibo (multimedia-edukia soilik)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Audioa partekatzeko eginbidea onartzen du"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktibo (multimedia-edukia soilik); ezkerreko aldea soilik"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> guztiz kargatu arte"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Kargatzeko modu optimizatua"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ Kargatzen"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Ordu honetan kargatuko da guztiz: <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Ordu honetan kargatuko da guztiz: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Ordu honetan kargatuko da guztiz: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Ordu honetan kargatuko da guztiz: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Ezezaguna"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Kargatzen"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Bizkor kargatzen"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Kargatuta"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Erabat kargatuta"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Kargatze-prozesua zain dago"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Kargatzen ari da"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Kargatze bizkorra"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administratzaileak kontrolatzen du"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ezarpen mugatuak kontrolatzen du"</string>
<string name="disabled" msgid="8017887509554714950">"Desgaituta"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefono-seinaleak barra bat du."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefono-seinaleak bi barra ditu."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefono-seinaleak hiru barra ditu."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Telefonoak lau barra ditu."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Telefono-seinale osoa."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Ez dago daturik."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Datu-seinaleak barra bat du."</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 1c32d89..3c7f1f8 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"متصل (بدون تلفن)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"متصل (بدون رسانه)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"متصل (بدون تلفن یا رسانه)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"فعال، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> شارژ باتری"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"فعال، چپ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> باتری، راست: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> باتری"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> شارژ باتری"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"چپ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> باتری، راست: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> باتری"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"چپ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"راست <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"فعال"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"ذخیرهشده"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"فعال، فقط چپ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"فعال، فقط راست"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"فعال، چپ و راست"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"فعال (فقط رسانه)، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> باتری"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"فعال (فقط رسانه)، چپ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> باتری، راست: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> باتری"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"متصل (از اشتراک صدا پشتیبانی میکند)، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> باتری"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"متصل (از اشتراک صدا پشتیبانی میکند)، چپ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> باتری، راست: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> باتری"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"متصل (از اشتراک صدا پشتیبانی میکند)، چپ<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"متصل (از اشتراک صدا پشتیبانی میکند)، راست <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"فعال (فقط رسانه)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"از اشتراک صدا پشتیبانی میکند"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"فعال (فقط رسانه)، فقط چپ"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 7377d0d..da80499 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Yhdistetty (ei puhelimen ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Yhdistetty (ei median ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Yhdistetty (ei puhelimen tai median ääntä), akun varaustaso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiivinen, akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiivinen, V: akku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, O: akku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Akku (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: akku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, O: akku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Vasen <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Oikea <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiivinen"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Tallennettu"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiivinen, vain vasen"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiivinen, vain oikea"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiivinen, vasen ja oikea"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktiivinen (vain media), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> virtaa"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiivinen (vain media), vasen: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> virtaa, oikea: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> virtaa"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Yhdistetty (tukee audionjakoa), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> virtaa"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Yhdistetty (tukee audionjakoa), vasen: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> virtaa, oikea: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> virtaa"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Yhdistetty (tukee audionjakoa), vasen: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Yhdistetty (tukee audionjakoa), oikea: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktiivinen (vain media)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Tukee audionjakoa"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktiivinen (vain media), vain vasen"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> kunnes täynnä"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – Lataus optimoitu"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – Ladataan"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – Täynnä klo <xliff:g id="TIME">%3$s</xliff:g> mennessä"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – Ladattu täyteen klo <xliff:g id="TIME">%2$s</xliff:g> mennessä"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Ladattu täyteen klo <xliff:g id="TIME">%1$s</xliff:g> mennessä"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Täynnä klo <xliff:g id="TIME">%1$s</xliff:g> mennessä"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Tuntematon"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Ladataan"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Nopea lataus"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Ladattu"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Täyteen ladattu"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Lataus on pidossa"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Ladataan"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Nopea lataus"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Järjestelmänvalvoja hallinnoi tätä asetusta."</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Rajoitettujen asetusten mukaisesti"</string>
<string name="disabled" msgid="8017887509554714950">"Pois päältä"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Puhelinverkkosignaali - yksi palkki."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Puhelinverkkosignaali - kaksi palkkia."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Puhelinverkkosignaali - kolme palkkia."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Puhelin neljä palkkia."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Vahva puhelinverkkosignaali."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Ei datasignaalia."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Datasignaali - yksi palkki."</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index e059091..6988384 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Connecté (aucun téléphone), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Connecté (aucun média), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Connecté (aucun téléphone ni média), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Actif, pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Actif, G : charge à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; D : charge à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"G : charge à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; D : charge à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Gauche : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Droite : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Actif"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Enregistré"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actif, gauche seulement"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, droite seulement"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, gauche et droite"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Actif (contenu multimédia uniquement), pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Actif (contenu multimédia uniquement), G. : pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D. : pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connecté (prise en charge du partage audio), pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connecté (prise en charge du partage audio), G. : pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D. : pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connecté (prise en charge du partage audio), côté gauche : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connecté (prise en charge du partage audio), côté droit : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Actif (contenu multimédia uniquement)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Prise en charge du partage audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Actif (contenu multimédia uniquement), côté gauche seulement"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 11de54b..709477b 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Connecté (aucun téléphone), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Connecté (aucun contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Connecté (aucun téléphone ni contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Actif, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Actif, G : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de la batterie, D : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de la batterie"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batterie (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"G : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de la batterie, D : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de la batterie"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Gauche (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Droit (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Actif"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Enregistré"</string>
<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_active_media_only_battery_level" msgid="1164678961213251365">"Activé (multimédia uniquement), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Activé (multimédia uniquement), gauche : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batterie, droit : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batterie"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connecté (compatible avec le partage audio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connecté (compatible avec le partage audio), gauche : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batterie, droit : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batterie"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connecté (compatible avec le partage audio), gauche <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connecté (compatible avec le partage audio), droit <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Activé (multimédia uniquement)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Compatible avec le partage audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Activé (multimédia uniquement), gauche uniquement"</string>
@@ -714,7 +731,7 @@
<string name="back_navigation_animation_summary" msgid="741292224121599456">"Activer les animations système pour la prévisualisation du Retour"</string>
<string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ce paramètre active les animations système pour la prévisualisation du geste de retour. Pour cela, enableOnBackInvokedCallback doit être défini sur \"True\" dans le fichier manifeste de chaque appli."</string>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
- <string name="not_specified" msgid="5423502443185110328">"Non personnalisé"</string>
+ <string name="not_specified" msgid="5423502443185110328">"Non défini"</string>
<string name="neuter" msgid="2075249330106127310">"Neutre"</string>
<string name="feminine" msgid="1529155595310784757">"Féminin"</string>
<string name="masculine" msgid="4653978041013996303">"Masculin"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index ffd4e6a..e5c7f1e 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen teléfono), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen audio multimedia), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen teléfono nin audio multimedia), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Dispositivo activo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Activado. E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería. D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería. D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Lado dereito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Activo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Gardado"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo (só o esquerdo)"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo (só o dereito)"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activos (o esquerdo e o dereito)"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Activo (só contido multimedia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Activo (só contido multimedia), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Conectado (compatible con audio compartido), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Conectado (compatible con audio compartido), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Conectado (compatible con audio compartido), esquerdo<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Conectado (compatible con audio compartido), dereito <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Activo (só contido multimedia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Compatible con audio compartido"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Activo (só contido multimedia), só esquerdo"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> (<xliff:g id="TIME">%2$s</xliff:g> para completar a carga)"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> (carga optimizada)"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> (cargando)"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Completa á/s <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Carga completa á/s <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Carga completa á/s <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Completa á/s <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Descoñecido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Cargando"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Cargando rapidamente"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Cargada"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Carga en pausa"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Cargando"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carga rápida"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Opción controlada polo administrador"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Baixo o control de opcións restrinxidas"</string>
<string name="disabled" msgid="8017887509554714950">"Desactivada"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Unha barra de cobertura"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Dúas barras de cobertura"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Tres barras de cobertura"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Catro barras no teléfono."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Cobertura ao máximo"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Sen datos"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Unha barra de sinal de datos"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index c1746b3..d520536 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ ફોન નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ મીડિયા નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ ફોન અથવા મીડિયા નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"સક્રિય, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"સક્રિય, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> બૅટરી, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> બૅટરી, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ડાબી બાજુ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"જમણી બાજુ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"સક્રિય"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"સાચવેલું"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"સક્રિય, માત્ર ડાબું"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"સક્રિય, માત્ર જમણું"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"સક્રિય, ડાબું અને જમણું બન્ને"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"સક્રિય છે (માત્ર મીડિયા માટે), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"સક્રિય છે (માત્ર મીડિયા માટે), ડાબી બાજુ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> બૅટરી, જમણી બાજુ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"કનેક્ટેડ છે (ઑડિયો શેરિંગને સપોર્ટ કરે છે), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"કનેક્ટેડ છે (ઑડિયો શેરિંગને સપોર્ટ કરે છે), ડાબી બાજુ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> બૅટરી, જમણી બાજુ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"કનેક્ટેડ છે (ઑડિયો શેરિંગને સપોર્ટ કરે છે), ડાબી બાજુ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"કનેક્ટેડ છે (ઑડિયો શેરિંગને સપોર્ટ કરે છે), જમણી બાજુ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"સક્રિય છે (માત્ર મીડિયા માટે)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ઑડિયો શેરિંગને સપોર્ટ કરે છે"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"સક્રિય છે (માત્ર મીડિયા માટે), માત્ર ડાબી બાજુ"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - પૂર્ણ ચાર્જ થવામાં <xliff:g id="TIME">%2$s</xliff:g> બાકી છે"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - ચાર્જિંગ ઑપ્ટિમાઇઝ કરવામાં આવ્યું છે"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - ચાર્જિંગ"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - <xliff:g id="TIME">%3$s</xliff:g> સુધીમાં સંપૂર્ણ ચાર્જ થશે"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> સુધીમાં સંપૂર્ણ ચાર્જ થશે"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"<xliff:g id="TIME">%1$s</xliff:g> સુધીમાં સંપૂર્ણ ચાર્જ થશે"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g> સુધીમાં સંપૂર્ણ ચાર્જ થશે"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"અજાણ્યું"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ચાર્જ થઈ રહ્યું છે"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"ઝડપથી ચાર્જ થાય છે"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"ચાર્જ થયું"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"સંપૂર્ણપણે ચાર્જ છે"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"ચાર્જિંગ હોલ્ડ પર રાખવામાં આવ્યું"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"ચાર્જ થઈ રહ્યું છે"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ઝડપી ચાર્જિંગ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"વ્યવસ્થાપક દ્વારા નિયંત્રિત"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"પ્રતિબંધિત સેટિંગ દ્વારા નિયંત્રિત"</string>
<string name="disabled" msgid="8017887509554714950">"અક્ષમ કર્યો"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"ફોન એક બાર."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"ફોન બે બાર."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"ફોન ત્રણ બાર."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"ફોનના સિગ્નલમાં ચાર બાર છે."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"પૂર્ણ ફોન સિગ્નલ."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"કોઈ ડેટા નથી."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"ડેટા એક બાર."</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 99dcbb0..a81daf7 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"जुड़ गया (फ़ोन के ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"जुड़ गया (मीडिया ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"जुड़ गया (फ़ोन या मीडिया ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"चालू, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"चालू, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बैटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बैटरी"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बैटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बैटरी"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"बाएं ईयरबड में <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी बची है"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"दाएं ईयरबड में <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी बची है"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"चालू"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"सेव किया गया"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"सिर्फ़ बाईं तरफ़ वाला चालू है"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"सिर्फ़ दाईं तरफ़ वाला चालू है"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"बाईं और दाईं तरफ़ वाला चालू है"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"चालू है (सिर्फ़ मीडिया के लिए), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"चालू है (सिर्फ़ मीडिया के लिए), बायां हेडसेट: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बैटरी, दायां हेडसेट: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बैटरी"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"कनेक्ट हो गया (ऑडियो शेयर करने की सुविधा काम करती है), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"कनेक्ट हो गया (ऑडियो शेयर करने की सुविधा काम करती है), बायां हेडसेट: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बैटरी, दायां हेडसेट: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बैटरी"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"कनेक्ट हो गया (ऑडियो शेयर करने की सुविधा काम करती है), बायां हेडसेट<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"कनेक्ट हो गया (ऑडियो शेयर करने की सुविधा काम करती है), दायां हेडसेट <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"चालू है (सिर्फ़ मीडिया के लिए)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ऑडियो शेयर करने की सुविधा काम करती है"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"चालू है (सिर्फ़ मीडिया के लिए), सिर्फ़ बाएं कान की मशीन"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> में बैटरी पूरी चार्ज हो जाएगी"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - चार्जिंग को ऑप्टिमाइज़ किया गया"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - चार्ज हो रही है"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - बैटरी <xliff:g id="TIME">%3$s</xliff:g> में पूरी चार्ज हो जाएगी"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - बैटरी <xliff:g id="TIME">%2$s</xliff:g> में पूरी चार्ज हो जाएगी"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"बैटरी <xliff:g id="TIME">%1$s</xliff:g> में पूरी चार्ज हो जाएगी"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"बैटरी <xliff:g id="TIME">%1$s</xliff:g> में पूरी चार्ज हो जाएगी"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"अज्ञात"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"चार्ज हो रही है"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"तेज़ चार्ज हो रही है"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"बैटरी चार्ज हो गई"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"बैटरी पूरी चार्ज है"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"फ़ोन को चार्ज होने से रोक दिया गया है"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"चार्ज हो रही है"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"फ़ास्ट चार्जिंग"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"इसका नियंत्रण एडमिन के पास है"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"इसे पाबंदी मोड वाली सेटिंग से कंट्रोल किया जाता है"</string>
<string name="disabled" msgid="8017887509554714950">"बंद किया गया"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"फ़ोन एक बार."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"फ़ोन दो बार."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"फोन तीन बार."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"फ़ोन के चार सिग्नल बार हैं."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"फ़ोन सिग्नल पूरा."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"कोई डेटा नहीं."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"डेटा एक बार."</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index a1dcf83..362393e 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Povezano (bez telefona i medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivan, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lijevo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Desno <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivan"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Spremljeno"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo lijevo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desno"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, lijevo i desno"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktivno (samo medijski sadržaji), razina baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktivno (samo medijski sadržaji), L: razina baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: razina baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Povezano (podržava zajedničko slušanje), razina baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Povezano (podržava zajedničko slušanje), L: razina baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: razina baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Povezano (podržava zajedničko slušanje), lijeva <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Povezano (podržava zajedničko slušanje), desna <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktivno (samo medijski sadržaji)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Podržava zajedničko slušanje"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktivno (samo medijski sadržaji), samo lijeva"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do napunjenosti"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – punjenje se optimizira"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – punjenje"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – napunjeno do <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – potpuno napunjeno do <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Potpuno napunjeno do <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Napunjeno do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Nepoznato"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Punjenje"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Brzo punjenje"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Napunjeno"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Posve puna"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Punjenje na čekanju"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Punjenje"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Brzo punjenje"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolira administrator"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolira ograničena postavka"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefonski signal jedan stupac."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefonski signal dva stupca."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefonski signal tri stupca."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Signal na telefonu ima četiri crtice."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Telefonski signal pun."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Nema podataka."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Podatkovni signal jedan stupac."</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index afb9c01..f251464 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Csatlakoztatva (telefonhang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Csatlakoztatva (médiahang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Csatlakoztatva (nincs telefon- és médiahang); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktív, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-os töltöttség"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktív, B: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>-os töltöttség, J: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>-os töltöttség"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akkumulátor: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Akkumulátor: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"B: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>-os töltöttség, J: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>-os töltöttség"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Bal: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Jobb: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktív"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Mentve"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktív, csak bal"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktív, csak jobb"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktív, bal és jobb"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktív (csak médiatartalom lejátszása), akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktív (csak médiatartalom lejátszása), bal eszköz akkumulátorának töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, jobb eszköz akkumulátorának töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Csatlakoztatva (támogatja a hang megosztását), akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Csatlakoztatva (támogatja a hang megosztását), bal eszköz akkumulátorának töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, jobb eszköz akkumulátorának töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Csatlakoztatva (támogatja a hang megosztását), bal eszköz akkumulátorának töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Csatlakoztatva (támogatja a hang megosztását), jobb eszköz akkumulátorának töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktív (csak médiatartalom lejátszása)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Támogatja a hang megosztását"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktív (csak médiatartalom lejátszása), csak a bal"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 160cb79..4b6d727 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Միացված է (հեռախոս չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Միացված է (մեդիա չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Միացված է (հեռախոս կամ մեդիա չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ակտիվ է։ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ակտիվ է, Ա` Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ձ՝ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ա՝ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ձ՝ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Ձախը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Աջը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ակտիվ է"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Պահված է"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ակտիվ, միայն ձախ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ակտիվ, միայն աջ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ակտիվ, ձախ և աջ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Ակտիվ է (միայն մեդիա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Ակտիվ է (միայն մեդիա), Ձ՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ա՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Միացված է (աջակցում է աուդիոյի փոխանցում), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Միացված է (աջակցում է աուդիոյի փոխանցում), Ձ՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ա՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Միացված է (աջակցում է աուդիոյի փոխանցում), ձախ՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Միացված է (աջակցում է աուդիոյի փոխանցում), աջ՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Ակտիվ է (միայն մեդիա)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Աջակցում է աուդիոյի փոխանցում"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ակտիվ է (միայն մեդիա), միայն ձախ"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> մինչև լրիվ լիցքավորումը"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – Լիցքավորումն օպտիմալացված է"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> — Լիցքավորում"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – Ամբողջովին կլիցքավորվի մինչև <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – Ամբողջովին կլիցքավորվի մինչև <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Ամբողջովին կլիցքավորվի մինչև <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Ամբողջովին կլիցքավորվի մինչև <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Անհայտ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Լիցքավորում"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Արագ լիցքավորում"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Լիցքավորված է"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Լրիվ լիցքավորված է"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Լրցքավորումը դադարեցված է"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Լիցքավորում"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Արագ լիցքավորում"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Վերահսկվում է ադմինիստրատորի կողմից"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Կառավարվում է սահմանափակ ռեժիմի կարգավորումներով"</string>
<string name="disabled" msgid="8017887509554714950">"Կասեցված է"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Հեռախոսի մեկ գիծ:"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Հեռախոսի երկու գիծ:"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Հեռախոսի երեք գիծ:"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Հեռախոսակապի ուժգնությունը՝ չորս գիծ։"</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Հեռախոսի ազդանշանը լիքն է:"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Տվյալներ չկան:"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Տվյալների մեկ գիծ:"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 843cc94..1594d11 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Terhubung (tanpa ponsel), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Terhubung (tanpa media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Terhubung (tanpa ponsel atau media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktif, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktif, Kr: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterai, Kn: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterai"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Kr: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterai, Kn: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterai"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kiri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Kanan <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktif"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Disimpan"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktif, hanya kiri"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktif, hanya kanan"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktif, kiri dan kanan"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktif (hanya media), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterai"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktif (hanya media), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterai, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterai"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Terhubung (mendukung berbagi audio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterai"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Terhubung (mendukung berbagi audio), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterai, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterai"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Terhubung (mendukung berbagi audio), kiri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Terhubung (mendukung berbagi audio), kanan <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktif (hanya media)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Mendukung berbagi audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktif (hanya media), hanya kiri"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index ff0c621..b85f453 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Tengt (enginn sími), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Tengt (ekkert efni), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Tengt (enginn sími eða efni), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Tengt, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlöðuhleðsla"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Virkt, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> rafhlaða, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> rafhlaða"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlöðuhleðsla"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Rafhlaða <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> rafhlaða, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> rafhlaða"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Vinstri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Hægri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Virkt"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Vistað"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Virkt, aðeins vinstra"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Virkt, aðeins hægra"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Virkt, vinstra og hægra"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Virkt (eingöngu margmiðlunarefni), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlaða"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Virkt (eingöngu margmiðlunarefni), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> rafhlaða, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> rafhlaða"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Tengt (styður hljóðdeilingu), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlaða"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Tengt (styður hljóðdeilingu), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> rafhlaða, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> rafhlaða"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Tengt (styður hljóðdeilingu), vinstri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Tengt (styður hljóðdeilingu), hægri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Virkt (eingöngu margmiðlunarefni)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Styður hljóðdeilingu"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Virkt (eingöngu margmiðlunarefni), eingöngu vinstri"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 5f680f4..08a2397 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (telefono escluso), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (telefono o contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Attivo - Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Attivo, S: batteria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: batteria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"S: batteria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: batteria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Sinistra: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Destra: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Attivo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Dispositivo salvato"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Attiva, solo sinistra"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Attiva, solo destra"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Attivo, destra e sinistra"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Attivo (solo contenuti multimediali), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> di batteria"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Attivo (solo contenuti multimediali), S: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> di batteria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> di batteria"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connesso (supporta la condivisione audio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> di batteria"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connesso (supporta la condivisione audio), S: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> di batteria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> di batteria"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connesso (supporta la condivisione audio), sinistro <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connesso (supporta la condivisione audio), destro <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Attivo (solo contenuti multimediali)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Supporta la condivisione audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Attivo (solo contenuti multimediali), solo sinistro"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 526fae5..9ecf47b 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"מחובר (ללא טלפון), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"מחובר (ללא מדיה), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"מחובר (ללא טלפון או מדיה), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"פעיל, טעינת הסוללה: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"פעיל, שמאל: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> סוללה, ימין: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> סוללה"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"טעינת הסוללה: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"סוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"שמאל: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> סוללה, ימין: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> סוללה"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> שמאלי"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ימני"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"פעיל"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"בוצעה שמירה"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"פועל: שמאל בלבד"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"פועל: ימין בלבד"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"פועל: ימין ושמאל"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"פעיל (מדיה בלבד), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> סוללה"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"פעיל (מדיה בלבד), שמאל: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> סוללה, ימין: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> סוללה"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"מחובר (תמיכה בשיתוף אודיו), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> סוללה"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"מחובר (תמיכה בשיתוף אודיו), שמאל: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> סוללה, ימין: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> סוללה"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"מחובר (תמיכה בשיתוף אודיו), שמאל <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"מחובר (תמיכה בשיתוף אודיו), ימין <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"פעיל (מדיה בלבד)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"תמיכה בשיתוף אודיו"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"פעיל (מדיה בלבד), שמאל בלבד"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 60d936c..a51ba39 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"接続済み(電話なし)、バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"接続済み(メディアなし)、バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"接続済み(電話、メディアなし)、バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"有効、バッテリー <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"有効、L: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>、R: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"バッテリー <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"バッテリー <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>、R: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"左 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"右 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"有効"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"保存済み"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"有効、左のみ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"有効、右のみ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"有効、左と右"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"有効(メディアのみ)、バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"有効(メディアのみ)、左: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>、右: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"接続済み(音声の共有をサポート)、バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"接続済み(音声の共有をサポート)、左: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>、右: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"接続済み(音声の共有をサポート)、左 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"接続済み(音声の共有をサポート)、右 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"有効(メディアのみ)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"音声の共有をサポートしています"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"有効(メディアのみ)、左のみ"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index ef0b524..ba1dae0 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"დაკავშირებულია (ტელეფონი არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"დაკავშირებულია (მედია არ არის). ბატარეა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"დაკავშირებულია (ტელეფონი ან მედია არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"აქტიურია, ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-ს შეადგენს"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"აქტიური, მარცხენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ბატარეა, მარჯვენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ბატარეა"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ბატარეა"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"მარცხენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ბატარეა, მარჯვენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ბატარეა"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"მარცხენა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"მარჯვენა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"აქტიური"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"შენახული"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"აქტიური, მხოლოდ მარცხნივ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"აქტიური, მხოლოდ მარჯვნივ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"აქტიური, მარცხნივ და მარჯვნივ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"აქტიური (მხოლოდ მედია), ბატარეა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"აქტიური (მხოლოდ მედია), მარცხენა: ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, მარჯვენა: ბატარეა<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია), ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია), მარცხენა: ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, მარჯვენა: ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია), მარცხენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია), მარჯვენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"აქტიური (მხოლოდ მედია)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"აუდიოს გაზიარება მხარდაჭერილია"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"აქტიური (მხოლოდ მედია), მხოლოდ მარცხენა"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index bac01d9..b8f8fa3 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Жалғанды (телефонсыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Жалғанды (аудиосыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Жалғанды (телефонсыз не аудиосыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Қосулы, батарея қуаты: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Қосулы, С: батарея заряды – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, О: батарея заряды – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батарея қуаты: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батарея: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"С: батарея заряды – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, О: батарея заряды – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Сол: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Оң: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Қосулы"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Сақталған"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Тек сол жағы қосулы"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Тек оң жағы қосулы"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Екеуі де қосулы"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Істеп тұр (тек мультимедиа), батарея зарядының деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Істеп тұр (тек мультимедиа). Сол жақ: батарея зарядының деңгейі — <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. Оң жақ: батарея зарядының деңгейі — <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Қосылды (аудио бөлісуге мүмкіндік береді), батарея зарядының деңгейі:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Қосылды (аудио бөлісуге мүмкіндік береді). Сол жақ: батарея зарядының деңгейі — <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. Оң жақ: батарея зарядының деңгейі — <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Қосылды (аудио бөлісуге мүмкіндік береді), сол жақ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Қосылды (аудио бөлісуге мүмкіндік береді), оң жақ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Істеп тұр (тек мультимедиа)."</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Аудио бөлісуге мүмкіндік береді."</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Тек сол жақ істеп тұр (мультимедиа ғана)."</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g>: толық зарядталуға <xliff:g id="TIME">%2$s</xliff:g> қалды"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – зарядтау оңтайландырылды"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – Зарядталып жатыр"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Заряд толуына қалған уақыт: <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Толық заряд алуға қалған уақыт: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Толық заряд алуға қалған уақыт: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Заряд толуына қалған уақыт: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Белгісіз"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Зарядталуда"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Жылдам зарядтау"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Зарядталды"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Толық зарядталды."</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Зарядтау кідіртілді."</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Зарядталып жатыр."</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Жылдам зарядтау"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Әкімші басқарады"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Шектелген параметрлер арқылы басқарылады."</string>
<string name="disabled" msgid="8017887509554714950">"Өшірілген"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Телефон бір баған."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Телефон екі баған."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Телефон үш баған."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Телефон байланысының төрт бағанасы."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Телефон сигналы толық."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Дерекқор жоқ."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Дерекқор бір баған."</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 9a2b89b..d049fd4 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"បានភ្ជាប់ (គ្មានទូរសព្ទទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"បានភ្ជាប់ (គ្មានមេឌៀទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"បានភ្ជាប់ (គ្មានទូរសព្ទ ឬមេឌៀទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"សកម្ម ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"សកម្ម, L៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ឆ្វេង <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ស្ដាំ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"សកម្ម"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"បានរក្សាទុក"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"សកម្ម ខាងឆ្វេងតែប៉ុណ្ណោះ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"សកម្មខាងស្ដាំតែប៉ុណ្ណោះ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"សកម្មខាងឆ្វេង និងស្ដាំ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"សកម្ម (តែមេឌៀប៉ុណ្ណោះ) ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"សកម្ម (តែមេឌៀប៉ុណ្ណោះ) ឆ្វេង៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ស្ដាំ៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា) ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា) ឆ្វេង៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ស្ដាំ៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា) ឆ្វេង <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា) ស្ដាំ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"សកម្ម (តែមេឌៀប៉ុណ្ណោះ)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"អាចប្រើការស្ដាប់សំឡេងរួមគ្នា"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"សកម្ម (តែមេឌៀប៉ុណ្ណោះ) តែខាងឆ្វេងប៉ុណ្ណោះ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 338eb7a..70257de 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಇಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಮಾಧ್ಯಮವಿಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಅಥವಾ ಮಾಧ್ಯಮವಿಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ಸಕ್ರಿಯ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ಸಕ್ರಿಯ, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ಬ್ಯಾಟರಿ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ ಇದೆ"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ಬ್ಯಾಟರಿ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ಎಡ ಭಾಗದ ಬ್ಯಾಟರಿ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ಬಲ ಭಾಗದ ಬ್ಯಾಟರಿ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ಸಕ್ರಿಯ"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"ಸೇವ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ಎಡಕಿವಿಯ ಸಾಧನ ಮಾತ್ರ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ಬಲಕಿವಿಯ ಸಾಧನ ಮಾತ್ರ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ಎಡ ಮತ್ತು ಬಲಕಿವಿಯ ಸಾಧನಗಳು ಸಕ್ರಿಯವಾಗಿವೆ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ), ಎಡ ಭಾಗದ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ), ಬಲ ಭಾಗದ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ), ಎಡ ಭಾಗದ ಮಾತ್ರ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index d03c152..9ced8a0 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"연결됨(전화 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"연결됨(미디어 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"연결됨(전화 또는 미디어 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"활성, 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"활성, 왼쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, 오른쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"왼쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, 오른쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"왼쪽 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"오른쪽 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"활성"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"저장됨"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"활성, 왼쪽만"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"활성, 오른쪽만"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"활성, 왼쪽 및 오른쪽"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"사용 중(미디어 전용), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"사용 중(미디어 전용), 왼쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, 오른쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"연결됨(오디오 공유 지원), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"연결됨(오디오 공유 지원), 왼쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, 오른쪽: 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"연결됨(오디오 공유 지원), 왼쪽 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"연결됨(오디오 공유 지원), 오른쪽 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"사용 중(미디어 전용)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"오디오 공유 지원"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"사용 중(미디어 전용), 왼쪽만"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index b17579a..7be7f38 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Туташып турат (телефониясыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Туташып турат (медиасыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Туташып турат (телефониясыз же медиасыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Иштеп жатат, батарея: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активдүү, сол: Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, оң: Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батареянын деңгээли: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батареянын кубаты: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Сол: Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, оң: Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Сол: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Оң: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Жигердүү"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Сакталган"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Иштеп жатат, сол кулак гана"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Жигердүү, оң кулакчын гана"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Жигердүү, сол жана оң кулакчын"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Активдүү (медиа үчүн гана), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батарея"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Активдүү (медиа үчүн гана), С: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батарея, О: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батарея"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Туташкан (чогуу угуу колдоого алынат), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батарея"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Туташкан (чогуу угуу колдоого алынат), С: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батарея, О: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батарея"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Туташкан (чогуу угуу колдоого алынат), сол <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Туташкан (чогуу угуу колдоого алынат), оң <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Активдүү (медиа үчүн гана)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Чогуу угуу колдоого алынат"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Активдүү (медиа үчүн гана), сол кулакчын гана"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 441455c..c6a5bd4 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີມີເດຍ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ ຫຼື ມີເດຍ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ເປີດໃຊ້ຢູ່, ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ເປີດໃຊ້, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ແບັດເຕີຣີ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ແບັດເຕີຣີ"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ແບັດເຕີຣີ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ແບັດເຕີຣີ"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ຊ້າຍ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ຂວາ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ອອນລາຍ"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"ບັນທຶກແລ້ວ"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ນຳໃຊ້ຢູ່, ຊ້າຍເທົ່ານັ້ນ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ນຳໃຊ້ຢູ່, ຂວາເທົ່ານັ້ນ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ນຳໃຊ້ຢູ່, ຊ້າຍ ແລະ ຂວາ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ), ຊ: ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ຂ: ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ), ຊ: ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ຂ: ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ), ຊ້າຍ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ), ຂວາ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ຮອງຮັບການແບ່ງປັນສຽງ"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ), ຊ້າຍເທົ່ານັ້ນ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 00672df..94b8173 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (telefono nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (medijos nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (telefono ar medijos nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktyvus, akumuliatoriaus įkrova: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktyvi, KAIRĖ: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, DEŠINĖ: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akumuliatoriaus įkrova: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Akumuliatorius: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"KAIRĖ: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, DEŠINĖ: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kairė: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Dešinė: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktyvus"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Išsaugota"</string>
<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_active_media_only_battery_level" msgid="1164678961213251365">"Aktyvus (tik medija), akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktyvus (tik medija), kairė: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, dešinė: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Prijungta (palaikomas garso įrašų bendrinimas), akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Prijungta (palaikomas garso įrašų bendrinimas), kairė: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, dešinė: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Prijungta (palaikomas garso įrašų bendrinimas), kairė: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Prijungta (palaikomas garso įrašų bendrinimas), kairė: akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktyvus (tik medija)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Palaikomas garso įrašų bendrinimas"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktyvus (tik medija), tik kairė"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index a9b848a..ff1f3f3 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Savienojums izveidots <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (nav tālrunis), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Savienojums izveidots (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>) (nav multivide), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Savienojums izveidots (nav tālrunis vai multivide) (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktīvs, akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktīvs, L: akumulatora uzlādes līmenis <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: akumulatora uzlādes līmenis <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: akumulatora uzlādes līmenis <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: akumulatora uzlādes līmenis <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kreisā: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Labā: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktīvs"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Saglabāta"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ierīce aktīva, tikai kreisā auss"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ierīce aktīva, tikai labā auss"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ierīces aktīvas, kreisā un labā auss"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktīvs (tikai multividei), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktīvs (tikai multividei), labās austiņas akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, kreisās austiņas akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Izveidots savienojums (atbalsta audio kopīgošanu), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Izveidots savienojums (atbalsta audio kopīgošanu), labās austiņas akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, kreisās austiņas akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Izveidots savienojums (atbalsta audio kopīgošanu), kreisās austiņas akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Izveidots savienojums (atbalsta audio kopīgošanu), labās austiņas akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktīvs (tikai multividei)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Atbalsta audio kopīgošanu"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktīvs (tikai multivide), tikai kreisās puses aparāts"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index f5ff438..c5b4a5e 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без телефон), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без аудиовизуелни содржини), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без телефон и аудиовизуелни содржини), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активен, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активен, Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерија, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерија"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батерија: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батерија: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерија, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерија"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Одлево: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Оддесно: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активен"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Зачувано"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно, само лево"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно, само десно"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно, лево и десно"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Активно (само аудиовизуелни содржини), батерија: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Активно (само аудиовизуелни содржини), батерија Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, батерија Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Поврзано (поддржува споделување аудио), батерија:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Поврзано (поддржува споделување аудио), батерија Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, батерија Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Поврзано (поддржува споделување аудио), лево: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Поврзано (поддржува споделување аудио), десно: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Активно (само аудиовизуелни содржини)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Поддржува споделување аудио"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Активно (само аудиовизуелни содржини), само лево"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до полна батерија"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – полнењето е оптимизирано"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – се полни"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – Ќе се наполни целосно до <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – Ќе се наполни целосно до <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Ќе се наполни целосно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Ќе се наполни целосно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Непознато"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Се полни"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Брзо полнење"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Полна"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Целосно полна"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Полнењето е паузирано"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Се полни"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Се полни брзо"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролирано од администраторот"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Контролирано со ограничени поставки"</string>
<string name="disabled" msgid="8017887509554714950">"Оневозможено"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Телефон една цртичка.."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Телефон две цртички."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Телефон три цртички."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Телефон со четири цртички."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Сигналот за телефон е исполнет."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Нема податоци."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Податоци една цртичка."</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 231a642..0ba9122 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"കണക്റ്റ് ചെയ്തു (ഫോൺ ഇല്ല), ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"കണക്റ്റ് ചെയ്തു (മീഡിയ ഇല്ല), ബാറ്ററി <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"കണക്റ്റ് ചെയ്തു (ഫോണോ മീഡിയയോ ഇല്ല), ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"സജീവം, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"സജീവം, ഇടത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ബാറ്ററി, വലത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ബാറ്ററി"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ബാറ്ററി ചാർജ് <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ആണ്"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"ഇടത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ബാറ്ററി, വലത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ബാറ്ററി"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ഇടത് വശത്ത് <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"വലത് വശത്ത് <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"സജീവം"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"സംരക്ഷിച്ചു"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"സജീവമാണ്, ഇടത്തേത് മാത്രം"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"സജീവമാണ്, വലത്തേത് മാത്രം"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"സജീവമാണ്, ഇടത്തേതും വലത്തേതും"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"സജീവം (മീഡിയ മാത്രം), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"സജീവം (മീഡിയ മാത്രം), ഇടതുവശത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ബാറ്ററി, വലതുവശത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ബാറ്ററി"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു), ഇടതുവശത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ബാറ്ററി, വലതുവശത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ബാറ്ററി"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു), ഇടതുവശത്ത് <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു), വലതുവശത്ത് <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"സജീവം (മീഡിയ മാത്രം)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"സജീവം (മീഡിയ മാത്രം), ഇടതുവശത്ത് മാത്രം"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 26314d7..c431857 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Холбогдсон (утас байхгүй), батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Холбогдсон (медиа байхгүй), батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Холбогдсон (утас эсвэл медиа байхгүй), батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Идэвхтэй, батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Идэвхтэй, Зүүн: Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Баруун: Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Зүүн: Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Баруун: Батарей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Зүүн тал <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Баруун тал <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Идэвхтэй"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Хадгалсан"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Идэвхтэй, зөвхөн зүүн тал"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Идэвхтэй, зөвхөн баруун тал"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Идэвхтэй, зүүн болон баруун тал"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Идэвхтэй (зөвхөн медиа), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батарей"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Идэвхтэй (зөвхөн медиа), З: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батарей, Б: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батарей"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Холбогдсон (аудио хуваалцахыг дэмждэг), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батарей"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Холбогдсон (аудио хуваалцахыг дэмждэг), З: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батарей, Б: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батарей"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Холбогдсон (аудио хуваалцахыг дэмждэг), зүүн <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Холбогдсон (аудио хуваалцахыг дэмждэг), баруун <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Идэвхтэй (зөвхөн медиа)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Аудио хуваалцахыг дэмждэг"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Идэвхтэй (зөвхөн медиа), зөвхөн зүүн"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index dc197a6..a916a1c 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"कनेक्ट केले (फोन नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"कनेक्ट केले (मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"कनेक्ट केले (फोन किंवा मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"अॅक्टिव्ह, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"अॅक्टिव्ह, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"डावा <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"उजवा <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"अॅक्टिव्ह"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"सेव्ह केली आहेत"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"फक्त डावे अॅक्टिव्ह आहे"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"फक्त उजवे अॅक्टिव्ह आहे"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"डावे आणि उजवे अॅक्टिव्ह आहे"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"अॅक्टिव्ह आहे (फक्त मीडिया), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"ॲक्टिव्ह आहे (फक्त मीडिया), डावे: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, उजवे: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते), डावे: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, उजवे: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते), डावे <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते), उजवे <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"अॅक्टिव्ह आहे (फक्त मीडिया)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ऑडिओ शेअरिंगला सपोर्ट करते"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"अॅक्टिव्ह आहे (फक्त मीडिया), फक्त डावे"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 50b60df..f86206c 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Disambungkan (tiada telefon), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Disambungkan (tiada media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Disambungkan (tiada telefon atau media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktif, bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktif, Ki: bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ka: bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ki: bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Ka: bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kiri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Kanan <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktif"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Disimpan"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktif, kiri sahaja"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktif, kanan sahaja"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktif, kiri dan kanan"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktif (media sahaja), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktif (media sahaja), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateri"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Disambungkan (menyokong perkongsian audio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Disambungkan (menyokong perkongsian audio), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateri"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Disambungkan (menyokong perkongsian audio), kiri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Disambungkan (menyokong perkongsian audio), kanan <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktif (media sahaja)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Menyokong perkongsian audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktif (media sahaja), kiri sahaja"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index a94c359..2dde99f 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"ချိတ်ဆက်ပြီးပြီ (ဖုန်းမရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"ချိတ်ဆက်ပြီးပြီ (မီဒီယာ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"ချိတ်ဆက်ပြီးပြီ (ဖုန်း (သို့) မီဒီယာ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ဖွင့်ထားသည်၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"သုံးနေသည်၊ L− ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>၊ R− ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L− ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>၊ R− ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ဘယ် <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ညာ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ဖွင့်ထားသည်"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"သိမ်းထားသည်များ"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ဖွင့်ထားသည်၊ ဘယ်သီးသန့်"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ဖွင့်ထားသည်၊ ညာသီးသန့်"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ဖွင့်ထားသည်၊ ဘယ်နှင့် ညာ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"သုံးနေသည် (မီဒီယာသီးသန့်)၊ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ဘက်ထရီ"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"သုံးနေသည် (မီဒီယာသီးသန့်)၊ L- <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ဘက်ထရီ၊ R- <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ဘက်ထရီ"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)၊ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ဘက်ထရီ"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)၊ L- <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ဘက်ထရီ၊ R- <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ဘက်ထရီ"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)၊ ဘယ် <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)၊ ညာ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"သုံးနေသည် (မီဒီယာသီးသန့်)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"သုံးနေသည် (မီဒီယာသီးသန့်)၊ ဘယ်သီးသန့်"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - အားပြည့်ရန် <xliff:g id="TIME">%2$s</xliff:g> လိုသည်"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - အားသွင်းခြင်းကို အကောင်းဆုံးပြင်ဆင်ထားသည်"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - အားသွင်းနေသည်"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - <xliff:g id="TIME">%3$s</xliff:g> တွင် အားပြည့်မည်"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> တွင် အားပြည့်မည်"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"<xliff:g id="TIME">%1$s</xliff:g> တွင် အားပြည့်မည်"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g> တွင် အားပြည့်မည်"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"မသိ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"အားသွင်းနေပါသည်"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"အမြန် အားသွင်းနေသည်"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"အားသွင်းပြီးပါပြီ"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"အားအပြည့်သွင်းထားသည်"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"အားသွင်းခြင်းကို ခဏရပ်ထားသည်"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"အားသွင်းနေသည်"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"အမြန်အားသွင်းခြင်း"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"စီမံခန့်ခွဲသူမှ ထိန်းချုပ်ပါသည်"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ကန့်သတ်ဆက်တင်ဖြင့် ထိန်းချုပ်ထားသည်"</string>
<string name="disabled" msgid="8017887509554714950">"ပိတ်ထားပြီး"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"ဖုန်းလိုင်းတစ်ဘား။"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"ဖုန်းလိုင်းနှစ်ဘား။"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"ဖုန်းလိုင်းသုံးဘား။"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"ဖုန်း လေးဘားရှိသည်။"</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"ဖုန်းလိုင်းအပြည့်။"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"ဒေတာမရှိပါ။"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"ဒေတာတစ်ဘား။"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index a46b06b..d2021ba 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Koblet til (ingen telefon), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Koblet til (ingen medier), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Koblet til (ingen telefon eller medier), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batteri: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Venstre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Høyre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Lagret"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, bare venstre"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, bare høyre"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, venstre og høyre"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktiv (bare medieinnhold), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiv (bare medieinnhold), v: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, h: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Tilkoblet (støtter lyddeling), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Tilkoblet (støtter lyddeling), v: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, h: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Tilkoblet (støtter lyddeling), venstre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Tilkoblet (støtter lyddeling), høyre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktiv (bare medieinnhold)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Støtter lyddeling"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktiv (bare medieinnhold), bare venstre"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 6bdcbd8..d01fc16 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"जडान गरियो (फोनबाहेेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"जडान गरियो (मिडियाबाहेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"जडान गरियो (फोन वा मिडियाबाहेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"सक्रिय, ब्याट्रीको स्तर: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"सक्रिय, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ब्याट्री, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ब्याट्री"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"ब्याट्रीको स्तर: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ब्याट्री, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ब्याट्री"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"बायाँ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"दायाँ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"सक्रिय"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"सेभ गरिएको"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"बायाँ मात्र अन छ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"सक्रिय, दायाँ मात्र"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"सक्रिय, बायाँ र दायाँ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"सक्रिय छ (मिडिया मात्र), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ब्याट्री"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"सक्रिय छ (मिडिया मात्र), बायाँ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ब्याट्री, दायाँ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ब्याट्री"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ब्याट्री"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ), बायाँ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ब्याट्री, दायाँ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ब्याट्री"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ), बायाँ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ), दायाँ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"सक्रिय छ (मिडिया मात्र)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"अडियो सेयर गर्न मिल्छ"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"सक्रिय छ (मिडिया मात्र), बायाँ मात्र"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index fb7e4c2..6394cb6 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen telefoon), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen media), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen telefoon of media), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Actief, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterij"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Actief, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterij, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterij"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterij, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterij"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Links <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Rechts <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Actief"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Opgeslagen"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actief, alleen links"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Actief, alleen rechts"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Actief, links en rechts"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Actief (alleen media), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterij"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Actief (alleen media), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterij, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterij"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Verbonden (ondersteunt audio delen), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterij"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Verbonden (ondersteunt audio delen), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batterij, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batterij"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Verbonden (ondersteunt audio delen), links <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Verbonden (ondersteunt audio delen), rechts <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Actief (alleen media)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Ondersteunt audio delen"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Actief (alleen media), alleen links"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - vol over <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Opladen geoptimaliseerd"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ Opladen"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Vol om <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Volledig opgeladen om <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Volledig opgeladen om <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Vol om <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Onbekend"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Opladen"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Snel opladen"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Opgeladen"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Volledig opgeladen"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Opladen in de wacht"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Opladen"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Snel opladen"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ingesteld door beheerder"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Beheerd door beperkte instelling"</string>
<string name="disabled" msgid="8017887509554714950">"Uitgezet"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefoon: één streepje."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefoon: twee streepjes."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefoon: drie streepjes."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Telefoonsignaal 4 streepjes."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Telefoonsignaal is op volle sterkte."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Geen gegevens."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Gegevens: één streepje."</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 180d5cd..eb31f96 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"ସଂଯୁକ୍ତ ନାହିଁ (ଫୋନ୍ ନୁହେଁ), ବ୍ୟାଟେରୀ<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"ସଂଯୁକ୍ତ ହେଲା (ମିଡିଆ ନୁହେଁ), ବ୍ୟାଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"ସଂଯୁକ୍ତ ହେଲା (ଫୋନ୍ କିମ୍ବା ମେଡିଆ ନୁହେଁ), ବ୍ୟାଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ସକ୍ରିୟ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବ୍ୟାଟେରୀ"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ସକ୍ରିୟ, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ବ୍ୟାଟେରୀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ବ୍ୟାଟେରୀ"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବେଟେରୀ"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ବେଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ବ୍ୟାଟେରୀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ବ୍ୟାଟେରୀ"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ବାମ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ଡାହାଣ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ସକ୍ରିୟ"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"ସେଭ କରାଯାଇଛି"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ସକ୍ରିୟ, କେବଳ ବାମ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ସକ୍ରିୟ, କେବଳ ଡାହାଣ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ସକ୍ରିୟ, ବାମ ଏବଂ ଡାହାଣ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"ସକ୍ରିୟ (କେବଳ ମିଡିଆ) <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବେଟେରୀ"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"ସକ୍ରିୟ (କେବଳ ମିଡିଆ), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ବେଟେରୀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ବେଟେରୀ"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"କନେକ୍ଟ ହୋଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସମର୍ଥନ କରେ), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବେଟେରୀ"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"କନେକ୍ଟ ହୋଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସମର୍ଥନ କରେ), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ବେଟେରୀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ବେଟେରୀ"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"କନେକ୍ଟ ହୋଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସମର୍ଥନ କରେ), ବାମ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"କନେକ୍ଟ ହୋଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସମର୍ଥନ କରେ), ଡାହାଣ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"ସକ୍ରିୟ (କେବଳ ମିଡିଆ)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ଅଡିଓ ସେୟାରିଂକୁ ସମର୍ଥନ କରେ"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"ସକ୍ରିୟ (କେବଳ ମିଡିଆ), କେବଳ ବାମ"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - ପୂର୍ଣ୍ଣ ହେବାକୁ ଆଉ <xliff:g id="TIME">%2$s</xliff:g> ବାକି ଅଛି"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - ଚାର୍ଜିଂକୁ ଅପ୍ଟିମାଇଜ କରାଯାଇଛି"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ ଚାର୍ଜିଂ"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - <xliff:g id="TIME">%3$s</xliff:g> ସୁଦ୍ଧା ସମ୍ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବ"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> • <xliff:g id="TIME">%2$s</xliff:g> ସୁଦ୍ଧା ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ଚାର୍ଜ ହୋଇଯିବ"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"<xliff:g id="TIME">%1$s</xliff:g> ସୁଦ୍ଧା ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ଚାର୍ଜ ହୋଇଯିବ"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g> ସୁଦ୍ଧା ସମ୍ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବ"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"ଅଜ୍ଞାତ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ଚାର୍ଜ ହେଉଛି"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"ଶୀଘ୍ର ଚାର୍ଜ ହେଉଛି"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"ଚାର୍ଜ ହୋଇଯାଇଛି"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଚାର୍ଜ ହୋଇଛି"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"ଚାର୍ଜିଂ ହୋଲ୍ଡରେ ଅଛି"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"ଚାର୍ଜ ହେଉଛି"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ଫାଷ୍ଟ ଚାର୍ଜିଂ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ଆଡ୍ମିନ୍ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ପ୍ରତିବନ୍ଧିତ ସେଟିଂ ଦ୍ୱାରା ନିୟନ୍ତ୍ରଣ କରାଯାଇଛି"</string>
<string name="disabled" msgid="8017887509554714950">"ଅକ୍ଷମ ହୋଇଛି"</string>
@@ -636,7 +647,7 @@
<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>
- <string name="add_user_failed" msgid="4809887794313944872">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବାକୁ ବିଫଳ ହେଲା"</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="edit_user_info_message" msgid="6677556031419002895">"ଆପଣ ବାଛିଥିବା ନାମ ଏବଂ ଛବି ଏହି ଡିଭାଇସ ବ୍ୟବହାର କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କୁ ଦେଖାଯିବ।"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"ଫୋନର ଗୋଟିଏ ବାର ଅଛି।"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"ଫୋନର ଦୁଇଟି ବାର୍ ଅଛି।"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"ଫୋନ୍ରେ ତିନୋଟି ବାର୍ ଅଛି।"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"ଫୋନର ଚାରୋଟି ବାର।"</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"ଫୋନ୍ ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"କୌଣସି ଡାଟା ନାହିଁ।"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"ଡାଟାର ଗୋଟିଏ ବାର ଅଛି।"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index db13840..64c4e96 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ਕਿਰਿਆਸ਼ੀਲ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ਬੈਟਰੀ"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ਕਿਰਿਆਸ਼ੀਲ, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ਬੈਟਰੀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ਬੈਟਰੀ"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ਬੈਟਰੀ"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ਬੈਟਰੀ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ਬੈਟਰੀ"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ਖੱਬੇ ਪਾਸੇ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ਸੱਜੇ ਪਾਸੇ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ਕਿਰਿਆਸ਼ੀਲ"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ਕਿਰਿਆਸ਼ੀਲ, ਸਿਰਫ਼ ਖੱਬਾ"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ਕਿਰਿਆਸ਼ੀਲ, ਸਿਰਫ਼ ਸੱਜਾ"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ਕਿਰਿਆਸ਼ੀਲ, ਖੱਬਾ ਅਤੇ ਸੱਜਾ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ਬੈਟਰੀ"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ), ਖੱਬਾ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ਬੈਟਰੀ, ਸੱਜਾ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ਬੈਟਰੀ"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ਬੈਟਰੀ"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ), ਖੱਬਾ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ਬੈਟਰੀ, ਸੱਜਾ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ਬੈਟਰੀ"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ), ਖੱਬਾ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ), ਸੱਜਾ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ), ਸਿਰਫ਼ ਖੱਬਾ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 2eccb04..d4d27e1 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Połączono (bez telefonu), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Połączono (bez multimediów), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Połączono (bez telefonu i multimediów), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktywne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterii"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktywna, L: bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, P: bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naładowania baterii"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, P: bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Po lewej <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Po prawej <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Urządzenie aktywne"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Zapisano"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktywne, tylko lewa strona"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktywne, tylko prawa strona"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktywny, lewa i prawa strona"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktywne (tylko multimedia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naładowania baterii"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktywne (tylko multimedia), lewa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> naładowania baterii, prawa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> naładowania baterii"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Połączone (obsługa udostępniania dźwięku), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naładowania baterii"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Połączone (obsługa udostępniania dźwięku), lewa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> naładowania baterii, prawa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> naładowania baterii"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Połączone (obsługa udostępniania dźwięku), lewa <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Połączone (obsługa udostępniania dźwięku), prawa <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktywne (tylko multimedia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Obsługa udostępniania dźwięku"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktywne (tylko multimedia), tylko lewa"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index f37764a..38df760 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Conectado (sem telefone), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Conectado (sem mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Conectado (sem telefone ou mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ativo, E: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Lado direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ativo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Salvo"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas o esquerdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas o direito"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Ativo (apenas mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Ativo (apenas mídia), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Conectado (com suporte ao compartilhamento de áudio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Conectado (com suporte ao compartilhamento de áudio), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Conectado (com suporte ao compartilhamento de áudio), esquerdo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Conectado (com suporte ao compartilhamento de áudio), direito <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Ativo (apenas mídia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Com suporte ao compartilhamento de áudio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ativo (apenas mídia), apenas esquerdo"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> até a conclusão"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Carregamento otimizado"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> (carregando)"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Carregado até <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Totalmente carregado até <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Totalmente carregado até <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Carregado até <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconhecido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Carregando"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Carregando rápido"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Carregamento suspenso"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Carregamento"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carregamento rápido"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada pelas configurações restritas"</string>
<string name="disabled" msgid="8017887509554714950">"Desativado"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Uma barra de sinal do telefone."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Duas barras de sinal do telefone."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Três barras de sinal do telefone."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Quatro barras do smartphone."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Sinal do telefone cheio."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Nenhum dado."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Uma barra de sinal de dados."</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 31fa3df..9e98623 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Ligado (sem telemóvel), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Ligado (sem multimédia), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Ligado (sem telemóvel nem multimédia), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ativo, E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Lado direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ativo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Guardado"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas esquerdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas direito"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Ativo (apenas para multimédia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Ativo (apenas para multimédia), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Ligado (suporta partilha de áudio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Ligado (suporta partilha de áudio), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Ligado (suporta partilha de áudio), esquerdo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Ligado (suporta partilha de áudio), direito <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Ativo (apenas para multimédia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Suporta partilha de áudio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ativo (apenas para multimédia), apenas esquerdo"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index f37764a..38df760 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Conectado (sem telefone), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Conectado (sem mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Conectado (sem telefone ou mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Ativo, E: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"E: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: Bateria do <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Lado direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Ativo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Salvo"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas o esquerdo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas o direito"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Ativo (apenas mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Ativo (apenas mídia), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Conectado (com suporte ao compartilhamento de áudio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Conectado (com suporte ao compartilhamento de áudio), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Conectado (com suporte ao compartilhamento de áudio), esquerdo <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Conectado (com suporte ao compartilhamento de áudio), direito <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Ativo (apenas mídia)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Com suporte ao compartilhamento de áudio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ativo (apenas mídia), apenas esquerdo"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> até a conclusão"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Carregamento otimizado"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> (carregando)"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Carregado até <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Totalmente carregado até <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Totalmente carregado até <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Carregado até <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconhecido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Carregando"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Carregando rápido"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Carregamento suspenso"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Carregamento"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carregamento rápido"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada pelas configurações restritas"</string>
<string name="disabled" msgid="8017887509554714950">"Desativado"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Uma barra de sinal do telefone."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Duas barras de sinal do telefone."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Três barras de sinal do telefone."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Quatro barras do smartphone."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Sinal do telefone cheio."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Nenhum dado."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Uma barra de sinal de dados."</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index cc64943..dddc116 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Conectat (fără telefon), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Conectat (fără conținut media), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Conectat (fără telefon sau conținut media), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Activ, baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Activ, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterie, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterie"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterie, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterie"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Stânga: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Dreapta: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Activ"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Salvat"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activ, numai stânga"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activ, numai dreapta"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activ, stânga și dreapta"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Activ (numai pentru conținut media), nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Activ (numai pentru conținut media): nivelul bateriei din stânga: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, nivelul bateriei din dreapta: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Conectat (acceptă permiterea accesului la audio), nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Conectat (acceptă permiterea accesului la audio), nivelul bateriei din stânga: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, nivelul bateriei din dreapta: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Conectat (acceptă permiterea accesului la audio), nivelul bateriei din stânga: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Conectat (acceptă permiterea accesului la audio), nivelul bateriei din dreapta: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Activ (numai pentru conținut media)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Acceptă permiterea accesului la audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Activ (numai pentru conținut media), numai stânga"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 117f38e..9a5a400 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Подключено (кроме звонков), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Подключено (кроме аудио), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Подключено (кроме звонков и аудио), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активно. Заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активно. Л: батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; П: батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Уровень заряда: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; П: батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Левый <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Правый <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активно"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Сохранено"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активен, только левое ухо"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активен, только правое ухо"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активен, оба уха"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Используется (только для медиа), заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Используется (только для медиа), заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (Л), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (П)"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Подключено (поддерживается отправка аудио), заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Подключено (поддерживается отправка аудио), заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (Л), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (П)"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Подключено (поддерживается отправка аудио), заряд левого наушника: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Подключено (поддерживается отправка аудио), заряд правого наушника: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Используется (только для медиа)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Поддерживается отправка аудио"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Используется (только для медиа), левый наушник"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 255a6538..0fce42b 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"සම්බන්ධිතයි (දුරකථනය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"සම්බන්ධිතයි (මාධ්ය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"සම්බන්ධිතයි (දුරකථනය හෝ මාධ්ය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ක්රියාකාරී, බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ක්රියාත්මක, ව: බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ද: බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"ව: බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ද: බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"වම <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"දකුණ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ක්රියාකාරී"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"සුරැකිණි"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"සක්රිය, වම පමණි"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"සක්රිය, දකුණ පමණි"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"සක්රිය, වම සහ දකුණ"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"සක්රිය (මාධ්ය පමණි), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> බැටරිය"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"සක්රිය (මාධ්ය පමණි), ව: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> බැටරිය, ද: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> බැටරිය"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීම සහය දක්වයි), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> බැටරිය"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීම සහය දක්වයි), ව: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> බැටරිය, ද: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> බැටරිය"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීම සහය දක්වයි), වම <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීම සහය දක්වයි), දකුණ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"සක්රිය (මාධ්ය පමණි)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ශ්රව්ය බෙදා ගැනීම සහය දක්වයි"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"සක්රිය (මාධ්ය පමණි), වම පමණි"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 47b14c3..74c9e1f 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefónu), úroveň batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez médií), úroveň batérie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefónu a médií), úroveň batérie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktívne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktívne, Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Batéria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batéria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Ľavé: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Pravé: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktívne"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Uložené"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktívne, iba ľavá strana"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktívne, iba pravá strana"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktívne, ľavá aj pravá strana"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktívne (iba médiá), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktívne (iba médiá), Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Pripojené (podporuje zdieľanie zvuku), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Pripojené (podporuje zdieľanie zvuku), Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Pripojené (podporuje zdieľanie zvuku), ľavá strana: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Pripojené (podporuje zdieľanie zvuku), pravá strana: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktívne (iba médiá)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Podporuje zdieľanie zvuku"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktívne (iba médiá), iba ľavá strana"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 6e3f21b..a6d35c80 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Povezano (brez telefona), raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Povezano (brez predstavnosti), raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Povezano (brez telefona ali predstavnosti), raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivno, baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterija: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Levo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Desno: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivna"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Shranjeno"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo levo"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desno"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, levo in desno"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktivno (samo predstavnost), napolnjenost baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktivno (samo predstavnost), napolnjenost leve baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, napolnjenost desne baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Povezano (podpira deljenje zvoka), napolnjenost baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Povezano (podpira deljenje zvoka), napolnjenost leve baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, napolnjenost desne baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Povezano (podpira deljenje zvoka), napolnjenost leve baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Povezano (podpira deljenje zvoka), napolnjenost desne baterije: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktivno (samo predstavnost)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Podpira deljenje zvoka"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktivno (samo predstavnost), samo levo"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – še <xliff:g id="TIME">%2$s</xliff:g> do napolnjenosti"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – polnjenje je optimizirano"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – polnjenje"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – popolnoma napolnjena do <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – popolnoma napolnjena do <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Popolnoma napolnjena do <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Napolnjena do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Neznano"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Polnjenje"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Hitro polnjenje"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Napolnjeno"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Popolnoma napolnjena"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Polnjenje je na čakanju"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Polnjenje"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hitro polnjenje"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Nadzira skrbnik"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Pod nadzorom omejene nastavitve"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogočeno"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefon z eno črtico."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefon z dvema črticama."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefon s tremi črticami."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Telefon štiri črtice."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Signal telefona je poln."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Ni podatkov."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Podatkovni signal z eno črtico."</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 82b3cb2..3f6e803 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"E lidhur (pa telefon), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"E lidhur (pa media), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"E lidhur (pa telefon ose media), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv, bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, L: Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> majtas"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> djathtas"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Të ruajtura"</string>
<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_active_media_only_battery_level" msgid="1164678961213251365">"Aktiv (vetëm për media), bateria në <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiv (vetëm për media), majtas: bateria në <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, djathtas: bateria në <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Lidhur (mbështet ndarjen e audios), bateria në <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Lidhur (mbështet ndarjen e audios), majtas: bateria në <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, djathtas: bateria në <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Lidhur (mbështet ndarjen e audios), majtas <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Lidhur (mbështet ndarjen e audios), djathtas <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktiv (vetëm për media)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Mbështet ndarjen e audios"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktiv (vetëm për media), vetëm majtas"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> derisa të mbushet"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Karikimi u optimizua"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - Po karikohet"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Plot deri në <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Karikohet plotësisht deri në <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Karikohet plotësisht deri në <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Plot deri në <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"I panjohur"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Po karikohet"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Karikim i shpejtë"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Karikuar"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Karikuar plotësisht"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Karikimi në pritje"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Po karikohet"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Karikim i shpejtë"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolluar nga administratori"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrollohet nga \"Cilësimet e kufizuara\""</string>
<string name="disabled" msgid="8017887509554714950">"Çaktivizuar"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefoni ka edhe një vijë."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefoni ka dy vija."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefoni ka tre vija."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Telefoni ka katër vija."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Sinjali i telefonit është i plotë."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Nuk ka të dhëna."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Sinjali është vetëm një vijë."</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 0437a00..135176b 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Повезано (без телефона), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Повезано (без медија), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Повезано (без телефона или медија), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активан, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерије"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активно, Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерије, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерије"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батерија, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерије, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерије"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Лева <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Десна <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активан"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Сачувано"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно, само с леве стране"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно, с десне стране"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно, с леве и десне стране"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Активан (само за медије), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерије"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Активан (само за медије), лево: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерије, десно: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерије"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Повезан (подржава дељење звука), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерије"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Повезан (подржава дељење звука), лево: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерије, десно: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерије"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Повезан (подржава дељење звука), лево <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Повезан (подржава дељење звука), десно <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Активан (само за медије)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Подржава дељење звука"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Активан (само за медије), само лево"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 5e6db36..7712203 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Ansluten (ingen mobil), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Ansluten (inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Ansluten (ingen mobil och inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktiv. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktiv, V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri. H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batteri: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri. H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Vänster <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Höger <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiv"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Sparad"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, bara vänster"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, bara höger"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, vänster och höger"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktiv (endast media), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktiv (endast media), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Ansluten (ljuddelning stöds), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Ansluten (ljuddelning stöds), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Ansluten (ljuddelning stöds), vänster <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Ansluten (ljuddelning stöds), höger <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktiv (endast media)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Ljuddelning stöds"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktiv (endast media), endast vänster"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> kvar tills fulladdat"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Laddningen har optimerats"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – laddas"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – fulladdad till <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – fulladdad till <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Fulladdad till <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Fulladdad till <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Okänd"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Laddar"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Laddas snabbt"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Laddat"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Fulladdad"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Laddningen har pausats"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Laddning"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Snabbladdning"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Strys av administratören"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Styrs av spärrad inställning"</string>
<string name="disabled" msgid="8017887509554714950">"Inaktiverad"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefon: en stapel."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefon: två staplar."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefon: tre staplar."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Telefon fyra staplar."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Telefonsignalen är full."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Inga data."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Data: en stapel."</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index a0d8fb9..53d583a 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Imeunganishwa (hamna simu), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Imeunganishwa (hamna kifaa cha sauti), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Imeunganishwa (hamna simu au kifaa cha sauti), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Inatumika, betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Inatumika, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ya betri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ya betri"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ya betri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ya betri"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kushoto <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Kulia <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Kimeunganishwa"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Imeokoa"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Inatumika, kushoto pekee"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Inatumika, kulia pekee"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Inatumika, kushoto na kulia"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Inatumika (maudhui pekee), chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Inatumika (maudhui pekee), Kushoto: chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Kulia: chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja), chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja), Kushoto: chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Kulia: chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja), chaji ya betri ya kushoto imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja), chaji ya betri ya kulia imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Inatumika (maudhui pekee)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Inaweza kutumia kipengele cha kusikiliza pamoja"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Inatumika (maudhui pekee), kushoto pekee"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index c6896a2..db11263 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"இணைக்கப்பட்டது (மொபைல் இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"இணைக்கப்பட்டது (மீடியா இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"இணைக்கப்பட்டது (மொபைல் அல்லது மீடியா இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"செயலில் உள்ளது, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> பேட்டரி"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"செயலில் உள்ளது, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> பேட்டரி, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> பேட்டரி"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> பேட்டரி"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> பேட்டரி, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> பேட்டரி"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"இடதுபுறம்: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"வலதுபுறம்: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"செயலில் உள்ளது"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"சேமிக்கப்பட்டது"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"இடது பக்கம் மட்டும் செயலில் உள்ளது"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"வலது பக்கம் மட்டும் செயலில் உள்ளது"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"வலது மற்றும் இடது பக்கம் செயலில் உள்ளது"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"செயலிலுள்ளது (மீடியா மட்டும்), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> பேட்டரி"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"செயலிலுள்ளது (மீடியா மட்டும்), இடது: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> பேட்டரி, வலது: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> பேட்டரி"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> பேட்டரி"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது), இடது: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> பேட்டரி, வலது: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> பேட்டரி"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது), இடது: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது), வலது: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"செயலிலுள்ளது (மீடியா மட்டும்)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ஆடியோ பகிர்வை ஆதரிக்கிறது"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"செயலிலுள்ளது (மீடியா மட்டும்), இடதுபுறம் மட்டும்"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - முழுவதும் சார்ஜாக <xliff:g id="TIME">%2$s</xliff:g> ஆகும்"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - சார்ஜிங் மேம்படுத்தப்பட்டது"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ சார்ஜாகிறது"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - <xliff:g id="TIME">%3$s</xliff:g>க்கு முழுமையாகச் சார்ஜாகிவிடும்"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>க்கு முழுமையாகச் சார்ஜாகிவிடும்"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"<xliff:g id="TIME">%1$s</xliff:g>க்கு முழுமையாகச் சார்ஜாகிவிடும்"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g>க்கு முழுமையாகச் சார்ஜாகிவிடும்"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"அறியப்படாத"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"சார்ஜ் ஆகிறது"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"வேகமாக சார்ஜாகிறது"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"சார்ஜாகிவிட்டது"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"முழுவதும் சார்ஜாகிவிட்டது"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"சார்ஜிங் இடைநிறுத்தப்பட்டுள்ளது"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"சார்ஜாகிறது"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"விரைவு சார்ஜிங்"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"நிர்வாகி கட்டுப்படுத்துகிறார்"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"வரையறுக்கப்பட்ட அமைப்பால் கட்டுப்படுத்தப்படுகிறது"</string>
<string name="disabled" msgid="8017887509554714950">"முடக்கப்பட்டது"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"சிக்னல் ஒரு கோட்டில் உள்ளது."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"சிக்னல் இரண்டு கோட்டில் உள்ளது."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"சிக்னல் மூன்று கோட்டில் உள்ளது."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"நான்கு மொபைல் சிக்னல் கோடுகள்."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"சிக்னல் முழுமையாக உள்ளது."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"டேட்டா சிக்னல் இல்லை."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"தரவு சிக்னல் ஒரு கோட்டில் உள்ளது."</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 33c673a..c2faca9 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"కనెక్ట్ చేయబడింది (ఫోన్ కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"కనెక్ట్ చేయబడింది (మీడియా కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"కనెక్ట్ చేయబడింది (ఫోన్ లేదా మీడియా కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"యాక్టివ్గా ఉంది, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> బ్యాటరీ"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"యాక్టివ్, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> బ్యాటరీ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> బ్యాటరీ"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> బ్యాటరీ"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> బ్యాటరీ, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> బ్యాటరీ"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ఎడమ వైపు <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"కుడి వైపు <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"యాక్టివ్గా ఉంది"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"సేవ్ చేయబడింది"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"యాక్టివ్గా ఉంది, ఎడమవైపు మాత్రమే యాక్టివ్గా ఉంది"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"యాక్టివ్గా ఉంది, కుడివైపు యాక్టివ్గా ఉంది"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"యాక్టివ్గా ఉంది, ఎడమవైపు, కుడివైపు యాక్టివ్గా ఉంది"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"యాక్టివ్ (మీడియా మాత్రమే), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> బ్యాటరీ"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"యాక్టివ్ (మీడియా మాత్రమే), ఎడమ వైపు: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> బ్యాటరీ, కుడివైపు: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> బ్యాటరీ"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> బ్యాటరీ"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది), ఎడమ వైపు: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> బ్యాటరీ, కుడివైపు: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> బ్యాటరీ"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది), ఎడమ వైపు <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది), కుడివైపు <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"యాక్టివ్ (మీడియా మాత్రమే)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"యాక్టివ్ (మీడియా మాత్రమే), ఎడమ వైపు మాత్రమే"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 8910d2e..7b03f81 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"เชื่อมต่อแล้ว (ไม่รวมโทรศัพท์) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"เชื่อมต่อแล้ว (ไม่รวมสื่อ) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"เชื่อมต่อแล้ว (ไม่รวมโทรศัพท์หรือสื่อ) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"ใช้งานอยู่ แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"ใช้งานอยู่ L: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"ฝั่งซ้าย <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"ฝั่งขวา <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"ใช้งานอยู่"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"บันทึกแล้ว"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ใช้งานอยู่ เฉพาะข้างซ้าย"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ใช้งานอยู่ เฉพาะข้างขวา"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ใช้งานอยู่ ข้างซ้ายและขวา"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"ใช้งานอยู่ (สื่อเท่านั้น), แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"ใช้งานอยู่ (สื่อเท่านั้น), L: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"เชื่อมต่อแล้ว (รองรับการแชร์เสียง), แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"เชื่อมต่อแล้ว (รองรับการแชร์เสียง), L: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"เชื่อมต่อแล้ว (รองรับการแชร์เสียง), ซ้าย <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"เชื่อมต่อแล้ว (รองรับการแชร์เสียง), ขวา <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"ใช้งานอยู่ (สื่อเท่านั้น)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"รองรับการแชร์เสียง"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"ใช้งานอยู่ (สื่อเท่านั้น), ซ้ายเท่านั้น"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index aaa2bd0..8eef17e 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Nakakonekta (walang telepono), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Nakakonekta (walang media), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Nakakonekta (walang telepono o media), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktibo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktibo, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterya"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterya"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kaliwa <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Kanan <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktibo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Na-save"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktibo, kaliwa lang"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktibo, kanan lang"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktibo, kaliwa at kanan"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Aktibo (media lang), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Aktibo (media lang), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterya"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Nakakonekta (sinusuportahan ang pag-share ng audio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Nakakonekta (sinusuportahan ang pag-share ng audio), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterya, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterya"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Nakakonekta (sinusuportahan ang pag-share ng audio), kaliwa <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Nakakonekta (sinusuportahan ang pag-share ng audio), kanan <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Aktibo (media lang)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Sinusuportahan ang pag-share ng audio"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Aktibo (media lang), kaliwa lang"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> na lang bago mapuno"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Naka-optimize ang pag-charge"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - Nagcha-charge"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Mapupuno sa <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Mafu-full charge sa <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Mafu-full charge sa <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Mapupuno sa <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Hindi Kilala"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Nagcha-charge"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Mabilis na charge"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Puno ang Baterya"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Naka-hold ang pag-charge"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Nagcha-charge"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pinapamahalaan ng admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kinokontrol ng Pinaghihigpitang Setting"</string>
<string name="disabled" msgid="8017887509554714950">"Naka-disable"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telepono na isang bar."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telepono na dalawang bar."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telepono na tatlong bar."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Apat na bar ang telepono."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Puno ang signal ng telepono."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Walang data."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Data na isang bar."</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index bf990c7..cf5bd2d 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (telefon yok), pil <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (medya yok), pil <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (telefon veya medya yok), pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Etkin, pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Etkin, Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pil, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pil"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Pil <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pil, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pil"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Sol <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Sağ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Etkin"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Kaydedildi"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Yalnızca sol tarafta etkin"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Yalnızca sağ tarafta etkin"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Sol ve sağ tarafta etkin"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Etkin (yalnızca medya), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pil seviyesi"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Etkin (yalnızca medya), Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pil seviyesi, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pil seviyesi"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Bağlı (ses paylaşımını destekler), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pil seviyesi"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Bağlı (ses paylaşımını destekler), Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pil seviyesi, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pil seviyesi"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Bağlı (ses paylaşımını destekler), sol <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Bağlı (ses paylaşımını destekler), sağ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Etkin (yalnızca medya)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Ses paylaşımını destekler"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Etkin (yalnızca medya), yalnızca sol"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tamamen şarj olmasına <xliff:g id="TIME">%2$s</xliff:g> kaldı"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - Şarj işlemi optimize edildi"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ Şarj ediliyor"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Tamamen dolacağı zaman: <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tamamen şarj olacağı zaman: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Tamamen şarj olacağı zaman: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Tamamen dolacağı zaman: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Bilinmiyor"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Şarj oluyor"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Hızlı şarj oluyor"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Şarj oldu"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Pilin Şarjı Tam"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Şarj işlemi beklemede"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Şarj"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hızlı şarj"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Yönetici tarafından denetleniyor"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kısıtlanmış ayar tarafından kontrol ediliyor"</string>
<string name="disabled" msgid="8017887509554714950">"Devre dışı"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Telefon sinyali bir çubuk."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Telefon sinyali iki çubuk."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Telefon sinyali üç çubuk."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Telefon sinyali dört çubuk."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Telefon sinyali tam."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Veri yok."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Veri sinyali bir çubuk."</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index d945b5f..4b40503 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без телефона), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без медіа), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без телефона й медіа), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Активовано, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Активний. Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> заряду акумулятора, П: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> заряду акумулятора"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Заряд акумулятора: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> заряду акумулятора, П: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> заряду акумулятора"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Ліва частина: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Права частина: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активовано"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Збережено"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активовано, лише лівий"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активовано, лише правий"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активовано, лівий і правий"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Активно (лише для мультимедіа); <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Активно (лише для мультимедіа); лівий: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> заряду акумулятора, правий: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> заряду акумулятора"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Підключено (підтримує надсилання аудіо); <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Підключено (підтримує надсилання аудіо); лівий: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> заряду акумулятора, правий: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> заряду акумулятора"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Підключено (підтримує надсилання аудіо); лівий: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Підключено (підтримує надсилання аудіо); правий: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Активно (лише для мультимедіа)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Підтримує надсилання аудіо"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Активно (лише для мультимедіа); лише лівий"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до повного заряду"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – заряджання оптимізовано"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – заряджається"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Завершиться до <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Повністю зарядиться до <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Повністю зарядиться до <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Завершиться до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Невідомо"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Заряджається"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Швидке заряджання"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Заряджено"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Повністю заряджено"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Заряджання призупинено"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Заряджання"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Швидке заряджання"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Керується адміністратором"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Керується налаштуваннями з обмеженнями"</string>
<string name="disabled" msgid="8017887509554714950">"Вимкнено"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Одна смужка сигналу телефону."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Дві смужки сигналу телефону."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Три смужки сигналу телефону."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Чотири смужки сигналу телефона."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Максимальний сигнал телефону."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Немає сигналу даних."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Одна смужка сигналу даних."</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index ee8da90..a1b2198 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"منسلک ہے (فون کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"منسلک ہے (میڈیا کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"منسلک ہے (فون یا میڈیا کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"فعال، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> بیٹری"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"فعال، بائيں: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> بیٹری، دائیں: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> بیٹری"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> بیٹری"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"بائيں: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> بیٹری، دائیں: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> بیٹری"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> چھوڑ دیا"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"دائیں <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"فعال"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"محفوظ ہے"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"فعال، صرف بائیں طرف"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"فعال، صرف دائیں طرف"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"فعال، صرف بائیں اور دائیں طرف"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"فعال (صرف میڈیا)، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> بیٹری"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"فعال (صرف میڈیا)، L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> بیٹری، R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> بیٹری"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> بیٹری"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)، L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> بیٹری، R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> بیٹری"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)، بائیں <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)، دائیں <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"فعال (صرف میڈیا)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"آڈیو کے اشتراک کو سپورٹ کرتا ہے"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"فعال (صرف میڈیا)، صرف بائیں"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 0559db1..82f4576 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (telefondan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (mediadan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (telefon yoki mediadan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Faol, batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Faol, L: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batareya: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Chapda: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Oʻngda: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Faol"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Saqlangan"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Faol, faqat chap"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Faol, faqat oʻng"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Faol, chap va oʻng"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Faol (faqat media uchun), quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Faol (faqat media uchun), quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (L), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (R)"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Ulangan (audio yuborish mumkin), quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Ulangan (audio yuborish mumkin), quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (L), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (R)"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Ulangan (audio yuborish mumkin), quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (chap)"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Ulangan (audio yuborish mumkin), quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (oʻng)"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Faol (faqat media uchun)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Audio yuborishi mumkin"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Faol (faqat media uchun), faqat chap"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index d0062d45..9a1386e 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Đã kết nối (không có điện thoại), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Đã kết nối (không có phương tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Đã kết nối (không có điện thoại hoặc phương tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Đang hoạt động, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Đang hoạt động, Trái: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Phải: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Trái: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Phải: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Bên trái <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Bên phải <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Đang hoạt động"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Đã lưu"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Đang hoạt động, chỉ tai bên trái"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Đang hoạt động, chỉ tai phải"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Đang hoạt động, cả tai phải và tai trái"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Đang hoạt động (chỉ phát nội dung đa phương tiện), pin còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Đang hoạt động (chỉ phát nội dung đa phương tiện), L: pin còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: pin còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh), pin còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh), L: pin còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: pin còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh), tai nghe bên trái còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh), tai nghe bên phải còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Đang hoạt động (chỉ phát nội dung đa phương tiện)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Hỗ trợ tính năng chia sẻ âm thanh"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Đang hoạt động (chỉ phát nội dung đa phương tiện), chỉ dùng tai nghe bên trái"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> nữa là pin đầy"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> – Quá trình sạc được tối ưu hoá"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – Đang sạc"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATUS">%2$s</xliff:g> – Pin sẽ đầy vào <xliff:g id="TIME">%3$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> – Pin sẽ đầy vào <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Pin sẽ đầy vào <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Pin sẽ đầy vào <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Không xác định"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Đang sạc"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Đang sạc nhanh"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"Đã sạc"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Đã sạc đầy"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Đang tạm ngưng sạc"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"Đang sạc"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Đang sạc nhanh"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Do quản trị viên kiểm soát"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Do chế độ Cài đặt hạn chế kiểm soát"</string>
<string name="disabled" msgid="8017887509554714950">"Đã tắt"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"Tín hiệu điện thoại một vạch."</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"Tín hiệu điện thoại hai vạch."</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"Tín hiệu điện thoại ba vạch."</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"Tín hiệu điện thoại 4 vạch."</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"Tín hiệu điện thoại đầy đủ."</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"Không có dữ liệu."</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"Tín hiệu dữ liệu một vạch."</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index a291ede..d3f8945 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"已连接(无手机信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"已连接(无媒体信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"已连接(无手机或媒体信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"使用中,电池电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"使用中,左:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 电量,右:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 电量"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 的电量"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"电池电量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"左:目前电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>;右:目前电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"左耳机电池电量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"右耳机电池电量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"使用中"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"已保存的设备"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,仅左耳助听器"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,仅右耳助听器"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳助听器"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"使用中(仅限媒体),电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"使用中(仅限媒体),左侧电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右侧电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"已连接(支持音频分享),电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"已连接(支持音频分享),左侧电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右侧电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"已连接(支持音频分享),左侧电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"已连接(支持音频分享),右侧电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"使用中(仅限媒体)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"支持音频分享"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"使用中(仅限媒体),仅左侧"</string>
@@ -487,14 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - 还需<xliff:g id="TIME">%2$s</xliff:g>充满"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - 充电方式已优化"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - 正在充电"</string>
- <!-- no translation found for power_fast_charging_duration_v2 (3797735998640359490) -->
- <skip />
- <!-- no translation found for power_charging_duration_v2 (2938998284074003248) -->
- <skip />
- <!-- no translation found for power_remaining_charging_duration_only_v2 (5358176435722950193) -->
- <skip />
- <!-- no translation found for power_remaining_fast_charging_duration_only_v2 (6270950195810579563) -->
- <skip />
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - <xliff:g id="TIME">%3$s</xliff:g> 前充满"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> 前充满"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"<xliff:g id="TIME">%1$s</xliff:g> 前充满"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g> 前充满"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"未知"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"正在充电"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"正在快速充电"</string>
@@ -506,10 +519,8 @@
<string name="battery_info_status_full" msgid="1339002294876531312">"已充满电"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"已充满电"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"充电已暂停"</string>
- <!-- no translation found for battery_info_status_charging_v2 (6118522107222245505) -->
- <skip />
- <!-- no translation found for battery_info_status_charging_fast_v2 (1825439848151256589) -->
- <skip />
+ <string name="battery_info_status_charging_v2" msgid="6118522107222245505">"正在充电"</string>
+ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"正在快速充电"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"由管理员控制"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由受限设置控制"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
@@ -696,8 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"手机信号强度为一格。"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"手机信号强度为两格。"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"手机信号强度为三格。"</string>
- <!-- no translation found for accessibility_phone_four_bars (4477202400261338403) -->
- <skip />
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"手机信号满格。"</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"手机信号满格。"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"没有数据网络信号。"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"数据信号强度为一格。"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 2545abf..b5a1d51 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"已連接 (無手機音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"已連接 (無媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"已連接 (無手機或媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"使用中,電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"已啟用,左:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 電量,右:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"左:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 電量,右:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"左耳機:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"右耳機:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"使用中"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"已儲存"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,僅左耳"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,僅右耳"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"啟用 (只限媒體),<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 電量"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"啟用 (只限媒體),左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 電量,右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"已連線 (支援音訊分享功能),<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 電量"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"已連線 (支援音訊分享功能),左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 電量,右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"已連線 (支援音訊分享功能),左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"已連線 (支援音訊分享功能),右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"啟用 (只限媒體)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"支援音訊分享功能"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"左側啟用 (只限媒體)"</string>
@@ -487,10 +504,10 @@
<string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>後充滿電"</string>
<string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - 已優化充電"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ 充電中"</string>
- <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - <xliff:g id="TIME">%3$s</xliff:g> 前充飽"</string>
- <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> 前充飽"</string>
- <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"<xliff:g id="TIME">%1$s</xliff:g> 前充飽"</string>
- <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g> 前充飽"</string>
+ <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - 在 <xliff:g id="TIME">%3$s</xliff:g>前充滿電"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> • 在 <xliff:g id="TIME">%2$s</xliff:g>前充滿電"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"在 <xliff:g id="TIME">%1$s</xliff:g>前充滿電"</string>
+ <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"在 <xliff:g id="TIME">%1$s</xliff:g>前充滿電"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"未知"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"快速充電中"</string>
@@ -690,7 +707,7 @@
<string name="accessibility_phone_one_bar" msgid="5719721147018970063">"電話訊號強度為一格。"</string>
<string name="accessibility_phone_two_bars" msgid="2531458337458953263">"電話訊號強度為兩格。"</string>
<string name="accessibility_phone_three_bars" msgid="1523967995996696619">"電話訊號強度為三格。"</string>
- <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"手機訊號滿格。"</string>
+ <string name="accessibility_phone_four_bars" msgid="4477202400261338403">"電話有四格。"</string>
<string name="accessibility_phone_signal_full" msgid="4302338883816077134">"電話訊號滿格。"</string>
<string name="accessibility_no_data" msgid="4563181886936931008">"沒有數據網絡。"</string>
<string name="accessibility_data_one_bar" msgid="6892888138070752480">"數據網絡訊號強度為一格。"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 6aa0700..a131c12 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"已連線 (無手機音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"已連線 (無媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"已連線 (無手機或媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"使用中,電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"已啟用,左:目前電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右:目前電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"左:目前電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右:目前電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"左耳機:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"右耳機:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"使用中"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"已儲存"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,僅左耳"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,僅右耳"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"啟用 (僅限媒體),<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 剩餘電力"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"啟用 (僅限媒體),左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 剩餘電力,右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 剩餘電力"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"已連線 (支援音訊分享),<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 剩餘電力"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"已連線 (支援音訊分享),左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 剩餘電力,右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 剩餘電力"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"已連線 (支援音訊分享),左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"已連線 (支援音訊分享),右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"啟用 (僅限媒體)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"支援音訊分享"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"左側啟用 (僅限媒體)"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 254f2c2..f9bdfbf 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -94,24 +94,41 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Ixhunyiwe (ayikho ifoni), ibhethri ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Ixhunyiwe (ayikho imidiya), ibhethri iku-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Ixhunyiwe (ayikho ifoni noma imidiya), ibhethri ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
- <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Kuyasebenza, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri"</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Kuyasebenza, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ibhethri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ibhethri"</string>
+ <!-- no translation found for bluetooth_active_battery_level (2685517576209066008) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered (4961338936672922617) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_left (5521405563527657515) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_battery_level_untethered_right (7165552824664523336) -->
+ <skip />
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Ibhethri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ibhethri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ibhethri"</string>
- <string name="bluetooth_battery_level_untethered_left" msgid="2952823007648782646">"Kwesokunxele <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right" msgid="6525710737740083276">"Kwesokudla <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_battery_level_untethered (1616774716076301755) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left (5725764679536058365) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right (8377995536997790142) -->
+ <skip />
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Iyasebenza"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Ilondoloziwe"</string>
<string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Iyasebenza, ngakwesokunxele kuphela"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Iyasebenza, ngakwesokudla kuphela"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Iyasebenza, ngakwesokunxele nakwesokudla"</string>
- <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Ibhethri (imidiya kuphela), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> liyasebenza"</string>
- <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Liyasebenza (imidiya kuphela), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ibhethri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ibhethri"</string>
- <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Ixhunyiwe (isekela ukwabelana ngokuqoshiwe), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> webhethri"</string>
- <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Ixhunyiwe (isekela ukwabelana ngokuqoshiwe), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> webhethri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> webhethri"</string>
- <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Ixhunyiwe (isekela ukwabelana ngokuqoshiwe), ngakwesokunxele ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Ixhunyiwe (isekela ukwabelana ngokuqoshiwe), ngakwesokudla ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_media_only_battery_level (7772517511061834073) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (7444753133664620926) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_lea_support (5968584103507988820) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_lea_support (803110681688633362) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (7707464334346454950) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (8941549024377771038) -->
+ <skip />
+ <!-- no translation found for bluetooth_no_battery_level_lea_support (5721725041048434075) -->
+ <skip />
<string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Kuyasebenza (imidiya kuphela)"</string>
<string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Isekela ukwabelana ngokuqoshiwe"</string>
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Iyasebenza (imidiya kuphela), ngakwesokunxele kuphela"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index a67839a..1515811 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -200,6 +200,10 @@
<string name="bluetooth_active_battery_level">Active. <xliff:g id="battery_level_as_percentage">%1$s</xliff:g> battery.</string>
<!-- Connected devices settings. Message when Bluetooth is connected and active, showing remote device status and battery level for untethered headset. [CHAR LIMIT=NONE] -->
<string name="bluetooth_active_battery_level_untethered">Active. L: <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g>, R: <xliff:g id="battery_level_as_percentage" example="25%">%2$s</xliff:g> battery.</string>
+ <!-- Connected devices settings. Message when Bluetooth is connected and active, showing remote device status and battery level for the left part of the untethered headset. [CHAR LIMIT=NONE] -->
+ <string name="bluetooth_active_battery_level_untethered_left">Active. L: <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g> battery.</string>
+ <!-- Connected devices settings. Message when Bluetooth is connected and active, showing remote device status and battery level for the right part of the untethered headset. [CHAR LIMIT=NONE] -->
+ <string name="bluetooth_active_battery_level_untethered_right">Active. R: <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g> battery.</string>
<!-- Connected devices settings. Message when Bluetooth is connected but not in use, showing remote device battery level. [CHAR LIMIT=NONE] -->
<string name="bluetooth_battery_level"><xliff:g id="battery_level_as_percentage">%1$s</xliff:g> battery</string>
<!-- Connected devices settings. Message on TV when Bluetooth is connected but not in use, showing remote device battery level. [CHAR LIMIT=NONE] -->
@@ -216,11 +220,11 @@
<string name="bluetooth_saved_device">Saved</string>
<!-- Connected device settings. Message when the left-side hearing aid device is active. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_hearing_aid_left_active">Active, left only</string>
+ <string name="bluetooth_hearing_aid_left_active">Active (left only)</string>
<!-- Connected device settings. Message when the right-side hearing aid device is active. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_hearing_aid_right_active">Active, right only</string>
+ <string name="bluetooth_hearing_aid_right_active">Active (right only)</string>
<!-- Connected device settings. Message when the left-side and right-side hearing aids device are active. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_hearing_aid_left_and_right_active">Active, left and right</string>
+ <string name="bluetooth_hearing_aid_left_and_right_active">Active (left and right)</string>
<!-- Connected devices settings. Message when Bluetooth is connected and active for media only, showing remote device status and battery level. [CHAR LIMIT=NONE] -->
<string name="bluetooth_active_media_only_battery_level">Active (media only). <xliff:g id="battery_level_as_percentage">%1$s</xliff:g> battery.</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java b/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java
index 4af9e3c..2f6d839 100644
--- a/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java
@@ -106,8 +106,7 @@
AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
Context authContext = context.createPackageContextAsUser(desc.packageName, 0,
mUserHandle);
- icon = mContext.getPackageManager().getUserBadgedIcon(
- authContext.getDrawable(desc.iconId), mUserHandle);
+ icon = authContext.getDrawable(desc.iconId);
synchronized (mAccTypeIconCache) {
mAccTypeIconCache.put(accountType, icon);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 06c41cb..fd9a008 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -2131,7 +2131,13 @@
public boolean filterApp(AppEntry entry) {
return !AppUtils.isInstant(entry.info)
&& hasFlag(entry.info.privateFlags,
- ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS);
+ ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS)
+ && !entry.hideInQuietMode;
+ }
+
+ @Override
+ public void refreshAppEntryOnRebuild(@NonNull AppEntry appEntry, boolean hideInQuietMode) {
+ appEntry.hideInQuietMode = hideInQuietMode;
}
};
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index 36a9ecf..a7b7da5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -1476,30 +1476,13 @@
}
}
- // Try to show left/right information if can not get it from battery for hearing
+ // Try to show left/right information for hearing
// aids specifically.
boolean isActiveAshaHearingAid = mIsActiveDeviceHearingAid;
boolean isActiveLeAudioHearingAid = mIsActiveDeviceLeAudio
&& isConnectedHapClientDevice();
if (isActiveAshaHearingAid || isActiveLeAudioHearingAid) {
- final Set<CachedBluetoothDevice> memberDevices = getMemberDevice();
- final CachedBluetoothDevice subDevice = getSubDevice();
- if (memberDevices.stream().anyMatch(m -> m.isConnected())) {
- stringRes = R.string.bluetooth_hearing_aid_left_and_right_active;
- } else if (subDevice != null && subDevice.isConnected()) {
- stringRes = R.string.bluetooth_hearing_aid_left_and_right_active;
- } else {
- int deviceSide = getDeviceSide();
- if (deviceSide == HearingAidInfo.DeviceSide.SIDE_LEFT_AND_RIGHT) {
- stringRes = R.string.bluetooth_hearing_aid_left_and_right_active;
- } else if (deviceSide == HearingAidInfo.DeviceSide.SIDE_LEFT) {
- stringRes = R.string.bluetooth_hearing_aid_left_active;
- } else if (deviceSide == HearingAidInfo.DeviceSide.SIDE_RIGHT) {
- stringRes = R.string.bluetooth_hearing_aid_right_active;
- } else {
- stringRes = R.string.bluetooth_active_no_battery_level;
- }
- }
+ return getHearingDeviceSummary(leftBattery, rightBattery, shortSummary);
}
}
}
@@ -1567,6 +1550,62 @@
return spannableBuilder;
}
+ private CharSequence getHearingDeviceSummary(int leftBattery, int rightBattery,
+ boolean shortSummary) {
+
+ CachedBluetoothDevice memberDevice = getMemberDevice().stream().filter(
+ CachedBluetoothDevice::isConnected).findFirst().orElse(null);
+ if (memberDevice == null && mSubDevice != null && mSubDevice.isConnected()) {
+ memberDevice = mSubDevice;
+ }
+
+ CachedBluetoothDevice leftDevice = null;
+ CachedBluetoothDevice rightDevice = null;
+ final int deviceSide = getDeviceSide();
+ if (deviceSide == HearingAidInfo.DeviceSide.SIDE_LEFT) {
+ leftDevice = this;
+ rightDevice = memberDevice;
+ } else if (deviceSide == HearingAidInfo.DeviceSide.SIDE_RIGHT) {
+ leftDevice = memberDevice;
+ rightDevice = this;
+ } else if (deviceSide == HearingAidInfo.DeviceSide.SIDE_LEFT_AND_RIGHT) {
+ leftDevice = this;
+ rightDevice = this;
+ }
+
+ if (leftBattery < 0 && leftDevice != null) {
+ leftBattery = leftDevice.getBatteryLevel();
+ }
+ if (rightBattery < 0 && rightDevice != null) {
+ rightBattery = rightDevice.getBatteryLevel();
+ }
+
+ if (leftDevice != null && rightDevice != null) {
+ if (leftBattery >= 0 && rightBattery >= 0 && !shortSummary) {
+ return mContext.getString(R.string.bluetooth_active_battery_level_untethered,
+ Utils.formatPercentage(leftBattery), Utils.formatPercentage(rightBattery));
+ } else {
+ return mContext.getString(R.string.bluetooth_hearing_aid_left_and_right_active);
+ }
+ } else if (leftDevice != null) {
+ if (leftBattery >= 0 && !shortSummary) {
+ return mContext.getString(R.string.bluetooth_active_battery_level_untethered_left,
+ Utils.formatPercentage(leftBattery));
+ } else {
+ return mContext.getString(R.string.bluetooth_hearing_aid_left_active);
+ }
+ } else if (rightDevice != null) {
+ if (rightBattery >= 0 && !shortSummary) {
+ return mContext.getString(R.string.bluetooth_active_battery_level_untethered_right,
+ Utils.formatPercentage(rightBattery));
+ } else {
+ return mContext.getString(R.string.bluetooth_hearing_aid_right_active);
+ }
+ }
+
+ return mContext.getString(R.string.bluetooth_active_no_battery_level);
+ }
+
private void addBatterySpan(SpannableStringBuilder builder,
String batteryString, boolean lowBattery, int lowBatteryColorRes) {
if (lowBattery && lowBatteryColorRes != SUMMARY_NO_COLOR_FOR_LOW_BATTERY) {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
index c13c493..b356f54 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
@@ -697,7 +697,7 @@
// Set device as Active for Hearing Aid and test connection state summary
mCachedDevice.setHearingAidInfo(getLeftAshaHearingAidInfo());
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID);
- assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active, left only");
+ assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active (left only)");
// Set Hearing Aid profile to be disconnected and test connection state summary
mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEARING_AID);
@@ -717,7 +717,7 @@
mCachedDevice.setHearingAidInfo(getLeftAshaHearingAidInfo());
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID);
assertThat(mCachedDevice.getTvConnectionSummary().toString()).isEqualTo(
- "Active, left only");
+ "Active (left only)");
// Set Hearing Aid profile to be disconnected and test connection state summary
mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEARING_AID);
@@ -794,7 +794,7 @@
// Act & Assert:
// Get "Active" result without Battery Level.
- assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active, right only");
+ assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active (right only)");
}
@Test
@@ -810,7 +810,7 @@
// Act & Assert:
// Get "Active" result without Battery Level.
assertThat(mCachedDevice.getTvConnectionSummary().toString()).isEqualTo(
- "Active, right only");
+ "Active (right only)");
}
@Test
@@ -828,7 +828,7 @@
// Act & Assert:
// Get "Active" result without Battery Level.
- assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active, left and right");
+ assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active (left and right)");
}
@Test
@@ -847,7 +847,7 @@
// Act & Assert:
// Get "Active" result without Battery Level.
assertThat(mCachedDevice.getTvConnectionSummary().toString())
- .isEqualTo("Active, left and right");
+ .isEqualTo("Active (left and right)");
}
@Test
@@ -894,7 +894,7 @@
// Set device as Active for LE Audio and test connection state summary
mCachedDevice.setHearingAidInfo(getLeftLeAudioHearingAidInfo());
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.LE_AUDIO);
- assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active, left only");
+ assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active (left only)");
// Set LE Audio profile to be disconnected and test connection state summary
mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.LE_AUDIO);
@@ -915,7 +915,7 @@
mCachedDevice.setHearingAidInfo(getLeftLeAudioHearingAidInfo());
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.LE_AUDIO);
assertThat(mCachedDevice.getTvConnectionSummary().toString()).isEqualTo(
- "Active, left only");
+ "Active (left only)");
// Set LE Audio profile to be disconnected and test connection state summary
mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.LE_AUDIO);
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 75c0cec..9d02074 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -273,6 +273,7 @@
Settings.Secure.AUDIO_DEVICE_INVENTORY,
Settings.Secure.SCREEN_RESOLUTION_MODE,
Settings.Secure.ACCESSIBILITY_FLOATING_MENU_TARGETS,
- Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL,
+ Settings.Secure.CHARGE_OPTIMIZATION_MODE
};
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 8faf917..6cb9d50 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -432,5 +432,6 @@
Secure.RESOLUTION_MODE_UNKNOWN, Secure.RESOLUTION_MODE_FULL));
VALIDATORS.put(Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL,
new InclusiveIntegerRangeValidator(0, 10));
+ VALIDATORS.put(Secure.CHARGE_OPTIMIZATION_MODE, new InclusiveIntegerRangeValidator(0, 10));
}
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index fa9b279..52e9b6d5 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -2745,6 +2745,9 @@
dumpSetting(s, p,
Settings.Secure.ZEN_SETTINGS_SUGGESTION_VIEWED,
SecureSettingsProto.Zen.SETTINGS_SUGGESTION_VIEWED);
+ dumpSetting(s, p,
+ Settings.Secure.CHARGE_OPTIMIZATION_MODE,
+ SecureSettingsProto.CHARGE_OPTIMIZATION_MODE);
p.end(zenToken);
// Please insert new settings using the same order as in SecureSettingsProto.
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index 68167e1..68bc96d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -167,7 +167,7 @@
private static final String STORAGE_MIGRATION_FLAG =
"core_experiments_team_internal/com.android.providers.settings.storage_test_mission_1";
private static final String STORAGE_MIGRATION_MARKER_FILE =
- "/metadata/aconfig/storage_test_mission_1";
+ "/metadata/aconfig_test_missions/mission_1";
/**
* This tag is applied to all aconfig default value-loaded flags.
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 892d907..e2af631 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -169,7 +169,6 @@
"androidx.compose.material_material-icons-extended",
"androidx.activity_activity-compose",
"androidx.compose.animation_animation-graphics",
- "androidx.test.rules",
],
libs: [
"keepanno-annotations",
@@ -192,6 +191,7 @@
lint: {
extra_check_modules: ["SystemUILintChecker"],
warning_checks: ["MissingApacheLicenseDetector"],
+ baseline_filename: "lint-baseline.xml",
},
}
@@ -426,6 +426,7 @@
kotlincflags: ["-Xjvm-default=all"],
optimize: {
shrink_resources: false,
+ optimized_shrink_resources: false,
proguard_flags_files: ["proguard.flags"],
},
@@ -515,6 +516,7 @@
optimize: true,
shrink: true,
shrink_resources: true,
+ optimized_shrink_resources: true,
ignore_warnings: false,
proguard_compatibility: false,
},
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 561c85e..5cc3caf 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -1036,6 +1036,7 @@
<receiver
android:name=".statusbar.KeyboardShortcutsReceiver"
+ android:visibleToInstantApps="true"
android:exported="true">
<intent-filter>
<action android:name="com.android.intent.action.DISMISS_KEYBOARD_SHORTCUTS" />
@@ -1116,5 +1117,11 @@
android:name="android.service.dream"
android:resource="@xml/home_controls_dream_metadata" />
</service>
+
+ <activity android:name="com.android.systemui.keyboard.shortcut.ShortcutHelperActivity"
+ android:exported="false"
+ android:theme="@style/ShortcutHelperTheme"
+ android:excludeFromRecents="true"
+ android:finishOnCloseSystemDialogs="true" />
</application>
</manifest>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml
index 978deaa..13f8c09 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="accessibility_menu_service_name" msgid="730136711554740131">"Kisegítő lehetőségek menüje"</string>
+ <string name="accessibility_menu_service_name" msgid="730136711554740131">"Kisegítő lehetőségek menü"</string>
<string name="accessibility_menu_intro" msgid="3164193281544042394">"A Kisegítő lehetőségek menüje az eszköz vezérlésére szolgáló nagyméretű, képernyőn megjelenő menü. Lezárhatja vele az eszközt, szabályozhatja a hang- és a fényerőt, képernyőképeket készíthet, és egyebekre is használhatja."</string>
<string name="assistant_label" msgid="6796392082252272356">"Segéd"</string>
<string name="assistant_utterance" msgid="65509599221141377">"Segéd"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml
index 0cc2f58..ff8b632 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Acessibilidade"</string>
+ <string name="accessibility_menu_service_name" msgid="730136711554740131">"menu Acessibilidade"</string>
<string name="accessibility_menu_intro" msgid="3164193281544042394">"O menu Acessibilidade disponibiliza um menu grande no ecrã para controlar o dispositivo. Pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de ecrã e muito mais."</string>
<string name="assistant_label" msgid="6796392082252272356">"Assistente"</string>
<string name="assistant_utterance" msgid="65509599221141377">"Assistente"</string>
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index 16bc7f2..fadef1e 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -497,7 +497,7 @@
}
flag {
- name: "screenshot_shelf_ui"
+ name: "screenshot_shelf_ui2"
namespace: "systemui"
description: "Use new shelf UI flow for screenshots"
bug: "329659738"
@@ -776,6 +776,13 @@
}
flag {
+ name: "keyboard_shortcut_helper_rewrite"
+ namespace: "systemui"
+ description: "A new implementation of the keyboards shortcuts helper sheet."
+ bug: "327364197"
+}
+
+flag {
name: "dream_overlay_bouncer_swipe_direction_filtering"
namespace: "systemui"
description: "do not initiate bouncer swipe when the direction is opposite of the expansion"
@@ -814,3 +821,10 @@
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "enforce_brightness_base_user_restriction"
+ namespace: "systemui"
+ description: "Enforce BaseUserRestriction for DISALLOW_CONFIG_BRIGHTNESS."
+ bug: "329205638"
+}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt
index 9ce30fd..1e60b98 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt
@@ -599,6 +599,12 @@
)
}
+ init {
+ // We do this check here to cover all entry points, including Launcher which doesn't
+ // call startIntentWithAnimation()
+ if (!controller.isLaunching) TransitionAnimator.checkReturnAnimationFrameworkFlag()
+ }
+
@UiThread
internal fun postTimeouts() {
if (timeoutHandler != null) {
@@ -637,7 +643,28 @@
return
}
- startAnimation(apps, nonApps, callback)
+ val window = findRootTaskIfPossible(apps)
+ if (window == null) {
+ Log.i(TAG, "Aborting the animation as no window is opening")
+ callback?.invoke()
+
+ if (DEBUG_TRANSITION_ANIMATION) {
+ Log.d(
+ TAG,
+ "Calling controller.onTransitionAnimationCancelled() [no window opening]"
+ )
+ }
+ controller.onTransitionAnimationCancelled()
+ listener?.onTransitionAnimationCancelled()
+ return
+ }
+
+ val navigationBar =
+ nonApps?.firstOrNull {
+ it.windowType == WindowManager.LayoutParams.TYPE_NAVIGATION_BAR
+ }
+
+ startAnimation(window, navigationBar, callback)
}
private fun findRootTaskIfPossible(
@@ -646,9 +673,17 @@
if (apps == null) {
return null
}
+
+ val targetMode =
+ if (controller.isLaunching) {
+ RemoteAnimationTarget.MODE_OPENING
+ } else {
+ RemoteAnimationTarget.MODE_CLOSING
+ }
var candidate: RemoteAnimationTarget? = null
+
for (it in apps) {
- if (it.mode == RemoteAnimationTarget.MODE_OPENING) {
+ if (it.mode == targetMode) {
if (activityTransitionUseLargestWindow()) {
if (
candidate == null ||
@@ -673,47 +708,31 @@
}
}
}
+
return candidate
}
private fun startAnimation(
- apps: Array<out RemoteAnimationTarget>?,
- nonApps: Array<out RemoteAnimationTarget>?,
+ window: RemoteAnimationTarget,
+ navigationBar: RemoteAnimationTarget?,
iCallback: IRemoteAnimationFinishedCallback?
) {
if (TransitionAnimator.DEBUG) {
Log.d(TAG, "Remote animation started")
}
- val window = findRootTaskIfPossible(apps)
- if (window == null) {
- Log.i(TAG, "Aborting the animation as no window is opening")
- iCallback?.invoke()
-
- if (DEBUG_TRANSITION_ANIMATION) {
- Log.d(
- TAG,
- "Calling controller.onTransitionAnimationCancelled() [no window opening]"
- )
- }
- controller.onTransitionAnimationCancelled()
- listener?.onTransitionAnimationCancelled()
- return
- }
-
- val navigationBar =
- nonApps?.firstOrNull {
- it.windowType == WindowManager.LayoutParams.TYPE_NAVIGATION_BAR
- }
-
val windowBounds = window.screenSpaceBounds
val endState =
- TransitionAnimator.State(
- top = windowBounds.top,
- bottom = windowBounds.bottom,
- left = windowBounds.left,
- right = windowBounds.right
- )
+ if (controller.isLaunching) {
+ TransitionAnimator.State(
+ top = windowBounds.top,
+ bottom = windowBounds.bottom,
+ left = windowBounds.left,
+ right = windowBounds.right
+ )
+ } else {
+ controller.createAnimatorState()
+ }
val windowBackgroundColor =
window.taskInfo?.let { callback.getBackgroundColor(it) } ?: window.backgroundColor
@@ -721,24 +740,29 @@
// instead of recomputing isExpandingFullyAbove here.
val isExpandingFullyAbove =
transitionAnimator.isExpandingFullyAbove(controller.transitionContainer, endState)
- val endRadius =
- if (isExpandingFullyAbove) {
- // Most of the time, expanding fully above the root view means expanding in full
- // screen.
- ScreenDecorationsUtils.getWindowCornerRadius(context)
- } else {
- // This usually means we are in split screen mode, so 2 out of 4 corners will
- // have
- // a radius of 0.
- 0f
- }
- endState.topCornerRadius = endRadius
- endState.bottomCornerRadius = endRadius
+ if (controller.isLaunching) {
+ val endRadius = getWindowRadius(isExpandingFullyAbove)
+ endState.topCornerRadius = endRadius
+ endState.bottomCornerRadius = endRadius
+ }
// We animate the opening window and delegate the view expansion to [this.controller].
val delegate = this.controller
val controller =
object : Controller by delegate {
+ override fun createAnimatorState(): TransitionAnimator.State {
+ if (isLaunching) return delegate.createAnimatorState()
+ val windowRadius = getWindowRadius(isExpandingFullyAbove)
+ return TransitionAnimator.State(
+ top = windowBounds.top,
+ bottom = windowBounds.bottom,
+ left = windowBounds.left,
+ right = windowBounds.right,
+ topCornerRadius = windowRadius,
+ bottomCornerRadius = windowRadius
+ )
+ }
+
override fun onTransitionAnimationStart(isExpandingFullyAbove: Boolean) {
listener?.onTransitionAnimationStart()
@@ -795,6 +819,18 @@
)
}
+ private fun getWindowRadius(isExpandingFullyAbove: Boolean): Float {
+ return if (isExpandingFullyAbove) {
+ // Most of the time, expanding fully above the root view means
+ // expanding in full screen.
+ ScreenDecorationsUtils.getWindowCornerRadius(context)
+ } else {
+ // This usually means we are in split screen mode, so 2 out of 4
+ // corners will have a radius of 0.
+ 0f
+ }
+ }
+
private fun applyStateToWindow(
window: RemoteAnimationTarget,
state: TransitionAnimator.State,
@@ -842,20 +878,41 @@
windowCropF.bottom.roundToInt()
)
+ val windowAnimationDelay =
+ if (controller.isLaunching) {
+ TIMINGS.contentAfterFadeInDelay
+ } else {
+ TIMINGS.contentBeforeFadeOutDelay
+ }
+ val windowAnimationDuration =
+ if (controller.isLaunching) {
+ TIMINGS.contentAfterFadeInDuration
+ } else {
+ TIMINGS.contentBeforeFadeOutDuration
+ }
+ val windowProgress =
+ TransitionAnimator.getProgress(
+ TIMINGS,
+ linearProgress,
+ windowAnimationDelay,
+ windowAnimationDuration
+ )
+
// The alpha of the opening window. If it opens above the expandable, then it should
// fade in progressively. Otherwise, it should be fully opaque and will be progressively
// revealed as the window background color layer above the window fades out.
val alpha =
if (controller.isBelowAnimatingWindow) {
- val windowProgress =
- TransitionAnimator.getProgress(
- TIMINGS,
- linearProgress,
- TIMINGS.contentAfterFadeInDelay,
- TIMINGS.contentAfterFadeInDuration
+ if (controller.isLaunching) {
+ INTERPOLATORS.contentAfterFadeInInterpolator.getInterpolation(
+ windowProgress
)
-
- INTERPOLATORS.contentAfterFadeInInterpolator.getInterpolation(windowProgress)
+ } else {
+ 1 -
+ INTERPOLATORS.contentBeforeFadeOutInterpolator.getInterpolation(
+ windowProgress
+ )
+ }
} else {
1f
}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt
index 9bf6b34..679c969 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt
@@ -59,6 +59,13 @@
1.0f
)
}
+
+ internal fun checkReturnAnimationFrameworkFlag() {
+ check(returnAnimationFrameworkLibrary()) {
+ "isLaunching cannot be false when the returnAnimationFrameworkLibrary flag is " +
+ "disabled"
+ }
+ }
}
private val transitionContainerLocation = IntArray(2)
@@ -558,10 +565,4 @@
}
}
}
-
- private fun checkReturnAnimationFrameworkFlag() {
- check(returnAnimationFrameworkLibrary()) {
- "isLaunching cannot be false when the returnAnimationFrameworkLibrary flag is disabled"
- }
- }
}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffect.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffect.kt
new file mode 100644
index 0000000..c08afd3
--- /dev/null
+++ b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffect.kt
@@ -0,0 +1,209 @@
+/*
+ * 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.surfaceeffects.gloweffect
+
+import android.animation.ValueAnimator
+import android.animation.ValueAnimator.INFINITE
+import android.graphics.RenderEffect
+import androidx.annotation.VisibleForTesting
+import com.android.systemui.surfaceeffects.RenderEffectDrawCallback
+import com.android.systemui.surfaceeffects.utils.MathUtils
+
+/** Renders rotating pie with glow on top, masked with a rounded box. */
+class GlowPieEffect(
+ config: GlowPieEffectConfig,
+ private val renderEffectDrawCallback: RenderEffectDrawCallback
+) {
+
+ private val glowPieShader = GlowPieShader().apply { applyConfig(config) }
+
+ @VisibleForTesting
+ val mainAnimator: ValueAnimator =
+ ValueAnimator.ofFloat(0f, 1f).apply {
+ // We want to loop the full cycle.
+ duration = DURATION_MS
+ repeatMode = ValueAnimator.RESTART
+ repeatCount = INFINITE
+ }
+
+ /** Plays glow pie until [finish] is called. */
+ fun play() {
+ if (mainAnimator.isRunning) return
+
+ baseGlow.resetProgress()
+ firstGlowPie.resetProgress()
+ secondGlowPie.resetProgress()
+
+ mainAnimator.addUpdateListener { updateListener ->
+ val time = updateListener.currentPlayTime.toFloat() % mainAnimator.duration
+
+ // Remap each glow pie progress.
+ baseGlow.updateProgress(time)
+ firstGlowPie.updateProgress(time)
+ secondGlowPie.updateProgress(time)
+
+ // TODO(b/335315940): Consider passing in 2D Matrix.
+ glowPieShader.setAngles(baseGlow.angle(), firstGlowPie.angle(), secondGlowPie.angle())
+ glowPieShader.setBottomAngleThresholds(
+ baseGlow.bottomThreshold(),
+ firstGlowPie.bottomThreshold(),
+ secondGlowPie.bottomThreshold()
+ )
+ glowPieShader.setTopAngleThresholds(
+ baseGlow.topThreshold(),
+ firstGlowPie.topThreshold(),
+ secondGlowPie.topThreshold()
+ )
+ glowPieShader.setAlphas(baseGlow.alpha(), firstGlowPie.alpha(), secondGlowPie.alpha())
+
+ // Finally trigger the draw callback.
+ renderEffectDrawCallback.onDraw(
+ RenderEffect.createRuntimeShaderEffect(
+ glowPieShader,
+ GlowPieShader.BACKGROUND_UNIFORM
+ )
+ )
+ }
+
+ mainAnimator.start()
+ }
+
+ fun finish() {
+ // TODO(b/335315940) Add alpha fade.
+ mainAnimator.cancel()
+ }
+
+ companion object {
+ @VisibleForTesting const val PI = Math.PI.toFloat()
+ @VisibleForTesting const val FEATHER = 0.3f
+ @VisibleForTesting const val DURATION_MS = 3000L
+
+ private val baseGlow = BaseGlow()
+ private val firstGlowPie = FirstGlowPie()
+ private val secondGlowPie = SecondGlowPie()
+ }
+
+ /** Contains animation parameters for each layer of glow pie. */
+ interface GlowPie {
+ /**
+ * The start & end timestamps of the animation. Must be smaller than or equal to the full
+ * [DURATION_MS].
+ */
+ val startMs: Float
+ val endMs: Float
+ /**
+ * Start & end angles in radian. This determines how many cycles you want to rotate. e.g.
+ * startAngle = 0f endAngle = 4f * PI, will give you the 2 cycles.
+ */
+ val startAngle: Float
+ val endAngle: Float
+ /**
+ * Start & end timestamps of the fade out duration. You may want to override [alpha] if you
+ * want to make it fade in. See [BaseGlow].
+ */
+ val alphaFadeStartMs: Float
+ val alphaFadeEndMs: Float
+
+ /** Below two values are expected to be updated through [updateProgress]. */
+ /** Normalized progress. */
+ var progress: Float
+ /** current time of the animation in ms. */
+ var time: Float
+
+ // Must be called before retrieving angle, bottom & top thresholds, and alpha.
+ // Otherwise the values would be stale.
+ fun updateProgress(time: Float) {
+ progress = MathUtils.constrainedMap(0f, 1f, startMs, endMs, time)
+ this.time = time
+ }
+
+ fun resetProgress() {
+ progress = 0f
+ time = 0f
+ }
+
+ fun angle(): Float {
+ // Negate the angle since we want clock-wise rotation.
+ val angle =
+ MathUtils.constrainedMap(startAngle, endAngle, 0f, 1f, progress) + progress * PI
+ return -angle
+ }
+
+ fun bottomThreshold(): Float {
+ return MathUtils.lerp(1f, -FEATHER, progress)
+ }
+
+ fun topThreshold(): Float {
+ return MathUtils.lerp(1f + FEATHER, 0f, progress)
+ }
+
+ // By default, it fades "out".
+ fun alpha(): Float {
+ // Remap timestamps (in MS) to alpha [0, 1].
+ return MathUtils.constrainedMap(1f, 0f, alphaFadeStartMs, alphaFadeEndMs, time)
+ }
+ }
+
+ data class BaseGlow(
+ override val startMs: Float = 0f,
+ override val endMs: Float = 0f,
+ override val startAngle: Float = 0f,
+ override val endAngle: Float = 0f,
+ override val alphaFadeStartMs: Float = 2250f,
+ override val alphaFadeEndMs: Float = 2950f,
+ ) : GlowPie {
+
+ override var progress: Float = 1f
+ override var time: Float = 0f
+ override fun updateProgress(time: Float) {}
+
+ override fun resetProgress() {}
+
+ override fun angle(): Float = 0f
+
+ override fun bottomThreshold(): Float = 0f
+
+ override fun topThreshold(): Float = 0f
+
+ // Base glow fade "in" (i.e. reveals).
+ override fun alpha(): Float {
+ return MathUtils.constrainedMap(0f, 1f, alphaFadeStartMs, alphaFadeEndMs, time)
+ }
+ }
+
+ data class FirstGlowPie(
+ override val startMs: Float = 250f,
+ override val endMs: Float = 2500f,
+ override val startAngle: Float = -PI / 2f,
+ override val endAngle: Float = 4f * PI,
+ override val alphaFadeStartMs: Float = 2500f,
+ override val alphaFadeEndMs: Float = 2750f,
+ override var progress: Float = 0f,
+ override var time: Float = 0f
+ ) : GlowPie
+
+ data class SecondGlowPie(
+ override val startMs: Float = 350f,
+ override val endMs: Float = 2600f,
+ override val startAngle: Float = -PI / 2f,
+ override val endAngle: Float = 3f * PI,
+ override val alphaFadeStartMs: Float = 2600f,
+ override val alphaFadeEndMs: Float = 2850f,
+ override var progress: Float = 0f,
+ override var time: Float = 0f
+ ) : GlowPie
+}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffectConfig.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffectConfig.kt
new file mode 100644
index 0000000..6c728c1
--- /dev/null
+++ b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffectConfig.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.surfaceeffects.gloweffect
+
+/** Parameter values needed to draw [GlowPieEffect]. */
+data class GlowPieEffectConfig(
+ /** Center x position of the effect. */
+ val centerX: Float,
+ /** Center y position of the effect. */
+ val centerY: Float,
+ /** Width of the rounded box mask. */
+ val width: Float,
+ /** Height of the rounded box mask. */
+ val height: Float,
+ /** Corner radius of the rounded box mask. */
+ val cornerRadius: Float,
+ /**
+ * Colors of the effect. The number must match 3, which is defined in [GlowPieShader.NUM_PIE].
+ * Each color corresponds to baseColor (bottom), firstLayerColor, and secondLayerColor (top).
+ */
+ val colors: IntArray
+)
diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieShader.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieShader.kt
new file mode 100644
index 0000000..2dbc0b5
--- /dev/null
+++ b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieShader.kt
@@ -0,0 +1,233 @@
+/*
+ * 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.surfaceeffects.gloweffect
+
+import android.graphics.RuntimeShader
+import android.util.Log
+import com.android.systemui.surfaceeffects.shaderutil.SdfShaderLibrary
+import com.android.systemui.surfaceeffects.shaderutil.ShaderUtilLibrary
+
+/** Draws two glowing pies rotating around the center of a rounded box on a base. */
+class GlowPieShader : RuntimeShader(GLOW_PIE_SHADER_COMP) {
+ // language=AGSL
+ companion object {
+ const val BACKGROUND_UNIFORM = "in_dst"
+ const val NUM_PIE = 3
+
+ private const val UNIFORMS =
+ """
+ uniform shader ${BACKGROUND_UNIFORM};
+ uniform vec2 in_center;
+ uniform vec2 in_size;
+ uniform half in_cornerRad;
+ uniform float[${NUM_PIE}] in_angles;
+ uniform float[${NUM_PIE}] in_alphas;
+ uniform float[${NUM_PIE}] in_bottomThresholds;
+ uniform float[${NUM_PIE}] in_topThresholds;
+ layout(color) uniform vec4 in_colors0;
+ layout(color) uniform vec4 in_colors1;
+ layout(color) uniform vec4 in_colors2;
+ """
+
+ private const val GLOW_PIE_MAIN =
+ """
+ vec4 main(vec2 p) {
+ vec4 pie = vec4(0.);
+ vec4 glow = vec4(0.);
+
+ vec2 c = p - in_center;
+ half box = sdRoundedBox(c, in_size, in_cornerRad);
+
+ // Base glow (drawn at the bottom)
+ pieGlow(
+ box,
+ c,
+ in_angles[0],
+ in_colors0.rgb,
+ /* pieAlpha= */ 1., // We always show the base color.
+ /* glowAlpha= */ in_alphas[0],
+ vec2(in_bottomThresholds[0], in_topThresholds[0]),
+ pie,
+ glow
+ );
+
+ // First pie
+ pieGlow(
+ box,
+ c,
+ in_angles[1],
+ in_colors1.rgb,
+ /* pieAlpha= */ in_alphas[1],
+ /* glowAlpha= */ in_alphas[1],
+ vec2(in_bottomThresholds[1], in_topThresholds[1]),
+ pie,
+ glow
+ );
+
+ // Second pie (drawn on top)
+ pieGlow(
+ box,
+ c,
+ in_angles[2],
+ in_colors2.rgb,
+ /* pieAlpha= */ in_alphas[2],
+ /* glowAlpha= */ in_alphas[2],
+ vec2(in_bottomThresholds[2], in_topThresholds[2]),
+ pie,
+ glow
+ );
+
+ return vec4(pie.rgb + glow.rgb * 0.3, pie.a);
+ }
+ """
+
+ private const val REMAP =
+ """
+ float remap(float in_start, float in_end, float out_start, float out_end, float x) {
+ x = (x - in_start) / (in_end - in_start);
+ x = clamp(x, 0., 1.);
+ return x * (out_end - out_start) + out_start;
+ }
+ """
+
+ /**
+ * This function draws a pie slice, an a glow on top. The glow also has the same pie shape
+ * but with more blur and additive blending.
+ */
+ private const val GLOW_PIE =
+ """
+ void pieGlow(
+ half box,
+ vec2 c,
+ half angle,
+ vec3 color,
+ half pieAlpha,
+ half glowAlpha,
+ vec2 angleThresholds,
+ inout vec4 inout_pie,
+ inout vec4 inout_glow) {
+
+ // Apply angular rotation.
+ half co = cos(angle), si = sin(angle);
+ mat2 rotM = mat2(co, -si, si, co); // 2D rotation matrix
+ c *= rotM;
+
+ // We rotate based on the cosine value, since we want to avoid using inverse
+ // trig function, which in this case is atan.
+
+ // Dot product with vec2(1., 0.) and bring the range to [0,1].
+ // Same as dot(normalize(c), vec2(1.,0) * 0.5 + 0.5
+ half d = normalize(c).x * 0.5 + 0.5;
+
+ // Those thresholds represents each end of the pie.
+ float bottomThreshold = angleThresholds[0];
+ float topThreshold = angleThresholds[1];
+ float angleMask = remap(bottomThreshold, topThreshold, 0., 1., d);
+
+ half boxMask = 1. - smoothstep(-0.02, 0.02, box);
+ vec4 pie = vec4(color, 1.0) * angleMask * boxMask * pieAlpha;
+
+ // We are drawing the same pie but with more blur.
+ half glowMask = 1. - smoothstep(0., 0.6, box);
+ // Glow outside only.
+ glowMask = min(glowMask, smoothstep(-0.02, 0.02, box));
+ // Apply some curve for the glow. (Can take out)
+ glowMask *= glowMask * glowMask;
+ // Glow mask should also be sliced with the angle mask.
+ glowMask *= angleMask;
+ vec4 glow = vec4(color, 1.0) * glowMask * glowAlpha;
+
+ inout_pie = pie + inout_pie * (1. - pie.a);
+ // Additive blending.
+ inout_glow += glow;
+ }
+ """
+
+ private const val GLOW_PIE_SHADER_COMP =
+ ShaderUtilLibrary.SHADER_LIB +
+ SdfShaderLibrary.SHADER_SDF_OPERATION_LIB +
+ SdfShaderLibrary.ROUNDED_BOX_SDF +
+ UNIFORMS +
+ REMAP +
+ GLOW_PIE +
+ GLOW_PIE_MAIN
+
+ private val TAG = GlowPieShader::class.java.simpleName
+ }
+
+ fun applyConfig(config: GlowPieEffectConfig) {
+ setCenter(config.centerX, config.centerY)
+ setSize(config.width, config.height)
+ setCornerRadius(config.cornerRadius)
+ setColor(config.colors)
+ }
+
+ fun setCenter(centerX: Float, centerY: Float) {
+ setFloatUniform("in_center", centerX, centerY)
+ }
+
+ fun setSize(width: Float, height: Float) {
+ setFloatUniform("in_size", width, height)
+ }
+
+ fun setCornerRadius(cornerRadius: Float) {
+ setFloatUniform("in_cornerRad", cornerRadius)
+ }
+
+ /** Ignores alpha value, as fade in/out is handled within shader. */
+ fun setColor(colors: IntArray) {
+ if (colors.size != NUM_PIE) {
+ Log.wtf(TAG, "The number of colors must be $NUM_PIE")
+ return
+ }
+ setColorUniform("in_colors0", colors[0])
+ setColorUniform("in_colors1", colors[1])
+ setColorUniform("in_colors2", colors[2])
+ }
+
+ fun setAngles(vararg angles: Float) {
+ if (angles.size != NUM_PIE) {
+ Log.wtf(TAG, "The number of angles must be $NUM_PIE")
+ return
+ }
+ setFloatUniform("in_angles", angles)
+ }
+
+ fun setAlphas(vararg alphas: Float) {
+ if (alphas.size != NUM_PIE) {
+ Log.wtf(TAG, "The number of angles must be $NUM_PIE")
+ return
+ }
+ setFloatUniform("in_alphas", alphas)
+ }
+
+ fun setBottomAngleThresholds(vararg bottomThresholds: Float) {
+ if (bottomThresholds.size != NUM_PIE) {
+ Log.wtf(TAG, "The number of bottomThresholds must be $NUM_PIE")
+ return
+ }
+ setFloatUniform("in_bottomThresholds", bottomThresholds)
+ }
+
+ fun setTopAngleThresholds(vararg topThresholds: Float) {
+ if (topThresholds.size != NUM_PIE) {
+ Log.wtf(TAG, "The number of topThresholds must be $NUM_PIE")
+ return
+ }
+ setFloatUniform("in_topThresholds", topThresholds)
+ }
+}
diff --git a/packages/SystemUI/checks/Android.bp b/packages/SystemUI/checks/Android.bp
index f65d797..1f502e3 100644
--- a/packages/SystemUI/checks/Android.bp
+++ b/packages/SystemUI/checks/Android.bp
@@ -40,6 +40,7 @@
data: [
":framework",
":androidx.annotation_annotation-nodeps",
+ ":kotlinx-coroutines-core",
],
static_libs: [
"SystemUILintChecker",
diff --git a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/FlowDetector.kt b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/FlowDetector.kt
new file mode 100644
index 0000000..5868200
--- /dev/null
+++ b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/FlowDetector.kt
@@ -0,0 +1,112 @@
+/*
+ * 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.internal.systemui.lint
+
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.intellij.psi.PsiClassType
+import com.intellij.psi.PsiMethod
+import com.intellij.psi.PsiParameter
+import org.jetbrains.kotlin.psi.psiUtil.isTopLevelKtOrJavaMember
+import org.jetbrains.uast.UCallExpression
+
+/** Detects bad usages of Kotlin Flows */
+class FlowDetector : Detector(), SourceCodeScanner {
+
+ override fun getApplicableMethodNames(): List<String> =
+ listOf(
+ FUN_MUTABLE_SHARED_FLOW,
+ FUN_SHARE_IN,
+ )
+
+ override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
+ if (
+ method.name == FUN_MUTABLE_SHARED_FLOW &&
+ method.parent.isTopLevelKtOrJavaMember() &&
+ context.evaluator.getPackage(method)?.qualifiedName == PACKAGE_FLOW
+ ) {
+ context.report(
+ issue = SHARED_FLOW_CREATION,
+ location = context.getNameLocation(node),
+ message =
+ "`MutableSharedFlow()` creates a new shared flow, which has poor performance " +
+ "characteristics"
+ )
+ }
+ if (
+ method.name == FUN_SHARE_IN &&
+ getTypeOfExtensionMethod(method)?.resolve()?.qualifiedName == CLASS_FLOW
+ ) {
+ context.report(
+ issue = SHARED_FLOW_CREATION,
+ location = context.getNameLocation(node),
+ message =
+ "`shareIn()` creates a new shared flow, which has poor performance " +
+ "characteristics"
+ )
+ }
+ }
+
+ companion object {
+ @JvmStatic
+ val SHARED_FLOW_CREATION =
+ Issue.create(
+ id = "SharedFlowCreation",
+ briefDescription = "Shared flow creation",
+ explanation =
+ """
+ Shared flows scale poorly with the number of collectors in use due to
+ their internal buffering mechanism and reliance on thread
+ synchronization. They can also cause memory leaks when used incorrectly.
+ If possible, use `StateFlow` instead.
+ """,
+ moreInfo = "http://go//sysui-shared-flow",
+ category = Category.PERFORMANCE,
+ priority = 8,
+ severity = Severity.ERROR,
+ implementation =
+ Implementation(
+ FlowDetector::class.java,
+ Scope.JAVA_FILE_SCOPE,
+ ),
+ )
+
+ fun getTypeOfExtensionMethod(method: PsiMethod): PsiClassType? {
+ // If this is an extension method whose return type matches receiver
+ val parameterList = method.parameterList
+ if (parameterList.parametersCount > 0) {
+ val firstParameter = parameterList.getParameter(0)
+ if (firstParameter is PsiParameter && firstParameter.name.startsWith("\$this\$")) {
+ return firstParameter.type as? PsiClassType
+ }
+ }
+ return null
+ }
+ }
+}
+
+private const val PACKAGE_FLOW = "kotlinx.coroutines.flow"
+private const val FUN_MUTABLE_SHARED_FLOW = "MutableSharedFlow"
+private const val FUN_SHARE_IN = "shareIn"
+private const val CLASS_FLOW = "$PACKAGE_FLOW.Flow"
diff --git a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/MissingApacheLicenseDetector.kt b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/MissingApacheLicenseDetector.kt
index 46125be..a162897 100644
--- a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/MissingApacheLicenseDetector.kt
+++ b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/MissingApacheLicenseDetector.kt
@@ -25,7 +25,6 @@
import com.android.tools.lint.detector.api.JavaContext
import com.android.tools.lint.detector.api.Location
import com.android.tools.lint.detector.api.Scope
-import com.android.tools.lint.detector.api.Severity
import com.android.tools.lint.detector.api.SourceCodeScanner
import java.time.Year
import org.jetbrains.uast.UComment
@@ -117,8 +116,13 @@
attached at the beginning.""",
category = Category.COMPLIANCE,
priority = 8,
- // ignored by default and then explicitly overridden in SysUI's soong configuration
- severity = Severity.IGNORE,
+ // This check is disabled by default so that it is not accidentally used by internal
+ // modules that have different silencing. This check can be enabled in Soong using
+ // the following configuration:
+ // lint: {
+ // warning_checks: ["MissingApacheLicenseDetector"],
+ // }
+ enabledByDefault = false,
implementation =
Implementation(MissingApacheLicenseDetector::class.java, Scope.JAVA_FILE_SCOPE),
)
diff --git a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/SystemUIIssueRegistry.kt b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/SystemUIIssueRegistry.kt
index e09aa42..e93264c 100644
--- a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/SystemUIIssueRegistry.kt
+++ b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/SystemUIIssueRegistry.kt
@@ -33,6 +33,7 @@
BroadcastSentViaContextDetector.ISSUE,
CleanArchitectureDependencyViolationDetector.ISSUE,
DumpableNotRegisteredDetector.ISSUE,
+ FlowDetector.SHARED_FLOW_CREATION,
SlowUserQueryDetector.ISSUE_SLOW_USER_ID_QUERY,
SlowUserQueryDetector.ISSUE_SLOW_USER_INFO_QUERY,
NonInjectedMainThreadDetector.ISSUE,
diff --git a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/AndroidStubs.kt b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/AndroidStubs.kt
index f3b24a3..edfd59a 100644
--- a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/AndroidStubs.kt
+++ b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/AndroidStubs.kt
@@ -19,12 +19,16 @@
import com.android.tools.lint.checks.infrastructure.TestFiles.LibraryReferenceTestFile
import java.io.File
+internal val libraryNames =
+ arrayOf(
+ "framework.jar",
+ "androidx.annotation_annotation-nodeps.jar",
+ "kotlinx-coroutines-core.jar",
+ )
+
/*
* This file contains stubs of framework APIs and System UI classes for testing purposes only. The
* stubs are not used in the lint detectors themselves.
*/
internal val androidStubs =
- arrayOf(
- LibraryReferenceTestFile(File("framework.jar").canonicalFile),
- LibraryReferenceTestFile(File("androidx.annotation_annotation-nodeps.jar").canonicalFile),
- )
+ libraryNames.map { LibraryReferenceTestFile(File(it).canonicalFile) }.toTypedArray()
diff --git a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/FlowDetectorTest.kt b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/FlowDetectorTest.kt
new file mode 100644
index 0000000..4944529
--- /dev/null
+++ b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/FlowDetectorTest.kt
@@ -0,0 +1,219 @@
+/*
+ * 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.internal.systemui.lint
+
+import com.android.tools.lint.checks.infrastructure.TestFiles
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+
+class FlowDetectorTest : SystemUILintDetectorTest() {
+ override fun getDetector(): Detector = FlowDetector()
+
+ override fun getIssues(): List<Issue> = listOf(FlowDetector.SHARED_FLOW_CREATION)
+
+ @Test
+ fun createSharedFlow_viaCallToMutableSharedFlow() {
+ lint()
+ .files(
+ TestFiles.kotlin(
+ """
+ package test.pkg
+
+ import kotlinx.coroutines.flow.MutableSharedFlow
+
+ suspend fun doSomething() {
+ val sharedFlow = MutableSharedFlow<Int>(replay = 2)
+ }
+ """
+ .trimIndent()
+ ),
+ *androidStubs
+ )
+ .issues(FlowDetector.SHARED_FLOW_CREATION)
+ .run()
+ .expect(
+ """
+src/test/pkg/test.kt:6: Error: MutableSharedFlow() creates a new shared flow, which has poor performance characteristics [SharedFlowCreation]
+ val sharedFlow = MutableSharedFlow<Int>(replay = 2)
+ ~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """,
+ )
+ }
+
+ @Test
+ fun createSharedFlow_viaCallToShareIn_onFlow() {
+ lint()
+ .files(
+ TestFiles.kotlin(
+ """
+ package test.pkg
+
+ import kotlinx.coroutines.CoroutineScope
+ import kotlinx.coroutines.flow.Flow
+ import kotlinx.coroutines.flow.SharingStarted
+ import kotlinx.coroutines.flow.shareIn
+
+ suspend fun doSomething(scope: CoroutineScope, someFlow: Flow<Int>) {
+ someFlow.shareIn(scope, SharingStarted.Eagerly)
+ }
+ """
+ .trimIndent()
+ ),
+ *androidStubs
+ )
+ .issues(FlowDetector.SHARED_FLOW_CREATION)
+ .run()
+ .expect(
+ """
+src/test/pkg/test.kt:9: Error: shareIn() creates a new shared flow, which has poor performance characteristics [SharedFlowCreation]
+ someFlow.shareIn(scope, SharingStarted.Eagerly)
+ ~~~~~~~
+1 errors, 0 warnings
+ """,
+ )
+ }
+
+ @Test
+ fun createSharedFlow_viaCallToShareIn_afterOperationChain() {
+ lint()
+ .files(
+ TestFiles.kotlin(
+ """
+ package test.pkg
+
+ import kotlinx.coroutines.CoroutineScope
+ import kotlinx.coroutines.flow.Flow
+ import kotlinx.coroutines.flow.SharingStarted
+ import kotlinx.coroutines.flow.shareIn
+ import kotlinx.coroutines.flow.onStart
+ import kotlinx.coroutines.flow.map
+ import kotlinx.coroutines.flow.distinctUntilChanged
+
+ suspend fun doSomething(scope: CoroutineScope, someFlow: Flow<Int>) {
+ someFlow.onStart { emit(PackageChangeModel.Empty) }
+ .map { reloadComponents(userId, packageManager) }
+ .distinctUntilChanged()
+ .shareIn(scope, SharingStarted.WhileSubscribed(), replay = 1)
+ }
+ """
+ .trimIndent()
+ ),
+ *androidStubs
+ )
+ .issues(FlowDetector.SHARED_FLOW_CREATION)
+ .run()
+ .expect(
+ """
+src/test/pkg/test.kt:15: Error: shareIn() creates a new shared flow, which has poor performance characteristics [SharedFlowCreation]
+ .shareIn(scope, SharingStarted.WhileSubscribed(), replay = 1)
+ ~~~~~~~
+1 errors, 0 warnings
+ """,
+ )
+ }
+
+ @Test
+ fun createSharedFlow_viaCallToShareIn_onStateFlow() {
+ lint()
+ .files(
+ TestFiles.kotlin(
+ """
+ package test.pkg
+
+ import kotlinx.coroutines.CoroutineScope
+ import kotlinx.coroutines.flow.Flow
+ import kotlinx.coroutines.flow.StateFlow
+ import kotlinx.coroutines.flow.SharingStarted
+ import kotlinx.coroutines.flow.shareIn
+ import kotlinx.coroutines.flow.onStart
+ import kotlinx.coroutines.flow.map
+ import kotlinx.coroutines.flow.distinctUntilChanged
+
+ suspend fun doSomething(someScope: CoroutineScope, someFlow: StateFlow<Int>) {
+ someFlow.onStart { emit(1) }
+ .map { someOtherFunction() }
+ .distinctUntilChanged()
+ .shareIn(someScope, SharingStarted.WhileSubscribed())
+ someFlow.shareIn(someScope, SharingStarted.Eagerly)
+ }
+ """
+ .trimIndent()
+ ),
+ *androidStubs
+ )
+ .issues(FlowDetector.SHARED_FLOW_CREATION)
+ .run()
+ .expect(
+ """
+src/test/pkg/test.kt:16: Error: shareIn() creates a new shared flow, which has poor performance characteristics [SharedFlowCreation]
+ .shareIn(someScope, SharingStarted.WhileSubscribed())
+ ~~~~~~~
+src/test/pkg/test.kt:17: Error: shareIn() creates a new shared flow, which has poor performance characteristics [SharedFlowCreation]
+ someFlow.shareIn(someScope, SharingStarted.Eagerly)
+ ~~~~~~~
+2 errors, 0 warnings
+ """,
+ )
+ }
+
+ @Test
+ fun createSharedFlow_viaCallToShareIn_onSharedFlow() {
+ lint()
+ .files(
+ TestFiles.kotlin(
+ """
+ package test.pkg
+
+ import kotlinx.coroutines.CoroutineScope
+ import kotlinx.coroutines.flow.Flow
+ import kotlinx.coroutines.flow.SharedFlow
+ import kotlinx.coroutines.flow.SharingStarted
+ import kotlinx.coroutines.flow.shareIn
+ import kotlinx.coroutines.flow.onStart
+ import kotlinx.coroutines.flow.map
+ import kotlinx.coroutines.flow.distinctUntilChanged
+
+ suspend fun doSomething(someScope: CoroutineScope, someFlow: SharedFlow<Int>) {
+ someFlow.onStart { emit(1) }
+ .map { someOtherFunction() }
+ .distinctUntilChanged()
+ .shareIn(someScope, SharingStarted.WhileSubscribed())
+ someFlow.shareIn(someScope, SharingStarted.Eagerly)
+ }
+ """
+ .trimIndent()
+ ),
+ *androidStubs
+ )
+ .issues(FlowDetector.SHARED_FLOW_CREATION)
+ .run()
+ .expect(
+ """
+src/test/pkg/test.kt:16: Error: shareIn() creates a new shared flow, which has poor performance characteristics [SharedFlowCreation]
+ .shareIn(someScope, SharingStarted.WhileSubscribed())
+ ~~~~~~~
+src/test/pkg/test.kt:17: Error: shareIn() creates a new shared flow, which has poor performance characteristics [SharedFlowCreation]
+ someFlow.shareIn(someScope, SharingStarted.Eagerly)
+ ~~~~~~~
+2 errors, 0 warnings
+ """,
+ )
+ }
+}
diff --git a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/MissingApacheLicenseDetectorTest.kt b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/MissingApacheLicenseDetectorTest.kt
index 78e133f..80d9291 100644
--- a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/MissingApacheLicenseDetectorTest.kt
+++ b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/MissingApacheLicenseDetectorTest.kt
@@ -87,6 +87,31 @@
.skipTestModes(TestMode.SUPPRESSIBLE)
.issues(MissingApacheLicenseDetector.ISSUE)
.run()
- .expectContains("License header is missing")
+ .expect(
+ """
+ src/test/pkg/name/MyTest.kt:2: Warning: License header is missing
+ Please add the following copyright and license header to the beginning of the file:
+
+ /*
+ * Copyright (C) ${Year.now().value} The Android Open 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.
+ */ [MissingApacheLicenseDetector]
+
+ ^
+ 0 errors, 1 warnings
+ """
+ .trimIndent()
+ )
}
}
diff --git a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/SystemUILintDetectorTest.kt b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/SystemUILintDetectorTest.kt
index 29b3828..b7987f7 100644
--- a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/SystemUILintDetectorTest.kt
+++ b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/SystemUILintDetectorTest.kt
@@ -14,10 +14,7 @@
abstract class SystemUILintDetectorTest : LintDetectorTest() {
companion object {
- @ClassRule
- @JvmField
- val libraryChecker: LibraryExists =
- LibraryExists("framework.jar", "androidx.annotation_annotation-nodeps.jar")
+ @ClassRule @JvmField val libraryChecker: LibraryExists = LibraryExists(*libraryNames)
}
class LibraryExists(vararg val libraryNames: String) : TestRule {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/modifier/BurnInModifiers.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/modifier/BurnInModifiers.kt
index 238a230..c109e51 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/modifier/BurnInModifiers.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/modifier/BurnInModifiers.kt
@@ -61,11 +61,10 @@
val scale =
when {
scaleViewModel.scaleClockOnly && isClock -> scaleViewModel.scale
- !scaleViewModel.scaleClockOnly -> scaleViewModel.scale
else -> 1f
}
- this.translationX = translationX
+ this.translationX = if (isClock) 0F else translationX
this.translationY = translationY
this.alpha = alpha
this.scaleX = scale
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt
index 7095875..09ec76d 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt
@@ -88,7 +88,7 @@
}
@Composable
- fun SceneScope.LargeClock(modifier: Modifier = Modifier) {
+ fun SceneScope.LargeClock(burnInParams: BurnInParameters, modifier: Modifier = Modifier) {
val currentClock by viewModel.currentClock.collectAsState()
if (currentClock?.largeClock?.view == null) {
return
@@ -129,7 +129,13 @@
update = {
it.ensureClockViewExists(checkNotNull(currentClock).largeClock.view)
},
- modifier = Modifier.fillMaxSize()
+ modifier =
+ Modifier.fillMaxSize()
+ .burnInAware(
+ viewModel = aodBurnInViewModel,
+ params = burnInParams,
+ isClock = true
+ )
)
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt
index 0934b20..e0540bf 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt
@@ -149,6 +149,7 @@
}
with(clockSection) {
LargeClock(
+ burnInParams = burnIn.parameters,
modifier =
Modifier.fillMaxSize().thenIf(shouldOffSetClockToOneHalf) {
// If we do not have a custom position animation, we want
@@ -179,7 +180,12 @@
Column(modifier = modifier) {
val currentClock = currentClockState.value ?: return@Column
- with(weatherClockSection) { Time(clock = currentClock, modifier = Modifier) }
+ with(weatherClockSection) {
+ Time(
+ clock = currentClock,
+ burnInParams = burnIn.parameters,
+ )
+ }
val density = LocalDensity.current
val context = LocalContext.current
@@ -193,7 +199,12 @@
)
)
}
- with(weatherClockSection) { LargeClockSectionBelowSmartspace(clock = currentClock) }
+ with(weatherClockSection) {
+ LargeClockSectionBelowSmartspace(
+ burnInParams = burnIn.parameters,
+ clock = currentClock,
+ )
+ }
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/WeatherClockSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/WeatherClockSection.kt
index a7bb308ad..9a82da2 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/WeatherClockSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/WeatherClockSection.kt
@@ -35,7 +35,9 @@
import com.android.compose.modifiers.padding
import com.android.systemui.customization.R as customizationR
import com.android.systemui.keyguard.ui.composable.blueprint.WeatherClockElementKeys
+import com.android.systemui.keyguard.ui.composable.modifier.burnInAware
import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel
+import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters
import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
import com.android.systemui.plugins.clocks.ClockController
import javax.inject.Inject
@@ -50,19 +52,19 @@
@Composable
fun SceneScope.Time(
clock: ClockController,
- modifier: Modifier = Modifier,
+ burnInParams: BurnInParameters,
) {
Row(
modifier =
Modifier.padding(
- horizontal = dimensionResource(customizationR.dimen.clock_padding_start)
- )
+ horizontal = dimensionResource(customizationR.dimen.clock_padding_start)
+ )
+ .burnInAware(aodBurnInViewModel, burnInParams, isClock = true)
) {
WeatherElement(
weatherClockElementViewId = customizationR.id.weather_clock_time,
clock = clock,
elementKey = WeatherClockElementKeys.timeElementKey,
- modifier = modifier,
)
}
}
@@ -124,7 +126,7 @@
weatherClockElementViewId: Int,
clock: ClockController,
elementKey: ElementKey,
- modifier: Modifier
+ modifier: Modifier = Modifier,
) {
MovableElement(key = elementKey, modifier) {
content {
@@ -150,6 +152,7 @@
@Composable
fun SceneScope.LargeClockSectionBelowSmartspace(
+ burnInParams: BurnInParameters,
clock: ClockController,
) {
Row(
@@ -158,6 +161,7 @@
.padding(
horizontal = dimensionResource(customizationR.dimen.clock_padding_start)
)
+ .burnInAware(aodBurnInViewModel, burnInParams, isClock = true)
) {
Date(clock = clock, modifier = Modifier.wrapContentSize())
Box(
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
index 32cebd1..a595c66 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
@@ -682,6 +682,17 @@
}
if (isBouncing) {
bouncingScene = targetScene
+
+ // Immediately stop this transition if we are bouncing on a
+ // scene that does not bounce.
+ val overscrollSpec = currentOverscrollSpec
+ if (
+ overscrollSpec != null &&
+ overscrollSpec.transformationSpec.transformations
+ .isEmpty()
+ ) {
+ snapToScene(targetScene)
+ }
}
}
}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt
index f1f1b57..f539a23 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt
@@ -97,6 +97,8 @@
@VisibleForTesting var textAnimatorFactory: (Layout, () -> Unit) -> TextAnimator =
{ layout, invalidateCb ->
TextAnimator(layout, NUM_CLOCK_FONT_ANIMATION_STEPS, invalidateCb) }
+
+ // Used by screenshot tests to provide stability
@VisibleForTesting var isAnimationEnabled: Boolean = true
@VisibleForTesting var timeOverrideInMillis: Long? = null
@@ -242,15 +244,8 @@
}
logger.d({ "onDraw($str1)"}) { str1 = text.toString() }
- // Use textAnimator to render text if animation is enabled.
- // Otherwise default to using standard draw functions.
- if (isAnimationEnabled) {
- // intentionally doesn't call super.onDraw here or else the text will be rendered twice
- textAnimator?.draw(canvas)
- } else {
- super.onDraw(canvas)
- }
-
+ // intentionally doesn't call super.onDraw here or else the text will be rendered twice
+ textAnimator?.draw(canvas)
canvas.restore()
}
@@ -318,7 +313,7 @@
weight = lockScreenWeight,
textSize = -1f,
color = lockScreenColor,
- animate = isAnimationEnabled,
+ animate = true,
duration = APPEAR_ANIM_DURATION,
interpolator = Interpolators.EMPHASIZED_DECELERATE,
delay = 0,
@@ -327,7 +322,7 @@
}
fun animateFoldAppear(animate: Boolean = true) {
- if (isAnimationEnabled && textAnimator == null) {
+ if (textAnimator == null) {
return
}
logger.d("animateFoldAppear")
@@ -344,7 +339,7 @@
weight = dozingWeightInternal,
textSize = -1f,
color = dozingColor,
- animate = animate && isAnimationEnabled,
+ animate = animate,
interpolator = Interpolators.EMPHASIZED_DECELERATE,
duration = ANIMATION_DURATION_FOLD_TO_AOD.toLong(),
delay = 0,
@@ -363,7 +358,7 @@
weight = if (isDozing()) dozingWeight else lockScreenWeight,
textSize = -1f,
color = null,
- animate = isAnimationEnabled,
+ animate = true,
duration = CHARGE_ANIM_DURATION_PHASE_1,
delay = 0,
onAnimationEnd = null
@@ -373,7 +368,7 @@
weight = if (isDozing()) lockScreenWeight else dozingWeight,
textSize = -1f,
color = null,
- animate = isAnimationEnabled,
+ animate = true,
duration = CHARGE_ANIM_DURATION_PHASE_0,
delay = chargeAnimationDelay.toLong(),
onAnimationEnd = startAnimPhase2
@@ -386,7 +381,7 @@
weight = if (isDozing) dozingWeight else lockScreenWeight,
textSize = -1f,
color = if (isDozing) dozingColor else lockScreenColor,
- animate = animate && isAnimationEnabled,
+ animate = animate,
duration = DOZE_ANIM_DURATION,
delay = 0,
onAnimationEnd = null
@@ -445,9 +440,6 @@
onAnimationEnd = onAnimationEnd
)
textAnimator?.glyphFilter = glyphFilter
- if (color != null && !isAnimationEnabled) {
- setTextColor(color)
- }
} else {
// when the text animator is set, update its start values
onTextAnimatorInitialized = Runnable {
@@ -462,9 +454,6 @@
onAnimationEnd = onAnimationEnd
)
textAnimator?.glyphFilter = glyphFilter
- if (color != null && !isAnimationEnabled) {
- setTextColor(color)
- }
}
}
}
@@ -482,7 +471,7 @@
weight = weight,
textSize = textSize,
color = color,
- animate = animate && isAnimationEnabled,
+ animate = animate,
interpolator = null,
duration = duration,
delay = delay,
diff --git a/packages/SystemUI/lint-baseline.xml b/packages/SystemUI/lint-baseline.xml
new file mode 100644
index 0000000..4def93f
--- /dev/null
+++ b/packages/SystemUI/lint-baseline.xml
@@ -0,0 +1,32215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.4.0-alpha08" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha08">
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mSettingsObserver = new SettingsObserver(context.getMainThreadHandler());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java"
+ line="142"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainExecutor().execute(() -> {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="845"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java"
+ line="208"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java"
+ line="515"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" return context.getMainExecutor();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java"
+ line="94"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainExecutor().execute(() -> {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1088"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainExecutor().execute(() -> {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1132"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainExecutor().execute(() -> {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1191"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainExecutor().execute(() -> {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1230"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainExecutor().execute(() -> {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="3115"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" context.getMainThreadHandler(), this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java"
+ line="191"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java"
+ line="807"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainExecutor().execute(() ->"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java"
+ line="575"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java"
+ line="918"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="188"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" new Handler(mContext.getMainLooper())) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java"
+ line="63"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java"
+ line="256"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mSessionFuture.addListener(this::onStartComplete, mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ScrollCaptureController.java"
+ line="182"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" }, mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ScrollCaptureController.java"
+ line="354"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java"
+ line="230"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" wifiManager.registerTrafficStateCallback(context.getMainExecutor(),"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java"
+ line="73"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" context.getMainThreadHandler(), this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java"
+ line="156"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" mContext.getMainThreadHandler()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java"
+ line="159"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" context.mainExecutor.execute { unoccludeAnimator?.cancel() }"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerOcclusionManager.kt"
+ line="245"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="MissingSuperCall"
+ message="Overriding method should call `super.onBackPressed`"
+ errorLine1=" override fun onBackPressed() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt"
+ line="143"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="MissingSuperCall"
+ message="Overriding method should call `super.onBackPressed`"
+ errorLine1=" override fun onBackPressed() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt"
+ line="133"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="MissingSuperCall"
+ message="Overriding method should call `super.onBackPressed`"
+ errorLine1=" override fun onBackPressed() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt"
+ line="118"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="MissingSuperCall"
+ message="Overriding method should call `super.onBackPressed`"
+ errorLine1=" override fun onBackPressed() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt"
+ line="126"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="MissingSuperCall"
+ message="Overriding method should call `super.onDetachedFromWindow`"
+ errorLine1=" public void onDetachedFromWindow() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/ImmersiveModeConfirmation.java"
+ line="474"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="MissingSuperCall"
+ message="Overriding method should call `super.onDetachedFromWindow`"
+ errorLine1=" public void onDetachedFromWindow() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java"
+ line="381"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="MissingSuperCall"
+ message="Overriding method should call `super.onBind`"
+ errorLine1=" override fun onBind(intent: Intent): IBinder? {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt"
+ line="74"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="WrongViewCast"
+ message="Unexpected implicit cast to `NotificationExpandButton`: layout tag was `ImageView`"
+ errorLine1=" mExpandButton = mView.findViewById(com.android.internal.R.id.expand_button);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java"
+ line="145"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="WrongViewCast"
+ message="Unexpected implicit cast to `NotificationActionListLayout`: layout tag was `LinearLayout`"
+ errorLine1=" mActions = mView.findViewById(com.android.internal.R.id.actions);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java"
+ line="180"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.volume.panel.ui.VolumePanelUiEvent"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartable.kt"
+ line="23"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The shared layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.statusbar.pipeline.satellite.ui.DeviceBasedSatelliteBindableIcon"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/icons/shared/BindableIconsRegistry.kt"
+ line="21"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.volume.panel.ui.VolumePanelUiEvent"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/panel/component/captioning/domain/CaptioningAvailabilityCriteria.kt"
+ line="23"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.media.controls.domain.pipeline.MediaDataManager"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalMediaRepository.kt"
+ line="24"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt"
+ line="23"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthModule.kt"
+ line="24"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.deviceentry.domain.interactor.SystemUIDeviceEntryFaceAuthInteractor"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthModule.kt"
+ line="25"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.deviceentry.ui.binder.LiftToRunFaceAuthBinder"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthModule.kt"
+ line="26"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt"
+ line="26"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt"
+ line="27"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt"
+ line="50"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt"
+ line="51"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.power.domain.interactor.PowerInteractor"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt"
+ line="59"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.qs.footer.data.model.UserSwitcherStatusModel"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt"
+ line="34"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.controls.ui.ControlsActivity"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt"
+ line="34"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.controls.ui.ControlsUiController"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt"
+ line="35"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.keyguard.domain.interactor.InWindowLauncherUnlockAnimationInteractor"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/InWindowLauncherUnlockAnimationRepository.kt"
+ line="20"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractor.kt"
+ line="40"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.keyguard.data.repository.KeyguardBlueprintRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/KeyguardBlueprintCommandListener.kt"
+ line="20"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.keyguard.ui.view.layout.blueprints.DefaultKeyguardBlueprint"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt"
+ line="30"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.keyguard.ui.view.layout.blueprints.SplitShadeKeyguardBlueprint"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt"
+ line="31"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Config"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt"
+ line="32"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Type"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt"
+ line="33"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.keyguard.ui.view.layout.blueprints.DefaultKeyguardBlueprint.Companion.DEFAULT"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepository.kt"
+ line="25"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.keyguard.ui.view.layout.blueprints.KeyguardBlueprintModule"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepository.kt"
+ line="26"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Config"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepository.kt"
+ line="27"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the domain layer."
+ errorLine1="import com.android.systemui.bouncer.domain.interactor.BouncerMessageAuditLogger"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt"
+ line="24"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The data layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.keyguard.ui.binder.SideFpsProgressBarViewBinder"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt"
+ line="25"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt"
+ line="26"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.media.controls.ui.view.MediaViewHolder"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt"
+ line="81"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.user.data.source.UserRecord"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt"
+ line="24"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.media.controls.ui.view.MediaViewHolder"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt"
+ line="84"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.statusbar.pipeline.satellite.ui.model.SatelliteIconModel"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt"
+ line="36"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.people.data.model.PeopleTileModel"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/ui/viewmodel/PeopleViewModel.kt"
+ line="29"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.people.data.repository.PeopleTileRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/ui/viewmodel/PeopleViewModel.kt"
+ line="30"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.people.data.repository.PeopleWidgetRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/ui/viewmodel/PeopleViewModel.kt"
+ line="31"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.systemui.bouncer.ui.BouncerView"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt"
+ line="38"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The shared layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.qs.pipeline.data.model.RestoreData"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt"
+ line="24"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The shared layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.qs.pipeline.data.repository.UserTileSpecRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt"
+ line="25"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.keyboard.data.repository.KeyboardRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModel.kt"
+ line="20"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.keyboard.stickykeys.data.repository.StickyKeysRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModel.kt"
+ line="21"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The shared layer may not depend on the data layer."
+ errorLine1="import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/model/WifiNetworkModel.kt"
+ line="25"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="class ActionReceiver("
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/broadcast/ActionReceiver.kt"
+ line="50"
+ column="7"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class GroupCoalescer implements Dumpable, PipelineDumpable {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescer.java"
+ line="70"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class KeyguardIndicationRotateTextViewController extends"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java"
+ line="62"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class LightBarTransitionsController implements Dumpable {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java"
+ line="48"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class LockIconView extends FrameLayout implements Dumpable {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/LockIconView.java"
+ line="47"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class NotificationBackgroundView extends View implements Dumpable {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java"
+ line="47"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class NotificationStackScrollLayout"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java"
+ line="151"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="class PendingRemovalStore @Inject constructor("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/broadcast/PendingRemovalStore.kt"
+ line="19"
+ column="7"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class QSContainerImpl extends FrameLayout implements Dumpable {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java"
+ line="47"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="class QSTileViewModelAdapter"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt"
+ line="47"
+ column="7"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="class QSTileViewModelImpl<DATA_TYPE>("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt"
+ line="72"
+ column="7"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="class RoundedCornerResDelegateImpl("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerResDelegate.kt"
+ line="48"
+ column="7"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="class StatusBarModePerDisplayRepositoryImpl"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt"
+ line="108"
+ column="7"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public final class StatusBarTouchableRegionManager implements Dumpable {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java"
+ line="61"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class SwipeHelper implements Gefingerpoken, Dumpable {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SwipeHelper.java"
+ line="64"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class SysUiState implements Dumpable {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/model/SysUiState.java"
+ line="38"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="class TableLogBuffer("
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt"
+ line="78"
+ column="7"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="open class UserBroadcastDispatcher("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt"
+ line="48"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="DumpableNotRegistered"
+ message="Any class implementing `Dumpable` must call `DumpManager.registerNormalDumpable` or `DumpManager.registerCriticalDumpable`"
+ errorLine1="public class ViewState implements Dumpable {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java"
+ line="47"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `com.android.systemui.multishade.ui.view.MultiShadeView`, was not found in the project or the libraries"
+ errorLine1="<com.android.systemui.multishade.ui.view.MultiShadeView"
+ errorLine2="^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/multi_shade.xml"
+ line="19"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `com.android.systemui.biometrics.UdfpsEnrollView`, was not found in the project or the libraries"
+ errorLine1="<com.android.systemui.biometrics.UdfpsEnrollView"
+ errorLine2="^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/udfps_enroll_view.xml"
+ line="17"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityController.java"
+ line="47"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java"
+ line="166"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWm = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java"
+ line="52"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java"
+ line="409"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(StatusBarManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java"
+ line="459"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(StatusBarManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java"
+ line="475"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final StatusBarManager statusBarManager = mContext.getSystemService(StatusBarManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java"
+ line="485"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java"
+ line="343"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mSensorPrivacyManager = context.getSystemService(SensorPrivacyManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="808"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAccessibilityManager = context.getSystemService(AccessibilityManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java"
+ line="68"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val jobScheduler = context.getSystemService(JobScheduler::class.java)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt"
+ line="183"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = context.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/BiometricPromptLayout.java"
+ line="67"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val accessibilityManager = view.context.getSystemService(AccessibilityManager::class.java)!!"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt"
+ line="91"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val windowManager = requireNotNull(view.context.getSystemService(WindowManager::class.java))"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt"
+ line="76"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" requireNotNull(view.context.getSystemService(AccessibilityManager::class.java))"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt"
+ line="78"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="114"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return applicationContext.getSystemService(Context.EUICC_SERVICE) as EuiccManager?"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorModule.kt"
+ line="54"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val manager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt"
+ line="167"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mMediaRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java"
+ line="74"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(Context.MEDIA_PROJECTION_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java"
+ line="77"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mUiModeManager = mContext.getSystemService(UiModeManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="856"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="864"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="875"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="879"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="885"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(Context.NOTIFICATION_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="2913"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" it.context.getSystemService(InputMethodManager::class.java)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt"
+ line="80"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" InputManager inputManager = mContext.getSystemService(InputManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java"
+ line="520"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayWindow.java"
+ line="66"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mClipboardManager = context.getSystemService(ClipboardManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/ClipboardView.java"
+ line="37"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val am = context.getSystemService(ActivityManager::class.java)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestReceiver.kt"
+ line="48"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(AccessibilityManager::class.java)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt"
+ line="26"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val imeManager = view.context.getSystemService(InputMethodManager::class.java)!!"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt"
+ line="36"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" .getSystemService(android.telecom.TelecomManager::class.java)!!"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt"
+ line="154"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" .getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/display/DisplayHelper.java"
+ line="50"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final PowerManager pm = getSystemService(PowerManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeService.java"
+ line="119"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(Context.WINDOW_SERVICE) as WindowManager"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DragToInteractView.kt"
+ line="90"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return mContext.getSystemService(InputManager.class)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java"
+ line="1205"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mClipboardManager = requireNonNull(getSystemService(ClipboardManager.class));"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java"
+ line="61"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" InputMethodManager imm = getSystemService(InputMethodManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java"
+ line="133"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (AccessibilityManager) getContext().getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java"
+ line="2504"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mTetheringManager = context.getSystemService(TetheringManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java"
+ line="105"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java"
+ line="106"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="77"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWallpaperManager = getDisplayContext().getSystemService(WallpaperManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java"
+ line="181"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" getDisplayContext().getSystemService(DisplayManager.class)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java"
+ line="188"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" DisplayManager displayManager = context.getSystemService(DisplayManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java"
+ line="198"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" .getSystemService(WindowManager.class)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java"
+ line="518"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = mWindowContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/ImmersiveModeConfirmation.java"
+ line="508"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java"
+ line="46"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" NotificationManager noMan = mContext.getSystemService(NotificationManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java"
+ line="109"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" NotificationManager noMan = mContext.getSystemService(NotificationManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java"
+ line="148"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(TelephonyManager.class).createForSubscriptionId("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java"
+ line="963"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java"
+ line="177"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" this.mWindowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java"
+ line="154"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java"
+ line="858"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" this.mWindowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java"
+ line="141"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final InputManager inputManager = mContext.getSystemService(InputManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java"
+ line="353"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" LayoutInflater inflater = (LayoutInflater) mContext.getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java"
+ line="601"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" InputManager im = context.getSystemService(InputManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java"
+ line="206"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" uiBgExecutor.execute(() -> mMediaRouter = mContext.getSystemService(MediaRouter.class));"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java"
+ line="109"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mDisplayService = mContext.getSystemService(DisplayManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java"
+ line="110"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mEuiccManager = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardEsimArea.java"
+ line="87"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardEsimArea.java"
+ line="105"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" message = mContext.getSystemService(DevicePolicyManager.class).getResources()"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java"
+ line="765"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" message = mContext.getSystemService(DevicePolicyManager.class).getResources()"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java"
+ line="788"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1528"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(PowerManager.class).wakeUp(mSystemClock.uptimeMillis(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1715"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final UserManager um = (UserManager) mContext.getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="2684"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="2736"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(Context.STATUS_BAR_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="3413"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" getApplicationContext().getSystemService(LauncherApps.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java"
+ line="163"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" NotificationManager notiMan = mContext.getSystemService(NotificationManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/leak/LeakReporter.java"
+ line="96"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" WindowManager windowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/LegacyLockIconViewController.java"
+ line="435"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(Context.STATUS_BAR_SERVICE) as StatusBarManager"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt"
+ line="237"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java"
+ line="192"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java"
+ line="206"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" windowContext.getSystemService(AccessibilityManager.class),"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java"
+ line="163"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" windowContext.getSystemService(WindowManager.class),"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java"
+ line="164"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java"
+ line="215"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java"
+ line="111"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java"
+ line="112"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" .getSystemService(android.app.Service.STATUS_BAR_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java"
+ line="81"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(Context.STATUS_BAR_SERVICE) as StatusBarManager"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt"
+ line="201"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val audioManager: AudioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManager.kt"
+ line="46"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final UserManager um = mContext.getSystemService(UserManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java"
+ line="881"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val statusBarManager = context.getSystemService(Context.STATUS_BAR_SERVICE)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt"
+ line="68"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" val statusBarManager = context.getSystemService(Context.STATUS_BAR_SERVICE)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt"
+ line="159"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mNotificationManager = context.getSystemService(NotificationManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java"
+ line="253"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mStatusBarManager = context.getSystemService(StatusBarManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java"
+ line="254"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/MirrorWindowControl.java"
+ line="77"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mDisplayManager = mContext.getSystemService(DisplayManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java"
+ line="142"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return context.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarModule.java"
+ line="72"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" WindowManager wm = getContext().getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java"
+ line="729"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" WindowManager wm = getContext().getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java"
+ line="830"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mManager = getHost().getUserContext().getSystemService(ColorDisplayManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java"
+ line="136"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final NotificationManager nm = context.getSystemService(NotificationManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java"
+ line="57"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(NotificationManager.class).deleteNotificationChannel(GENERAL);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java"
+ line="144"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (AudioManager) mCmd.context.getSystemService(Context.AUDIO_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java"
+ line="93"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java"
+ line="508"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java"
+ line="285"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mKeyguardManager = context.getSystemService(KeyguardManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java"
+ line="286"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" LayoutInflater inflater = (LayoutInflater) getContext().getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java"
+ line="316"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mPM = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/NumPadKey.java"
+ line="109"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" LayoutInflater inflater = (LayoutInflater) getContext().getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/NumPadKey.java"
+ line="110"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(InputMethodManager.class)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java"
+ line="284"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mPM = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java"
+ line="145"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleBackupFollowUpJob.java"
+ line="74"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mJobScheduler = mContext.getSystemService(JobScheduler.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleBackupFollowUpJob.java"
+ line="92"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mPeopleManager = context.getSystemService(PeopleManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java"
+ line="204"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" JobScheduler jobScheduler = mContext.getSystemService(JobScheduler.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java"
+ line="1134"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" KeyguardManager keyguardManager = mContext.getSystemService(KeyguardManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java"
+ line="190"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mNoMan = mContext.getSystemService(NotificationManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="200"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mPowerMan = (PowerManager) context.getSystemService(Context.POWER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="201"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mKeyguard = mContext.getSystemService(KeyguardManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="202"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mPowerManager = context.getSystemService(PowerManager::class.java)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt"
+ line="125"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mUserTracker.getUserContext().getSystemService(ClipboardManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java"
+ line="77"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" WindowManager wm = this.mPanelView.getContext().getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java"
+ line="527"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mInputMethodManager = targetContext.getSystemService(InputMethodManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java"
+ line="1111"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java"
+ line="484"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java"
+ line="144"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java"
+ line="113"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(Context.WINDOW_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java"
+ line="115"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" NotificationManager notificationManager = context.getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotServiceErrorReceiver.java"
+ line="36"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" DevicePolicyManager devicePolicyManager = context.getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotServiceErrorReceiver.java"
+ line="38"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final WindowManager wm = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java"
+ line="311"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(Context.DEVICE_POLICY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java"
+ line="140"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(Context.CONNECTIVITY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java"
+ line="142"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mVpnManager = context.getSystemService(VpnManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java"
+ line="143"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java"
+ line="145"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" LauncherApps apps = getContext().getSystemService(LauncherApps.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java"
+ line="61"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" getSystemService(SliceManager.class).grantPermissionFromUser(mUri, mCallingPkg,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java"
+ line="108"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mKeyguardManager = context.getSystemService(KeyguardManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java"
+ line="159"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mKeyguardManager = context.getSystemService(KeyguardManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java"
+ line="110"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mA11yManager = (AccessibilityManager) mContext.getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java"
+ line="215"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(InputManager.class)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java"
+ line="479"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(PowerManager.class).goToSleep(SystemClock.uptimeMillis(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java"
+ line="509"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(WallpaperManager.class),"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java"
+ line="62"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mDisplayManager = mContext.getSystemService(DisplayManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java"
+ line="176"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return usercontext.getSystemService(UserManager.class).isPrivateProfile();"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java"
+ line="591"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/TimeoutHandler.java"
+ line="96"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java"
+ line="104"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" DisplayManager mDisplayManager = mContext.getSystemService(DisplayManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java"
+ line="122"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" view.getContext().getSystemService(WindowManager.class)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunablePadding.java"
+ line="48"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = mView.getContext().getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java"
+ line="57"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mUiModeManager = host.getUserContext().getSystemService(UiModeManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java"
+ line="88"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mUsbPort = port.getUsbPort(getSystemService(UsbManager.class));"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbContaminantActivity.java"
+ line="60"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" LayoutInflater inflater = getSystemService(LayoutInflater.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDialogActivity.java"
+ line="102"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return requireNotNull(context.getSystemService(serviceType))"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/utils/UserScopedService.kt"
+ line="64"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mCaptioningManager.set(userContext.getSystemService(CaptioningManager.class));"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java"
+ line="343"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java"
+ line="342"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java"
+ line="343"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return context.getSystemService(PowerManager.class)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java"
+ line="93"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWm = context.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="279"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" .getSystemService(AccessibilityManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="776"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java"
+ line="140"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWindowManager = mContext.getSystemService(WindowManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java"
+ line="141"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java"
+ line="203"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java"
+ line="114"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java"
+ line="140"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java"
+ line="155"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" mUserManager = context.getSystemService(UserManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java"
+ line="158"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" = Settings.Global.getUriFor(Settings.Global.ALWAYS_ON_DISPLAY_CONSTANTS);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java"
+ line="148"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" final String value = Settings.Global.getString(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java"
+ line="169"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/animation/data/repository/AnimationStatusRepository.kt"
+ line="62"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" Settings.System.getUriFor(SHOW_BATTERY_PERCENT),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java"
+ line="215"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java"
+ line="223"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" mHasPercentage = Settings.System.getInt(getContext().getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java"
+ line="53"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" Settings.System.putInt(getContext().getContentResolver(), SHOW_BATTERY_PERCENT, v ? 1 : 0);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java"
+ line="89"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java"
+ line="73"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return Settings.Secure.getInt(context.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java"
+ line="668"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.putInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="2917"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return Settings.Secure.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java"
+ line="152"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" boolean showOnboarding = Settings.Secure.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java"
+ line="167"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" && Settings.Secure.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java"
+ line="169"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.putInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java"
+ line="173"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(Settings.Secure.DOZE_QUICK_PICKUP_GESTURE);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java"
+ line="475"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(Settings.Secure.DOZE_PICK_UP_GESTURE);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java"
+ line="477"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(Settings.Secure.DOZE_ALWAYS_ON);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java"
+ line="479"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_BUBBLES);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java"
+ line="80"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java"
+ line="424"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" Settings.System.getString("
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java"
+ line="2328"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" Settings.System.getUriFor(Settings.System.TIME_12_24),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java"
+ line="2462"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" return Settings.Global.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java"
+ line="3051"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java"
+ line="3069"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" String soundPath = Settings.Global.getString(cr, Settings.Global.LOCK_SOUND);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1564"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" soundPath = Settings.Global.getString(cr, Settings.Global.UNLOCK_SOUND);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1571"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" soundPath = Settings.Global.getString(cr, Settings.Global.TRUSTED_SOUND);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1578"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getInt("
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt"
+ line="157"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getString(getContext().getContentResolver(),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java"
+ line="254"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="559"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" mContext.getContentResolver().registerContentObserver(Global.getUriFor(Global.MOBILE_DATA),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java"
+ line="200"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" mContext.getContentResolver().registerContentObserver(Global.getUriFor("
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java"
+ line="202"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" Settings.System.getUriFor(Settings.System.TOUCHPAD_NATURAL_SCROLLING), false,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/NaturalScrollingSettingObserver.kt"
+ line="55"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(Settings.Secure.ASSISTANT),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java"
+ line="245"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(Settings.Secure.ASSIST_LONG_PRESS_HOME_ENABLED),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java"
+ line="248"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(Secure.SEARCH_ALL_ENTRYPOINTS_ENABLED),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java"
+ line="251"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java"
+ line="254"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.putString(mCurrentUserContext.getContentResolver(),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java"
+ line="139"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" boolean airplaneMode = (Settings.Global.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="1048"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" if ("1".equals(Settings.Global.getString(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java"
+ line="117"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" final String soundPath = Settings.Global.getString(context.getContentResolver(),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java"
+ line="61"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(LOCK_SCREEN_SHOW_NOTIFICATIONS);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java"
+ line="108"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java"
+ line="110"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" final int showDismissSetting = Settings.Global.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java"
+ line="298"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.USER_SWITCHER_ENABLED),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java"
+ line="3664"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" final String config = Settings.Global.getString(getContext().getContentResolver(),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java"
+ line="270"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" final int mode = Settings.Global.getInt(resolver, Global.AUTOMATIC_POWER_SAVE_MODE,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="352"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" && Settings.Global.getInt(resolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0) > 0;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="358"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.putInt("
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="674"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.putInt("
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="678"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" resolver.registerContentObserver(Settings.Global.getUriFor("
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="183"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.SHOW_TEMPERATURE_WARNING),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="198"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.SHOW_USB_TEMPERATURE_ALARM),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="209"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" mEnableSkinTemperatureWarning = Settings.Global.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="556"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" mEnableUsbTemperatureAlarm = Settings.Global.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="591"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" bootCount = Settings.Global.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="625"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" pw.println(Settings.Global.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="679"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED), false,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java"
+ line="179"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" return (Settings.Global.getInt(cr, Settings.Global.DEVICE_PROVISIONED, 0) != 0) &&"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/Recents.java"
+ line="131"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" (Settings.Secure.getInt(cr, Settings.Secure.USER_SETUP_COMPLETE, 0) != 0);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/Recents.java"
+ line="132"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" mOriginalShowTaps = Settings.System.getInt("
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java"
+ line="163"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" Settings.System.putInt(getContentResolver(), Settings.System.SHOW_TOUCHES, value);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java"
+ line="472"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return Settings.Secure.getInt(mContext.createContextAsUser(owner, 0)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java"
+ line="959"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" float maxPages = Settings.Secure.getFloat(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ScrollCaptureController.java"
+ line="179"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.getUriFor(mKey), /* notifyForDescendants= */"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/SecureSettingsContentObserver.java"
+ line="84"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return Settings.Secure.getUriFor(name);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java"
+ line="51"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return Settings.Secure.putString(mContentResolver, name, value, overrideableByRestore);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java"
+ line="62"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return Settings.Secure.putString(mContentResolver, name, value, tag, makeDefault);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java"
+ line="81"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" return Settings.System.getUriFor(name);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java"
+ line="51"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" return Settings.System.putString(mContentResolver, name, value, overrideableByRestore);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java"
+ line="62"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SystemSettings instead"
+ errorLine1=" mLessRows = ((Settings.System.getInt(context.getContentResolver(), "qs_less_rows", 0) != 0)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java"
+ line="66"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" String current = Settings.Secure.getString(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java"
+ line="100"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" if (Settings.Secure.getInt(getContext().getContentResolver(), SETTING_SEEN_TUNER_WARNING,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java"
+ line="105"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.putInt(getContext().getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java"
+ line="163"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Uri uri = Settings.Secure.getUriFor(key);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java"
+ line="217"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Secure.putInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java"
+ line="321"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.putString(getContext().getContentResolver(), key, value ? "1" : "0");"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java"
+ line="57"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" return Settings.Global.getInt("
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt"
+ line="194"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE),"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt"
+ line="166"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getString("
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt"
+ line="363"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" final int settingsFlag = Settings.Global.getInt(context.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/Utils.java"
+ line="102"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" int flag = Settings.Secure.getInt(context.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/Utils.java"
+ line="116"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" final int zen = Settings.Global.getInt(mContext.getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java"
+ line="655"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.ZEN_MODE);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java"
+ line="1157"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Settings.Global.getUriFor(Settings.Global.ZEN_MODE_CONFIG_ETAG);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java"
+ line="1159"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" int ringerCount = Settings.Secure.getInt(cr, Settings.Secure.MANUAL_RINGER_TOGGLE_COUNT, 0);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java"
+ line="1397"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Settings.Secure.putInt(cr, Settings.Secure.MANUAL_RINGER_TOGGLE_COUNT, ringerCount + 1);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java"
+ line="1398"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" return Global.getInt(mResolver, Global.DEVICE_PROVISIONED, 0) != 0;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java"
+ line="372"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" Global.getUriFor(Global.DEVICE_PROVISIONED), false, this);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java"
+ line="380"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" Secure.getUriFor(Secure.USER_SETUP_COMPLETE), false, this, mUserId);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java"
+ line="382"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" if (Global.getUriFor(Global.DEVICE_PROVISIONED).equals(uri)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java"
+ line="389"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" || Secure.getUriFor(Secure.USER_SETUP_COMPLETE).equals(uri)) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java"
+ line="390"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="CanvasSize"
+ message="Calling `Canvas.getHeight()` is usually wrong; you should be calling `getHeight()` instead"
+ errorLine1=" canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java"
+ line="155"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="CanvasSize"
+ message="Calling `Canvas.getWidth()` is usually wrong; you should be calling `getWidth()` instead"
+ errorLine1=" canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java"
+ line="155"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="CustomViewStyleable"
+ message="By convention, the custom view (`KeyguardAffordanceView`) and the declare-styleable (`ImageView`) should have the same name (various editor features rely on this convention)"
+ errorLine1=" TypedArray a = context.obtainStyledAttributes(attrs, android.R.styleable.ImageView);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java"
+ line="130"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="CustomViewStyleable"
+ message="By convention, the custom view (`PasswordTextView`) and the declare-styleable (`View`) should have the same name (various editor features rely on this convention)"
+ errorLine1=" TypedArray a = context.obtainStyledAttributes(attrs, android.R.styleable.View);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java"
+ line="107"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="CustomViewStyleable"
+ message="By convention, the custom view (`ResizingSpace`) and the declare-styleable (`ViewGroup_Layout`) should have the same name (various editor features rely on this convention)"
+ errorLine1=" TypedArray a = context.obtainStyledAttributes(attrs, android.R.styleable.ViewGroup_Layout);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/ResizingSpace.java"
+ line="35"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="CustomViewStyleable"
+ message="By convention, the custom view (`SeekBarWithIconButtonsView`) and the declare-styleable (`SeekBarWithIconButtonsView_Layout`) should have the same name (various editor features rely on this convention)"
+ errorLine1=" R.styleable.SeekBarWithIconButtonsView_Layout,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java"
+ line="87"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="CutPasteId"
+ message="The id `R.id.app_or_structure_spinner` has already been looked up in this method; possible cut & paste error?"
+ errorLine1=" val anchor = parent.requireViewById<View>(R.id.app_or_structure_spinner)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt"
+ line="611"
+ column="22"/>
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt"
+ line="601"
+ column="23"
+ message="First usage here"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" String.format("%dx%d", mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="1839"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" demoTime = String.format("%02d00", majorVersion % 24);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java"
+ line="167"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" mPredictionLog.log(String.format("Prediction [%d,%d,%d,%d,%f,%d]","
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java"
+ line="914"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" (isWithinInsets ? mGestureLogInsideInsets : mGestureLogOutsideInsets).log(String.format("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java"
+ line="1034"
+ column="87"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `toLowerCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`."
+ errorLine1=" cmd = args.get(1).toLowerCase();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/flags/FlagCommand.java"
+ line="75"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" return String.format("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/GestureRecorder.java"
+ line="65"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" return String.format("{\"type\":\"tag\", \"time\":%d, \"tag\":\"%s\", \"info\":\"%s\"}","
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/GestureRecorder.java"
+ line="85"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" return String.format(FILENAME_PATTERN, time, fileExtension(format));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java"
+ line="483"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" return String.format(CONNECTED_DISPLAY_FILENAME_PATTERN, time, displayId,"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java"
+ line="485"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `toLowerCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`."
+ errorLine1=" info.setContentDescription(mContentDescription.toLowerCase());"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java"
+ line="798"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" .setContentText(String.format("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/leak/LeakReporter.java"
+ line="107"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" pw.println(String.format(" mCurrentView: id=%s (%dx%d) %s %f","
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java"
+ line="1128"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" pw.println(String.format(" disabled=0x%08x vertical=%s darkIntensity=%.2f","
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java"
+ line="1134"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `toLowerCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`."
+ errorLine1=" b.append(s.substring(1).toLowerCase());"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java"
+ line="139"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" state.secondaryLabel = String.format("%d...", countdown);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java"
+ line="151"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
+ errorLine1=" secondaryLabel = String.format("%d...", countDown)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/ui/ScreenRecordTileMapper.kt"
+ line="64"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="DefaultLocale"
+ message="Implicitly using the default locale is a common source of bugs: Use `toLowerCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`."
+ errorLine1=" String colorString = systemPalette.getPackageName().toLowerCase();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java"
+ line="728"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="DuplicateDefinition"
+ message="`android:textSize` has already been defined in this `<style>`"
+ errorLine1=" <item name="android:textSize">@dimen/notification_importance_channel_text</item>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/styles.xml"
+ line="683"
+ column="15"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/styles.xml"
+ line="680"
+ column="9"
+ message="Previously defined here"/>
+ </issue>
+
+ <issue
+ id="DuplicateDefinition"
+ message="`android:textSize` has already been defined in this `<style>`"
+ errorLine1=" <item name="android:textSize">@dimen/notification_importance_channel_group_text</item>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/styles.xml"
+ line="690"
+ column="15"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/styles.xml"
+ line="687"
+ column="9"
+ message="Previously defined here"/>
+ </issue>
+
+ <issue
+ id="DuplicateDefinition"
+ message="`android:textSize` has already been defined in this `<style>`"
+ errorLine1=" <item name="android:textSize">@dimen/notification_importance_channel_group_text</item>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/styles.xml"
+ line="697"
+ column="15"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/styles.xml"
+ line="694"
+ column="9"
+ message="Previously defined here"/>
+ </issue>
+
+ <issue
+ id="DuplicateIncludedIds"
+ message="Duplicate id @+id/wifi_combo, defined or included multiple times in layout/new_status_bar_wifi_group.xml: [layout/new_status_bar_wifi_group.xml defines @+id/wifi_combo, layout/new_status_bar_wifi_group.xml => layout/status_bar_wifi_group_inner.xml defines @+id/wifi_combo]"
+ errorLine1=" <include layout="@layout/status_bar_wifi_group_inner" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/new_status_bar_wifi_group.xml"
+ line="26"
+ column="5"
+ message="Duplicate id @+id/wifi_combo, defined or included multiple times in layout/new_status_bar_wifi_group.xml: [layout/new_status_bar_wifi_group.xml defines @+id/wifi_combo, layout/new_status_bar_wifi_group.xml => layout/status_bar_wifi_group_inner.xml defines @+id/wifi_combo]"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/new_status_bar_wifi_group.xml"
+ line="21"
+ column="5"
+ message="Defined here"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar_wifi_group_inner.xml"
+ line="52"
+ column="13"
+ message="Defined here, included via layout/new_status_bar_wifi_group.xml => layout/status_bar_wifi_group_inner.xml defines @+id/wifi_combo"/>
+ </issue>
+
+ <issue
+ id="ExactAlarm"
+ message="`USE_EXACT_ALARM` can only be used when targeting API level 33 or higher"
+ errorLine1=" <uses-permission android:name="android.permission.USE_EXACT_ALARM"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="175"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="InconsistentLayout"
+ message="The id "midGuideline" in layout "biometric_prompt_constraint_layout" is missing from the following layout configurations: layout, layout-sw600dp (present in layout-land)"
+ errorLine1=" android:id="@+id/midGuideline""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/biometric_prompt_constraint_layout.xml"
+ line="224"
+ column="9"
+ message="Occurrence in layout-land"/>
+ </issue>
+
+ <issue
+ id="InconsistentLayout"
+ message="The id "volume_dialog_top_container" in layout "volume_dialog" is missing from the following layout configurations: layout-land-television (present in layout, layout-land)"
+ errorLine1=" android:id="@+id/volume_dialog_top_container""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_dialog.xml"
+ line="41"
+ column="13"
+ message="Occurrence in layout"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/volume_dialog.xml"
+ line="42"
+ column="13"
+ message="Occurrence in layout-land"/>
+ </issue>
+
+ <issue
+ id="InconsistentLayout"
+ message="The id "ringer" in layout "volume_dialog" is missing from the following layout configurations: layout-land-television (present in layout, layout-land)"
+ errorLine1=" android:id="@+id/ringer""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_dialog.xml"
+ line="52"
+ column="17"
+ message="Occurrence in layout"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/volume_dialog.xml"
+ line="53"
+ column="17"
+ message="Occurrence in layout-land"/>
+ </issue>
+
+ <issue
+ id="InconsistentLayout"
+ message="The id "ringer_icon" in layout "volume_dialog" is missing from the following layout configurations: layout-land-television (present in layout, layout-land)"
+ errorLine1=" android:id="@+id/ringer_icon""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_dialog.xml"
+ line="62"
+ column="21"
+ message="Occurrence in layout"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/volume_dialog.xml"
+ line="63"
+ column="21"
+ message="Occurrence in layout-land"/>
+ </issue>
+
+ <issue
+ id="InconsistentLayout"
+ message="The id "settings_container" in layout "volume_dialog" is missing from the following layout configurations: layout-land-television (present in layout, layout-land)"
+ errorLine1=" android:id="@+id/settings_container""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_dialog.xml"
+ line="92"
+ column="21"
+ message="Occurrence in layout"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/volume_dialog.xml"
+ line="93"
+ column="21"
+ message="Occurrence in layout-land"/>
+ </issue>
+
+ <issue
+ id="InconsistentLayout"
+ message="The id "settings" in layout "volume_dialog" is missing from the following layout configurations: layout-land-television (present in layout, layout-land)"
+ errorLine1=" android:id="@+id/settings""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_dialog.xml"
+ line="100"
+ column="25"
+ message="Occurrence in layout"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/volume_dialog.xml"
+ line="101"
+ column="25"
+ message="Occurrence in layout-land"/>
+ </issue>
+
+ <issue
+ id="InconsistentLayout"
+ message="The id "volume_number" in layout "volume_dialog_row" is missing from the following layout configurations: layout (present in layout-land-television)"
+ errorLine1=" android:id="@+id/volume_number""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land-television/volume_dialog_row.xml"
+ line="36"
+ column="13"
+ message="Occurrence in layout-land-television"/>
+ </issue>
+
+ <issue
+ id="KotlinNullnessAnnotation"
+ message="Do not use `@NonNull` in Kotlin; the nullability is already implied by the Kotlin type `PrintWriter` **not** ending with `?`"
+ errorLine1=" fun dump(@NonNull pw: PrintWriter, name: String) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/decor/OverlayWindow.kt"
+ line="112"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "notification_primary_text_color" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="notification_primary_text_color">@*android:color/notification_primary_text_color_dark</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="34"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "notification_section_header_label_color" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="notification_section_header_label_color">@color/GM2_grey_200</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="45"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "notification_channel_dialog_separator" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="notification_channel_dialog_separator">@color/GM2_grey_700</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="47"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "global_actions_text" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="global_actions_text">@color/GM2_grey_200</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="56"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "global_actions_alert_text" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="global_actions_alert_text">@color/GM2_red_300</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="59"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "media_divider" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="media_divider">#85ffffff</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="65"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "GM2_green_500" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="GM2_green_500">#FF41Af6A</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="81"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "GM2_blue_500" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="GM2_blue_500">#5195EA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="82"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "GM2_yellow_500" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="GM2_yellow_500">#F5C518</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="84"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The color "kg_user_switcher_selected_avatar_icon_color" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <color name="kg_user_switcher_selected_avatar_icon_color">#202124</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/colors.xml"
+ line="89"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The bool "quick_settings_rssi_tile_capitalization" in values-mcc262-mnc07 has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <bool name="quick_settings_rssi_tile_capitalization">false</bool>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mcc262-mnc07/config.xml"
+ line="24"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The bool "quick_settings_rssi_tile_capitalization" in values-mcc262-mnc08 has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <bool name="quick_settings_rssi_tile_capitalization">false</bool>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mcc262-mnc08/config.xml"
+ line="24"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The bool "quick_settings_rssi_tile_capitalization" in values-mcc262-mnc11 has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <bool name="quick_settings_rssi_tile_capitalization">false</bool>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mcc262-mnc11/config.xml"
+ line="24"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The integer "quick_settings_user_time_settings_tile_span" in values-land has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <integer name="quick_settings_user_time_settings_tile_span">2</integer>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land/config.xml"
+ line="29"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The integer "power_menu_max_columns" in values-land has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <integer name="power_menu_max_columns">4</integer>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land/config.xml"
+ line="35"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "ambient_indication_container_margin_top" in values-h700dp has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="ambient_indication_container_margin_top">15dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-h700dp/dimens.xml"
+ line="19"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "ambient_indication_container_margin_top" in values-h800dp has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="ambient_indication_container_margin_top">20dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-h800dp/dimens.xml"
+ line="19"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "volume_dialog_panel_height" in values-land-television has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="volume_dialog_panel_height">190dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land-television/dimens.xml"
+ line="19"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "screenshot_bg_protection_height" in values-night has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="screenshot_bg_protection_height">375dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-night/dimens.xml"
+ line="21"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "docked_divider_handle_width" in values-land has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="docked_divider_handle_width">2dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land/dimens.xml"
+ line="22"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "docked_divider_handle_height" in values-land has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="docked_divider_handle_height">16dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land/dimens.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "button_size" in values-sw900dp has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="button_size">80dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw900dp/dimens.xml"
+ line="26"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "tv_volume_dialog_bubble_size" in values-land-television has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="tv_volume_dialog_bubble_size">36dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land-television/dimens.xml"
+ line="28"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "tv_volume_dialog_row_padding" in values-land-television has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="tv_volume_dialog_row_padding">6dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land-television/dimens.xml"
+ line="29"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "tv_volume_number_text_size" in values-land-television has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="tv_volume_number_text_size">16sp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land-television/dimens.xml"
+ line="30"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "tv_volume_seek_bar_thumb_diameter" in values-land-television has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="tv_volume_seek_bar_thumb_diameter">16dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land-television/dimens.xml"
+ line="31"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "tv_volume_icons_size" in values-land-television has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="tv_volume_icons_size">20dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land-television/dimens.xml"
+ line="32"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "volume_tool_tip_top_margin" in values-land has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="volume_tool_tip_top_margin">12dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land/dimens.xml"
+ line="35"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "controls_activity_view_top_offset" in values-land has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="controls_activity_view_top_offset">25dp</dimen>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land/dimens.xml"
+ line="41"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingDefaultResource"
+ message="The dimen "car_body2_size" in values-h600dp has no declaration in the base `values` folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier"
+ errorLine1=" <dimen name="car_body2_size">32sp</dimen> <!-- B2 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-h600dp/dimens_car.xml"
+ line="19"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="MissingPrefix"
+ message="Attribute is missing the Android namespace prefix"
+ errorLine1=" <item android:state_activated="true" android_state_enabled="true" android:color="@color/kg_user_switcher_activated_background_color" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/color/kg_user_switcher_rounded_background_color.xml"
+ line="20"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="SdCardPath"
+ message="Do not hardcode "/sdcard/"; use `Environment.getExternalStorageDirectory().getPath()` instead"
+ errorLine1=" ? new GestureRecorder("/sdcard/statusbar_gestures.dat")"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="467"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ShowToast"
+ message="Expected duration `Toast.LENGTH_SHORT` or `Toast.LENGTH_LONG`, a custom duration value is not supported"
+ errorLine1=" 500).show();"
+ errorLine2=" ~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java"
+ line="1894"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="SimpleDateFormat"
+ message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates."
+ errorLine1=" private static final SimpleDateFormat SSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/CallbackHandler.java"
+ line="52"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="SimpleDateFormat"
+ message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates."
+ errorLine1=" mContentDescriptionFormat = new SimpleDateFormat(format);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java"
+ line="452"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="SimpleDateFormat"
+ message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates."
+ errorLine1=" mClockFormat = new SimpleDateFormat(format);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java"
+ line="483"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="SimpleDateFormat"
+ message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates."
+ errorLine1=" private static final SimpleDateFormat SSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java"
+ line="60"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="SimpleDateFormat"
+ message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates."
+ errorLine1=" private static final SimpleDateFormat SSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="119"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="SimpleDateFormat"
+ message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates."
+ errorLine1=" String today = new SimpleDateFormat("MM-dd").format(new Date());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java"
+ line="503"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="SimpleDateFormat"
+ message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates."
+ errorLine1=" String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'")"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java"
+ line="329"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="Slices"
+ message="A slice should have a primary action set on one of its rows"
+ errorLine1=" ListBuilder builder = new ListBuilder(getContext(), mSliceUri, ListBuilder.INFINITY);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java"
+ line="218"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="ValidFragment"
+ message="This fragment should provide a default constructor (a public constructor with no arguments) (`com.android.systemui.tuner.DemoModeFragment`)"
+ errorLine1="public class DemoModeFragment extends PreferenceFragment implements OnPreferenceChangeListener {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java"
+ line="38"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ValidFragment"
+ message="This fragment should provide a default constructor (a public constructor with no arguments) (`com.android.systemui.qs.QSFragmentLegacy`)"
+ errorLine1="public class QSFragmentLegacy extends LifecycleFragment implements QS {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSFragmentLegacy.java"
+ line="42"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ValidFragment"
+ message="Avoid non-default constructors in fragments: use a default constructor plus `Fragment#setArguments(Bundle)` instead"
+ errorLine1=" public QSFragmentLegacy("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSFragmentLegacy.java"
+ line="52"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="ValidFragment"
+ message="This fragment should provide a default constructor (a public constructor with no arguments) (`com.android.systemui.tuner.TunerFragment`)"
+ errorLine1="public class TunerFragment extends PreferenceFragment {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java"
+ line="41"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" animateAway(false /* sendReason */, 0 /* reason */);"
+ errorLine2=" ~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java"
+ line="778"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" animateAway(false /* sendReason */, 0 /* reason */);"
+ errorLine2=" ~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java"
+ line="787"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" sendResultAndCleanUp(BiometricPrompt.DISMISSED_REASON_USER_CANCEL,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="539"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" sendResultAndCleanUp(BiometricPrompt.DISMISSED_REASON_NEGATIVE,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="544"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" sendResultAndCleanUp(BiometricPrompt.DISMISSED_REASON_BIOMETRIC_CONFIRMED,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="549"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" BiometricPrompt.DISMISSED_REASON_BIOMETRIC_CONFIRM_NOT_REQUIRED,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="555"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" sendResultAndCleanUp(BiometricPrompt.DISMISSED_REASON_ERROR,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="560"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" sendResultAndCleanUp(BiometricPrompt.DISMISSED_REASON_SERVER_REQUESTED,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="565"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" sendResultAndCleanUp(BiometricPrompt.DISMISSED_REASON_CREDENTIAL_CONFIRMED,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="570"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AuthDialogCallback.DISMISSED_USER_CANCELED, AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE, AuthDialogCallback.DISMISSED_BUTTON_POSITIVE, AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED, AuthDialogCallback.DISMISSED_ERROR, AuthDialogCallback.DISMISSED_BY_SYSTEM_SERVER, AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED, AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS"
+ errorLine1=" BiometricPrompt.DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="576"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS, DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, DreamOverlayStatusBarView.STATUS_ICON_ALARM_SET, DreamOverlayStatusBarView.STATUS_ICON_CAMERA_DISABLED, DreamOverlayStatusBarView.STATUS_ICON_MIC_DISABLED, DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, DreamOverlayStatusBarView.STATUS_ICON_ASSISTANT_ATTENTION_ACTIVE"
+ errorLine1=" @DreamOverlayStatusBarView.StatusIconType int iconType = Resources.ID_NULL;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java"
+ line="287"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation private var desiredLocation: Int = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="153"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation @VisibleForTesting var currentEndLocation: Int = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="159"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation private var currentStartLocation: Int = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="165"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (location == desiredLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="542"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" onDesiredLocationChanged(desiredLocation, mediaHostState, animate = false)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="543"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" startLocation != currentStartLocation ||"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="974"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation = startLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="979"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val startIsVisible = hostStates[currentStartLocation]?.visible ?: false"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="994"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" hostStates[currentStartLocation]?.showsOnlyActiveMedia ?: endShowsActive"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="1070"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" startLocation = currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="1085"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" startLocation = currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="1085"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (this.desiredLocation != desiredLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="1111"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" this.desiredLocation = desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="1117"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" println("location: $desiredLocation")"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt"
+ line="1325"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation private var crossFadeAnimationStartLocation = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="155"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation private var crossFadeAnimationEndLocation = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="158"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation private var previousLocation = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="226"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation private var desiredLocation = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="228"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation private var currentAttachmentLocation = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="235"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val startHost = getHost(previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="337"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val startHost = getHost(previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="337"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (mediaObject.location == desiredLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="618"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredLocation = -1"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="621"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredLocation = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="621"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (mediaObject.location == currentAttachmentLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="623"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentAttachmentLocation = -1"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="624"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentAttachmentLocation = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="624"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredLocation != this.desiredLocation || forceStateUpdate && !blockLocationChanges"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="671"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (this.desiredLocation >= 0 && desiredLocation != this.desiredLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="673"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (this.desiredLocation >= 0 && desiredLocation != this.desiredLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="673"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation = this.desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="675"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation = this.desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="675"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation = this.desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="675"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation == LOCATION_LOCKSCREEN &&"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="682"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation = LOCATION_QQS"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="687"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val isNewView = this.desiredLocation == -1"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="690"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" this.desiredLocation = desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="691"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" !forceNoAnimation && shouldAnimateTransition(desiredLocation, previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="694"
+ column="83"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" !forceNoAnimation && shouldAnimateTransition(desiredLocation, previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="694"
+ column="83"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val (animDuration, delay) = getAnimationParams(previousLocation, desiredLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="695"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (previousLocation < 0 || isNewView) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="715"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val currentHost = getHost(desiredLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="719"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val currentHost = getHost(desiredLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="719"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val previousHost = getHost(previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="720"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val previousHost = getHost(previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="720"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentAttachmentLocation != previousLocation ||"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="733"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentAttachmentLocation != previousLocation ||"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="733"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" var newCrossFadeStartLocation = previousLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="751"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (currentAttachmentLocation == crossFadeAnimationEndLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="753"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (currentAttachmentLocation == crossFadeAnimationEndLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="753"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" newCrossFadeStartLocation = crossFadeAnimationStartLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="763"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (newCrossFadeStartLocation == desiredLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="764"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" crossFadeAnimationStartLocation = newCrossFadeStartLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="781"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" crossFadeAnimationStartLocation = newCrossFadeStartLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="781"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" crossFadeAnimationEndLocation = desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="782"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" crossFadeAnimationEndLocation = desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="782"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" crossFadeAnimationEndLocation = desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="782"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" adjustAnimatorForTransition(desiredLocation, previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="785"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" adjustAnimatorForTransition(desiredLocation, previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="785"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredLocation == LOCATION_QQS &&"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="812"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredLocation == LOCATION_QS &&"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="830"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" var starthost = getHost(previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="887"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" var starthost = getHost(previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="887"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" var endHost = getHost(desiredLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="888"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" var endHost = getHost(desiredLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="888"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return previousLocation != -1 && desiredLocation != -1"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="943"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return previousLocation != -1 && desiredLocation != -1"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="943"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QS ||"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="957"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QS ||"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="957"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation == LOCATION_QS && desiredLocation == LOCATION_LOCKSCREEN"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="958"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" previousLocation == LOCATION_QS && desiredLocation == LOCATION_LOCKSCREEN"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="958"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QQS) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="963"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QQS) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="963"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return getHost(previousLocation)?.visible == true &&"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="971"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return getHost(previousLocation)?.visible == true &&"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="971"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" getHost(desiredLocation)?.visible == true"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="972"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" getHost(desiredLocation)?.visible == true"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="972"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val currentHost = getHost(desiredLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="994"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val currentHost = getHost(desiredLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="994"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val previousHost = getHost(previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="995"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val previousHost = getHost(previousLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="995"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" getHost(desiredLocation)?.let {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1015"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" getHost(desiredLocation)?.let {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1015"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val startLocation = if (onlyUseEndState) -1 else previousLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1032"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" startLocation,"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1036"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" startLocation,"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1036"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (currentAttachmentLocation == IN_OVERLAY) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1042"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" logger.logMediaHostAttachment(desiredLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1060"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredLocation = desiredLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1062"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredHostState = getHost(desiredLocation),"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1063"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredHostState = getHost(desiredLocation),"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1063"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" newLocation != desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1076"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (currentAttachmentLocation != newLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1085"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentAttachmentLocation = newLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1086"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentAttachmentLocation = newLocation"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1086"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" val targetHost = getHost(newLocation)!!.hostView"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1095"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" logger.logMediaHostAttachment(currentAttachmentLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1100"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" getHost(newLocation),"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1111"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (animationCrossFadeProgress > 0.5 || previousLocation == -1) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1127"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return crossFadeAnimationEndLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1128"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return crossFadeAnimationStartLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1130"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1133"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1146"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" return desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1146"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" mediaFlags.isSceneContainerEnabled() -> desiredLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1152"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" desiredLocation == LOCATION_QS &&"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1179"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" location != LOCATION_LOCKSCREEN && desiredLocation == LOCATION_LOCKSCREEN && !fullyAwake"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt"
+ line="1186"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation var currentEndLocation: Int = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="121"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" @MediaLocation private var currentStartLocation: Int = -1"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="124"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" if (location == currentEndLocation || location == currentStartLocation) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="287"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="289"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="289"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="351"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="351"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="372"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="372"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="372"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="372"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" logger.logMediaLocation("attach $type", currentStartLocation, currentEndLocation)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="640"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" startLocation = currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="648"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" startLocation = currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="648"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation = startLocation"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="854"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="1076"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN, MediaHierarchyManager.LOCATION_DREAM_OVERLAY, MediaHierarchyManager.LOCATION_COMMUNAL_HUB"
+ errorLine1=" currentStartLocation,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt"
+ line="1076"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one or more of: NotificationRowContentBinder.FLAG_CONTENT_VIEW_CONTRACTED, NotificationRowContentBinder.FLAG_CONTENT_VIEW_EXPANDED, NotificationRowContentBinder.FLAG_CONTENT_VIEW_HEADS_UP, NotificationRowContentBinder.FLAG_CONTENT_VIEW_PUBLIC, NotificationRowContentBinder.FLAG_CONTENT_VIEW_SINGLE_LINE, NotificationRowContentBinder.FLAG_GROUP_SUMMARY_HEADER, NotificationRowContentBinder.FLAG_LOW_PRIORITY_GROUP_SUMMARY_HEADER, NotificationRowContentBinder.FLAG_CONTENT_VIEW_ALL"
+ errorLine1=" freeNotificationView(entry, row, curFlag);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java"
+ line="250"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one or more of: NotificationRowContentBinder.FLAG_CONTENT_VIEW_CONTRACTED, NotificationRowContentBinder.FLAG_CONTENT_VIEW_EXPANDED, NotificationRowContentBinder.FLAG_CONTENT_VIEW_HEADS_UP, NotificationRowContentBinder.FLAG_CONTENT_VIEW_PUBLIC, NotificationRowContentBinder.FLAG_CONTENT_VIEW_SINGLE_LINE, NotificationRowContentBinder.FLAG_GROUP_SUMMARY_HEADER, NotificationRowContentBinder.FLAG_LOW_PRIORITY_GROUP_SUMMARY_HEADER, NotificationRowContentBinder.FLAG_CONTENT_VIEW_ALL"
+ errorLine1=" contentToUnbind &= ~curFlag;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java"
+ line="252"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" private @Action int mSelectedAction = -1;"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="116"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" updateToggleActions(mSelectedAction, true);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="142"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" updateToggleActions(mSelectedAction, true);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="147"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" updateToggleActions(mSelectedAction, true);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="152"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" if (mSelectedAction == ACTION_FAVORITE && getPriority() != mSelectedAction) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="160"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" if (mSelectedAction == ACTION_FAVORITE && getPriority() != mSelectedAction) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="160"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" if (mSelectedAction == selectedAction) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="187"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" mSelectedAction = selectedAction;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="191"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" updateToggleActions(mSelectedAction == -1 ? getPriority() : mSelectedAction,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="292"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" updateToggleActions(mSelectedAction == -1 ? getPriority() : mSelectedAction,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="292"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" throw new IllegalArgumentException("Unrecognized behavior: " + mSelectedAction);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="500"
+ column="80"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" return mSelectedAction;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="514"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" mAppUid, mSelectedAction, mNotificationChannel));"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="532"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" mAppUid, mSelectedAction, mNotificationChannel));"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="532"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" if (save && mSelectedAction > -1) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="579"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" mSelectedAction = -1;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="585"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: NotificationConversationInfo.ACTION_DEFAULT, NotificationConversationInfo.ACTION_HOME, NotificationConversationInfo.ACTION_FAVORITE, NotificationConversationInfo.ACTION_SNOOZE, NotificationConversationInfo.ACTION_MUTE, NotificationConversationInfo.ACTION_SETTINGS"
+ errorLine1=" mSelectedAction = -1;"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="585"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, Key.DEBUG_MODE_ENABLED, Key.HOTSPOT_TILE_LAST_USED, Key.COLOR_INVERSION_TILE_LAST_USED, Key.DND_TILE_VISIBLE, Key.DND_TILE_COMBINED_ICON, Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, Key.DND_CONFIRMED_SILENCE_INTRODUCTION, Key.DND_FAVORITE_BUCKET_INDEX, Key.DND_NONE_SELECTED, Key.DND_FAVORITE_ZEN, Key.QS_HOTSPOT_ADDED, Key.QS_DATA_SAVER_ADDED, Key.QS_DATA_SAVER_DIALOG_SHOWN, Key.QS_INVERT_COLORS_ADDED, Key.QS_WORK_ADDED, Key.QS_NIGHTDISPLAY_ADDED, Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, Key.SEEN_RINGER_GUIDANCE_COUNT, Key.QS_HAS_TURNED_OFF_MOBILE_DATA, Key.TOUCHED_RINGER_TOGGLE, Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, Key.HAS_SEEN_REVERSE_BOTTOM_SHEET, Key.CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT, Key.HAS_SEEN_ACCESSIBILITY_FLOATING_MENU_DOCK_TOOLTIP, Key.ACCESSIBILITY_FLOATING_MENU_POSITION, Key.HAS_CLICKED_NUDGE_TO_SETUP_DREAM, Key.HAS_DISMISSED_NUDGE_TO_SETUP_DREAM, Key.HAS_ACCESSIBILITY_FLOATING_MENU_TUCKED, Key.BLUETOOTH_TILE_DIALOG_CONTENT_HEIGHT"
+ errorLine1=" mContext, QS_TILE_SPECS_REVEALED, Collections.EMPTY_SET);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java"
+ line="73"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, Key.DEBUG_MODE_ENABLED, Key.HOTSPOT_TILE_LAST_USED, Key.COLOR_INVERSION_TILE_LAST_USED, Key.DND_TILE_VISIBLE, Key.DND_TILE_COMBINED_ICON, Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, Key.DND_CONFIRMED_SILENCE_INTRODUCTION, Key.DND_FAVORITE_BUCKET_INDEX, Key.DND_NONE_SELECTED, Key.DND_FAVORITE_ZEN, Key.QS_HOTSPOT_ADDED, Key.QS_DATA_SAVER_ADDED, Key.QS_DATA_SAVER_DIALOG_SHOWN, Key.QS_INVERT_COLORS_ADDED, Key.QS_WORK_ADDED, Key.QS_NIGHTDISPLAY_ADDED, Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, Key.SEEN_RINGER_GUIDANCE_COUNT, Key.QS_HAS_TURNED_OFF_MOBILE_DATA, Key.TOUCHED_RINGER_TOGGLE, Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, Key.HAS_SEEN_REVERSE_BOTTOM_SHEET, Key.CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT, Key.HAS_SEEN_ACCESSIBILITY_FLOATING_MENU_DOCK_TOOLTIP, Key.ACCESSIBILITY_FLOATING_MENU_POSITION, Key.HAS_CLICKED_NUDGE_TO_SETUP_DREAM, Key.HAS_DISMISSED_NUDGE_TO_SETUP_DREAM, Key.HAS_ACCESSIBILITY_FLOATING_MENU_TUCKED, Key.BLUETOOTH_TILE_DIALOG_CONTENT_HEIGHT"
+ errorLine1=" Prefs.getStringSet(mContext, QS_TILE_SPECS_REVEALED, Collections.EMPTY_SET));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java"
+ line="87"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, Key.DEBUG_MODE_ENABLED, Key.HOTSPOT_TILE_LAST_USED, Key.COLOR_INVERSION_TILE_LAST_USED, Key.DND_TILE_VISIBLE, Key.DND_TILE_COMBINED_ICON, Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, Key.DND_CONFIRMED_SILENCE_INTRODUCTION, Key.DND_FAVORITE_BUCKET_INDEX, Key.DND_NONE_SELECTED, Key.DND_FAVORITE_ZEN, Key.QS_HOTSPOT_ADDED, Key.QS_DATA_SAVER_ADDED, Key.QS_DATA_SAVER_DIALOG_SHOWN, Key.QS_INVERT_COLORS_ADDED, Key.QS_WORK_ADDED, Key.QS_NIGHTDISPLAY_ADDED, Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, Key.SEEN_RINGER_GUIDANCE_COUNT, Key.QS_HAS_TURNED_OFF_MOBILE_DATA, Key.TOUCHED_RINGER_TOGGLE, Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, Key.HAS_SEEN_REVERSE_BOTTOM_SHEET, Key.CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT, Key.HAS_SEEN_ACCESSIBILITY_FLOATING_MENU_DOCK_TOOLTIP, Key.ACCESSIBILITY_FLOATING_MENU_POSITION, Key.HAS_CLICKED_NUDGE_TO_SETUP_DREAM, Key.HAS_DISMISSED_NUDGE_TO_SETUP_DREAM, Key.HAS_ACCESSIBILITY_FLOATING_MENU_TUCKED, Key.BLUETOOTH_TILE_DIALOG_CONTENT_HEIGHT"
+ errorLine1=" Prefs.putStringSet(mContext, QS_TILE_SPECS_REVEALED, revealedTiles);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java"
+ line="89"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongThread"
+ message="Method notifyContentChanged must be called from the UI thread, currently inferred thread is any thread"
+ errorLine1=" notifyContentChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ImageTileSet.java"
+ line="90"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="IncludeLayoutParam"
+ message="Layout parameter `layout_weight` ignored unless both `layout_width` and `layout_height` are also specified on `<include>` tag"
+ errorLine1=" android:layout_weight="1"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/shade_carrier_group.xml"
+ line="44"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="IncludeLayoutParam"
+ message="Layout parameter `layout_weight` ignored unless both `layout_width` and `layout_height` are also specified on `<include>` tag"
+ errorLine1=" android:layout_weight="1""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/shade_carrier_group.xml"
+ line="56"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="IncludeLayoutParam"
+ message="Layout parameter `layout_weight` ignored unless both `layout_width` and `layout_height` are also specified on `<include>` tag"
+ errorLine1=" android:layout_weight="1""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/shade_carrier_group.xml"
+ line="70"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" mLayout = getLayoutInflater().inflate(R.layout.app_clips_screenshot, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsActivity.java"
+ line="149"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.biometric_prompt_layout, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java"
+ line="451"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.auth_credential_pattern_view, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java"
+ line="497"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" mCredentialView = factory.inflate(R.layout.auth_credential_pin_view, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java"
+ line="500"
+ column="86"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.auth_credential_password_view, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java"
+ line="504"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.battery_percentage_view, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java"
+ line="377"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" return inflater.inflate(R.layout.biometric_prompt_content_row_layout, null) as LinearLayout"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt"
+ line="161"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" inflater.inflate(R.layout.biometric_prompt_content_row_item_text_view, null) as TextView"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt"
+ line="219"
+ column="80"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" LayoutInflater.from(context).inflate(R.layout.bluetooth_tile_dialog, null).apply {"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt"
+ line="115"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" (LayoutInflater.from(context).inflate(R.layout.brightness_mirror_container, null)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/settings/brightness/ui/binder/BrightnessMirrorInflater.kt"
+ line="34"
+ column="89"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" View dialogView = dialog.getLayoutInflater().inflate(R.layout.broadcast_dialog, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java"
+ line="201"
+ column="89"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" setView(LayoutInflater.from(context).inflate(R.layout.controls_dialog_pin, null))"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt"
+ line="87"
+ column="88"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" val row = inflater.inflate(R.layout.notif_half_shelf_row, null) as ChannelRow"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt"
+ line="123"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.clipboard_overlay, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/clipboardoverlay/dagger/ClipboardOverlayModule.java"
+ line="61"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" null),"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java"
+ line="65"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" dialogView = dialog.layoutInflater.inflate(R.layout.contrast_dialog, null)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogDelegate.kt"
+ line="54"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" /* root = */ null,"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/complication/dagger/DreamClockTimeComplicationComponent.kt"
+ line="71"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/complication/dagger/DreamHomeControlsComplicationComponent.java"
+ line="90"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" return (View) layoutInflater.inflate(R.layout.dream_overlay_media_entry_chip, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/complication/dagger/DreamMediaEntryComplicationComponent.java"
+ line="78"
+ column="91"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" layoutInflater.inflate(R.layout.dream_overlay_container, null),"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java"
+ line="61"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" dialog.setView(layoutInflater.inflate(R.layout.font_scaling_dialog, null))"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogDelegate.kt"
+ line="85"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.fullscreen_magnification_border, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java"
+ line="181"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" com.android.systemui.res.R.layout.global_actions_power_dialog, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPowerDialog.java"
+ line="39"
+ column="80"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.hearing_devices_tile_dialog, null));"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java"
+ line="235"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.internet_connectivity_dialog, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java"
+ line="231"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.keyboard_shortcuts_search_view, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java"
+ line="861"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.keyboard_shortcuts_key_view, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java"
+ line="626"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" return inflater.inflate(R.layout.notification_icon_area, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LegacyNotificationIconAreaControllerImpl.java"
+ line="163"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" LayoutInflater.from(context).inflate(R.layout.screenshot, null) as ScreenshotView"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotViewProxy.kt"
+ line="57"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.log_access_user_consent_dialog_permission, null /*root*/);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/logcat/LogAccessDialogActivity.java"
+ line="208"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" mDialogView = LayoutInflater.from(mContext).inflate(R.layout.media_output_dialog, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java"
+ line="246"
+ column="91"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSessionReleaseDialog.java"
+ line="67"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" return (NavigationBarFrame) layoutInflater.inflate(R.layout.navigation_bar_window, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarModule.java"
+ line="47"
+ column="92"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.notification_snooze, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java"
+ line="1592"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.notification_snooze, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java"
+ line="663"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.notification_conversation_info, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java"
+ line="675"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.partial_conversation_info, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java"
+ line="685"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.notification_info, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java"
+ line="694"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.feedback_info, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java"
+ line="701"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.keyguard_pin_shape_hinting_view, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java"
+ line="153"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.keyguard_pin_shape_non_hinting_view, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java"
+ line="156"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.people_space_activity, /* root= */ null) as ViewGroup"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt"
+ line="66"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" inflater.inflate(R.layout.qs_panel, null) { view, _, _ ->"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt"
+ line="262"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.quick_settings_footer_dialog, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooterUtils.java"
+ line="497"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.quick_settings_footer_dialog_parental_controls, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooterUtils.java"
+ line="585"
+ column="83"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" dialogView = inflater.inflate(R.layout.activity_rear_display_education, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/reardisplay/RearDisplayDialogController.java"
+ line="145"
+ column="85"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.activity_rear_display_education_opened, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/reardisplay/RearDisplayDialogController.java"
+ line="148"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" setView(LayoutInflater.from(context).inflate(R.layout.record_issue_dialog, null))"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt"
+ line="84"
+ column="88"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.screen_decor_hwc_layer, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java"
+ line="846"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.screen_record_dialog_audio_source, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java"
+ line="55"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.screen_record_dialog_audio_source_selected, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java"
+ line="71"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" LayoutInflater.from(context).inflate(R.layout.screenshot_shelf, null) as ScreenshotShelfView"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt"
+ line="63"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" val view = layoutInflater.inflate(R.layout.sidefps_view, null, false)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt"
+ line="298"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" overlayView = layoutInflater.get().inflate(R.layout.sidefps_view, null, false)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt"
+ line="125"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" final View view = layoutInflater.inflate(R.layout.magnifier_controllers, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/SimpleMirrorWindowControl.java"
+ line="68"
+ column="82"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" return LayoutInflater.from(context).inflate(R.layout.bindable_status_bar_icon, null)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/view/SingleBindableStatusBarIconView.kt"
+ line="69"
+ column="92"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.smart_reply_view, null /* root */);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java"
+ line="150"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" /* root= */null"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowModule.kt"
+ line="27"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" /* root= */null"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowModule.kt"
+ line="27"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.system_event_animation_window, null) as FrameLayout"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt"
+ line="242"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" com.android.systemui.res.R.layout.text_toast, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java"
+ line="173"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.tile_service_request_dialog, null)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt"
+ line="51"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" LayoutInflater.from(context).inflate(R.layout.controls_onboarding, null) as ViewGroup"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/TooltipManager.kt"
+ line="64"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.udfps_touch_overlay, null, false"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt"
+ line="212"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" R.layout.udfps_view, null, false"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt"
+ line="238"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" LayoutInflater.from(this.context).inflate(R.layout.qs_user_dialog_content, null)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/ui/dialog/UserSwitchDialog.kt"
+ line="59"
+ column="88"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" .inflate(R.layout.qs_user_dialog_content, null)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt"
+ line="92"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" LayoutInflater.from(this.context).inflate(R.layout.user_switcher_fullscreen, null)"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/UserSwitcherFullscreenDialog.kt"
+ line="49"
+ column="90"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" /* parent= */ null"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt"
+ line="231"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumePanelDialog.java"
+ line="99"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" mMirrorView = LayoutInflater.from(mContext).inflate(R.layout.window_magnifier_view, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="692"
+ column="93"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"
+ errorLine1=" mMirrorView = LayoutInflater.from(mContext).inflate(R.layout.window_magnifier_view, null);"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="742"
+ column="93"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/controls_management` does not contain a declaration with id `status_message`"
+ errorLine1=" statusText = requireViewById(R.id.status_message)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt"
+ line="261"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/controls_management` does not contain a declaration with id `structure_page_indicator`"
+ errorLine1=" R.id.structure_page_indicator).apply {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt"
+ line="275"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/controls_management` does not contain a declaration with id `structure_pager`"
+ errorLine1=" structurePager = requireViewById<ViewPager2>(R.id.structure_pager)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt"
+ line="291"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/controls_management` does not contain a declaration with id `list`"
+ errorLine1=" recyclerView = requireViewById(R.id.list)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt"
+ line="107"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/global_actions_grid_item_v2` does not contain a declaration with id `icon`"
+ errorLine1=" ImageView icon = (ImageView) v.findViewById(R.id.icon);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java"
+ line="1899"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/global_actions_grid_item_v2` does not contain a declaration with id `message`"
+ errorLine1=" TextView messageView = (TextView) v.findViewById(R.id.message);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java"
+ line="1900"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/quick_access_wallet` does not contain a declaration with id `action_bar`"
+ errorLine1=" Toolbar toolbar = findViewById(R.id.action_bar);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java"
+ line="120"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnspecifiedRegisterReceiverFlag"
+ message="`this` is missing `RECEIVER_EXPORTED` or `RECEIVER_NOT_EXPORTED` flag for unprotected broadcasts registered for android.intent.action.PROFILE_AVAILABLE, android.intent.action.PROFILE_UNAVAILABLE"
+ errorLine1=" context.registerReceiverForAllUsers(this, filter, null, backgroundHandler)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt"
+ line="148"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="VectorRaster"
+ message="Limit vector icons sizes to 200×200 to keep icon drawing fast; see https://developer.android.com/studio/write/vector-asset-studio#when for more"
+ errorLine1=" android:width="360dp" >"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/indeterminate.xml"
+ line="20"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="VectorRaster"
+ message="Limit vector icons sizes to 200×200 to keep icon drawing fast; see https://developer.android.com/studio/write/vector-asset-studio#when for more"
+ errorLine1=" android:width="340dp""
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml"
+ line="23"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ObjectAnimatorBinding"
+ message="Could not find property setter method `setLeft` on `java.lang.Object`"
+ errorLine1=" PropertyValuesHolder left = PropertyValuesHolder.ofInt("left", 0, 1);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java"
+ line="330"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="ObjectAnimatorBinding"
+ message="Could not find property setter method `setRight` on `java.lang.Object`"
+ errorLine1=" PropertyValuesHolder right = PropertyValuesHolder.ofInt("right", 0, 1);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java"
+ line="331"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="UnsupportedChromeOsCameraSystemFeature"
+ message="You should look for any camera available on the device, not just the rear"
+ errorLine1=" mIsCameraAvailable = mContext.getPackageManager().hasSystemFeature("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qrcodescanner/controller/QRCodeScannerController.java"
+ line="239"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" BatteryController bC = new BatteryControllerImpl("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/AospPolicyModule.java"
+ line="51"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" getOrCreateInstanceId().id,"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistLogger.kt"
+ line="83"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" getOrCreateInstanceId().id,"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistLogger.kt"
+ line="83"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within package private scope"
+ errorLine1=" + " active[A2DP]=" + device.isActiveDevice(BluetoothProfile.A2DP)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="164"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within package private scope"
+ errorLine1=" + " active[HEADSET]=" + device.isActiveDevice(BluetoothProfile.HEADSET)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="165"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within package private scope"
+ errorLine1=" + " active[HEARING_AID]=" + device.isActiveDevice(BluetoothProfile.HEARING_AID)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="166"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within package private scope"
+ errorLine1=" + " active[LE_AUDIO]=" + device.isActiveDevice(BluetoothProfile.LE_AUDIO);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="167"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within package private scope"
+ errorLine1=" isActive |= device.isActiveDevice(BluetoothProfile.HEADSET)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="294"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within package private scope"
+ errorLine1=" || device.isActiveDevice(BluetoothProfile.A2DP)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="295"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within package private scope"
+ errorLine1=" || device.isActiveDevice(BluetoothProfile.HEARING_AID)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="296"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within package private scope"
+ errorLine1=" || device.isActiveDevice(BluetoothProfile.LE_AUDIO);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java"
+ line="297"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" return calculateLayoutInternal("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerSceneLayout.kt"
+ line="38"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mCentralSurfaces.updateScrimController();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java"
+ line="378"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" instanceId = instanceIdSequence.newInstanceId().id"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ControlsMetricsLoggerImpl.kt"
+ line="41"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" instanceId = instanceIdSequence.newInstanceId().id"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ControlsMetricsLoggerImpl.kt"
+ line="41"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" controller: ControlsBindingControllerImpl"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsModule.kt"
+ line="90"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mCentralSurfaces.updateScrimController();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java"
+ line="299"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mCentralSurfaces.updateScrimController();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java"
+ line="306"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mCentralSurfaces.updateScrimController();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java"
+ line="434"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mCentralSurfaces.updateScrimController();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java"
+ line="441"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mDragController.startDragAndDrop(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java"
+ line="2084"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" info.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java"
+ line="2132"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" value = foldPostureInternal(layoutInfo)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/fold/ui/composable/FoldPosture.kt"
+ line="41"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" uiEventLogger.log(GlobalActionsDialogLite.GlobalActionsEvent.GA_OPEN_QS)"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/footer/domain/interactor/FooterActionsInteractor.kt"
+ line="155"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (getCurrentRotation() == ROTATION_NONE) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsColumnLayout.java"
+ line="178"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" switch (getCurrentRotation()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsColumnLayout.java"
+ line="186"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" int rotation = getCurrentRotation();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java"
+ line="135"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (getCurrentLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java"
+ line="141"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" switch (getCurrentRotation()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java"
+ line="157"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (getCurrentRotation() == ROTATION_NONE) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java"
+ line="169"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mDefaultDataSubId = mInternetDialogController.getDefaultDataSubscriptionId();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java"
+ line="196"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mInternetDialogController.isAirplaneModeEnabled() ? View.VISIBLE : View.GONE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java"
+ line="276"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mInternetDialogController.isAirplaneModeEnabled() ? View.VISIBLE : View.GONE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java"
+ line="346"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mInternetDialogController.isAirplaneModeEnabled()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java"
+ line="531"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" && mInternetDialogController.isAirplaneModeEnabled();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java"
+ line="833"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" && msgId == BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED; // ran matcher & failed"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java"
+ line="1302"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mUiEventLogger.log(success ? BouncerUiEvent.BOUNCER_PASSWORD_SUCCESS"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="290"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" : BouncerUiEvent.BOUNCER_PASSWORD_FAILURE, getSessionId());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="291"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" BouncerUiEvent uiEvent = BouncerUiEvent.UNKNOWN;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="869"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" BouncerUiEvent uiEvent = BouncerUiEvent.UNKNOWN;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="869"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" uiEvent = BouncerUiEvent.BOUNCER_DISMISS_EXTENDED_ACCESS;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="877"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" uiEvent = BouncerUiEvent.BOUNCER_DISMISS_BIOMETRIC;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="881"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" uiEvent = BouncerUiEvent.BOUNCER_DISMISS_NONE_SECURITY;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="887"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" uiEvent = BouncerUiEvent.BOUNCER_DISMISS_PASSWORD;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="899"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" uiEvent = BouncerUiEvent.BOUNCER_DISMISS_SIM;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="913"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (uiEvent != BouncerUiEvent.UNKNOWN) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="940"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" .getSecurityView(mCurrentSecurityMode, mKeyguardSecurityCallback,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java"
+ line="1185"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" @Nullable private ActivityTransitionAnimator.Runner mRunner;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="3847"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mRunner.onAnimationCancelled();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="3856"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mRunner = mActivityTransitionAnimator.get().createRunner(mActivityLaunchController);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="3866"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mRunner.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="3867"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mKeyguardUpdateMonitor.onFaceAuthenticated(mSelectedUserInteractor.getSelectedUserId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/LatencyTester.java"
+ line="90"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mKeyguardUpdateMonitor.onFingerprintAuthenticated("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/LatencyTester.java"
+ line="93"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" return new LeakDetector("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/leak/LeakModule.java"
+ line="33"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" return new LeakDetector(null, null, null, dumpManager);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/leak/LeakModule.java"
+ line="39"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" instanceId = InstanceId.fakeInstanceId(-1),"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt"
+ line="132"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" instanceId = InstanceId.fakeInstanceId(-1),"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt"
+ line="145"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val instanceId: InstanceId = InstanceId.fakeInstanceId(-1),"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaData.kt"
+ line="92"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val instanceId: InstanceId = InstanceId.fakeInstanceId(-1),"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaData.kt"
+ line="92"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java"
+ line="150"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" setUpContentDescriptionForView(mSeekBar, device);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java"
+ line="251"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" setUpContentDescriptionForView(mSeekBar, device);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java"
+ line="288"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" setUpContentDescriptionForView(mSeekBar, device);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java"
+ line="297"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" listControllerFactory?.invoke(userHandle) ?: super.createListController(userHandle)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="156"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val currentListAdapter = mChooserMultiProfilePagerAdapter.activeListAdapter"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="159"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val currentListAdapter = mChooserMultiProfilePagerAdapter.activeListAdapter"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="159"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val currentListAdapter = mChooserMultiProfilePagerAdapter.activeListAdapter"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="159"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val userHandle = mMultiProfilePagerAdapter.activeListAdapter.userHandle"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="169"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val userHandle = mMultiProfilePagerAdapter.activeListAdapter.userHandle"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="169"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val userHandle = mMultiProfilePagerAdapter.activeListAdapter.userHandle"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="169"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val userHandle = mMultiProfilePagerAdapter.activeListAdapter.userHandle"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="169"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" val userHandle = mMultiProfilePagerAdapter.activeListAdapter.userHandle"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="169"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.personalListAdapter.notifyDataSetChanged()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="231"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" private fun hasWorkProfile() = mMultiProfilePagerAdapter.count > 1"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="290"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" for (i in 0 until mMultiProfilePagerAdapter.count) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="373"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorActivity.kt"
+ line="375"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" targetAppUserHandle = resolverListAdapter.userHandle,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionBlockerEmptyStateProvider.kt"
+ line="42"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" targetAppUserHandle = resolverListAdapter.userHandle,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionBlockerEmptyStateProvider.kt"
+ line="42"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (now.minus(it.second) <= RESUME_MEDIA_TIMEOUT) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/resume/MediaResumeListener.kt"
+ line="220"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mUiEventLogger.log(KeyButtonView.NavBarButtonEvent.NAVBAR_IME_SWITCHER_BUTTON_TAP);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java"
+ line="1500"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMobileSignalControllers.valueAt(i).mInflateSignalStrengths ="
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="1367"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" controller.setActivity(TelephonyManager.DATA_ACTIVITY_INOUT);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="1376"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" controller.setActivity(TelephonyManager.DATA_ACTIVITY_IN);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="1379"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" controller.setActivity(TelephonyManager.DATA_ACTIVITY_OUT);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="1382"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" controller.setActivity(TelephonyManager.DATA_ACTIVITY_NONE);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="1385"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" controller.setActivity(TelephonyManager.DATA_ACTIVITY_NONE);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="1389"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ranking.populate("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java"
+ line="276"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" proto.instanceId = n.getInstanceId().getId();"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLogger.java"
+ line="104"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mQsController.setExpanded(mSplitShadeEnabled);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java"
+ line="1367"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mQsController.isExpandImmediate() || mQsController.getExpanded()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java"
+ line="2613"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (!mQsController.getExpanded() || mQsController.isExpandImmediate()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java"
+ line="2648"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mView.setStatusBarState(mBarState);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java"
+ line="383"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mView.updateFooter();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java"
+ line="1559"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" getMessagingStyleMessages(notification);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java"
+ line="197"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" getMessagingStyleMessages(notification);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java"
+ line="258"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mPanelViewControllerLazy.get().cancelHeightAnimator();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java"
+ line="951"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mPanelViewControllerLazy.get().notifyExpandingStarted();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java"
+ line="1955"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" instanceId = sbn.instanceId?.id,"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationListInteractor.kt"
+ line="138"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" instanceId = sbn.instanceId?.id,"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationListInteractor.kt"
+ line="138"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mContext.release();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java"
+ line="530"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" (layoutParams as SmartReplyView.LayoutParams).mButtonType = SmartButtonType.ACTION"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt"
+ line="384"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" (layoutParams as SmartReplyView.LayoutParams).mButtonType = SmartButtonType.ACTION"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt"
+ line="384"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" (layoutParams as SmartReplyView.LayoutParams).mButtonType = SmartButtonType.REPLY"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt"
+ line="465"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" (layoutParams as SmartReplyView.LayoutParams).mButtonType = SmartButtonType.REPLY"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt"
+ line="465"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ((TextView) view).nullLayouts();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java"
+ line="221"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mCentralSurfaces.updateScrimController();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java"
+ line="976"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mCentralSurfaces.updateScrimController();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java"
+ line="1195"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" final int sessionId = (sessionIdProvider != null) ? sessionIdProvider.getId() : -1;"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java"
+ line="500"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" udfpsController?.playStartHaptic()"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt"
+ line="55"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" udfpsController.mOverlayParams?.scaleFactor?.let { view.setScaleFactor(it) }"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt"
+ line="558"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" .createRunner(occludeAnimationController)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerOcclusionManager.kt"
+ line="128"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" .onAnimationStart("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerOcclusionManager.kt"
+ line="129"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ExtraText"
+ message="Unexpected text found in layout file: ">""
+ errorLine1=" >"
+ errorLine2=" ~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/ongoing_privacy_chip.xml"
+ line="28"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ExtraText"
+ message="Unexpected text found in layout file: "->""
+ errorLine1="<merge xmlns:android="http://schemas.android.com/apk/res/android">->"
+ errorLine2=" ~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/qs_customize_panel_content.xml"
+ line="18"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="SpUsage"
+ message="Should use "`sp`" instead of "`dp`" for text sizes (`@dimen/dream_overlay_complication_clock_time_text_size` is defined as `86dp` in `values/dimens.xml`"
+ errorLine1=" android:textSize="@dimen/dream_overlay_complication_clock_time_text_size""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml"
+ line="30"
+ column="5"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/dimens.xml"
+ line="1862"
+ column="67"
+ message="This dp dimension is used as a text size"/>
+ </issue>
+
+ <issue
+ id="SpUsage"
+ message="Should use "`sp`" instead of "`dp`" for text sizes"
+ errorLine1=" <item name="android:textSize">36dp</item>"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land/styles.xml"
+ line="43"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="SpUsage"
+ message="Should use "`sp`" instead of "`dp`" for text sizes"
+ errorLine1=" <item name="android:textSize">36dp</item>"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/styles.xml"
+ line="255"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="SwitchIntDef"
+ message="Switch statement on an `int` with known associated constant missing case `BiometricUnlockController.MODE_DISMISS_BOUNCER`, `BiometricUnlockController.MODE_NONE`, `BiometricUnlockController.MODE_ONLY_WAKE`, `BiometricUnlockController.MODE_SHOW_BOUNCER`, `BiometricUnlockController.MODE_UNLOCK_COLLAPSING`"
+ errorLine1=" switch (mode) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="1522"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="SwitchIntDef"
+ message="Switch statement on an `int` with known associated constant missing case `ICON_NONE`"
+ errorLine1=" switch (icon) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/LockIconView.java"
+ line="214"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SwitchIntDef"
+ message="Switch statement on an `int` with known associated constant missing case `NotificationConversationInfo.ACTION_HOME`, `NotificationConversationInfo.ACTION_SETTINGS`, `NotificationConversationInfo.ACTION_SNOOZE`"
+ errorLine1=" switch (mAction) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java"
+ line="630"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="SwitchIntDef"
+ message="Switch statement on an `int` with known associated constant missing case `NotificationPriorityBucketKt.BUCKET_UNKNOWN`"
+ errorLine1=" switch(bucket) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationPanelLogger.java"
+ line="127"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="DiscouragedApi"
+ message="Should not restrict activity to fixed orientation. This may not be suitable for different form factors, causing the app to be letterboxed."
+ errorLine1=" <activity android:name=".DessertCase" android:exported="true" android:label="@string/dessert_case" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:launchMode="singleInstance" android:screenOrientation="locked" android:process=":sweetsweetdesserts" android:excludeFromRecents="true">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="517"
+ column="209"/>
+ </issue>
+
+ <issue
+ id="DiscouragedApi"
+ message="Activity should not be non-resizable. With this setting, apps cannot be used in multi-window or free form mode."
+ errorLine1=" <activity android:name=".notetask.shortcut.CreateNoteTaskShortcutActivity" android:enabled="false" android:exported="true" android:excludeFromRecents="true" android:resizeableActivity="false" android:theme="@android:style/Theme.NoDisplay" android:label="@string/note_task_button_label" android:icon="@drawable/ic_note_task_shortcut_widget">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="631"
+ column="166"/>
+ </issue>
+
+ <issue
+ id="Orientation"
+ message="No orientation specified, and the default is horizontal. This is a common source of bugs when children are added dynamically."
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_shelf.xml"
+ line="44"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="PxUsage"
+ message="Avoid using `"px"` as units; use `"dp"` instead"
+ errorLine1=" <dimen name="lock_icon_padding">48px</dimen>"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/dimens.xml"
+ line="647"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="PxUsage"
+ message="Avoid using `"px"` as units; use `"dp"` instead"
+ errorLine1=" <dimen name="global_actions_top_padding">330px</dimen>"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/dimens.xml"
+ line="1007"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="PxUsage"
+ message="Avoid using `"px"` as units; use `"dp"` instead"
+ errorLine1=" <dimen name="udfps_burn_in_offset_x">7px</dimen>"
+ errorLine2=" ~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/dimens.xml"
+ line="1061"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="PxUsage"
+ message="Avoid using `"px"` as units; use `"dp"` instead"
+ errorLine1=" <dimen name="udfps_burn_in_offset_y">20px</dimen>"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/dimens.xml"
+ line="1062"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="PxUsage"
+ message="Avoid using `"px"` as units; use `"dp"` instead"
+ errorLine1=" <dimen name="max_window_blur_radius">23px</dimen>"
+ errorLine2=" ~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/dimens.xml"
+ line="1178"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="PxUsage"
+ message="Avoid using `"px"` as units; use `"dp"` instead"
+ errorLine1=" <dimen name="physical_power_button_center_screen_location_y">620px</dimen>"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/dimens.xml"
+ line="1671"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="PxUsage"
+ message="Avoid using `"px"` as units; use `"dp"` instead"
+ errorLine1=" <dimen name="physical_fingerprint_sensor_center_screen_location_y">610px</dimen>"
+ errorLine2=" ~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/dimens.xml"
+ line="1684"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="SupportAnnotationUsage"
+ message="Did you mean `@get:VisibleForTesting`? Without `get:` this annotates the constructor parameter itself instead of the associated getter."
+ errorLine1=" @VisibleForTesting private val dialogProvider: DialogProvider"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogController.kt"
+ line="74"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="SupportAnnotationUsage"
+ message="This annotation does not apply for type String; expected int. Should `@com.android.systemui.shade.PanelState` be annotated with `@StringDef` instead?"
+ errorLine1="@PanelState"
+ errorLine2="~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt"
+ line="162"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("BiometricUnlockController#onBiometricDetected");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java"
+ line="407"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("BiometricUnlockController#onBiometricUnlocked");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java"
+ line="418"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("$TAG#smallClock.animations.doze")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt"
+ line="525"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("$TAG#largeClock.animations.doze")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt"
+ line="528"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may throw an exception"
+ errorLine1=" Trace.traceBegin(Trace.TRACE_TAG_APP,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingController.java"
+ line="128"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java"
+ line="179"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("DumpManager#dump()")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt"
+ line="100"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection(entry.name)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt"
+ line="480"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("DumpsysTableLogger#printTableData")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dump/DumpsysTableLogger.kt"
+ line="87"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("ExpNotRow#onChildCountChanged (summary)");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java"
+ line="2761"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("HybridGroupManager#bindFromNotification");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="102"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("ImageExporter_writeExif");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java"
+ line="436"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("WPMS.ImageWallpaper.CanvasEngine#loadWallpaper");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java"
+ line="339"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("KeyguardBlueprintViewBinder#applyBlueprint")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt"
+ line="96"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("KeyguardBlueprintViewBinder#refreshTransition")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt"
+ line="143"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("KeyGuardUpdateMonitor#handlerFingerPrintAuthenticated");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java"
+ line="955"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("KeyGuardUpdateMonitor#handlerFaceAuthenticated");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java"
+ line="1208"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("KeyguardViewMediator#handleKeyguardDone");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="2654"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("KeyguardViewMediator#handleShow");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="2780"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("KeyguardViewMediator#handleStartKeyguardExitAnimation");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="3011"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin(Trace.TRACE_TAG_APP, "MediaControlPanel#bindPlayer<" + key + ">");"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java"
+ line="543"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin(Trace.TRACE_TAG_APP,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java"
+ line="1435"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("NSSLC#updateResources");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java"
+ line="1331"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin(Trace.TRACE_TAG_APP, "Pluggable<" + mName + ">.invalidateList");"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/pluggable/Pluggable.java"
+ line="55"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("KeyguardBouncer#show")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt"
+ line="184"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("KeyguardBouncer#hide")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt"
+ line="215"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin(Trace.TRACE_TAG_APP, "QSTileViewImpl#onMeasure")"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt"
+ line="225"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("ResourceTrimmer#trimMemory")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt"
+ line="132"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may return early"
+ errorLine1=" Trace.beginSection("ScreenDecorations#onConfigurationChanged");"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java"
+ line="1071"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("ScreenOnCoordinator#onScreenTurningOn")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/mediator/ScreenOnCoordinator.kt"
+ line="57"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java"
+ line="380"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java"
+ line="406"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java"
+ line="429"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java"
+ line="440"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may return early"
+ errorLine1=" Trace.traceBegin("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java"
+ line="454"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("TableLogBuffer#logChange(string)")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt"
+ line="199"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("TableLogBuffer#logChange(boolean)")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt"
+ line="213"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("TableLogBuffer#logChange(int)")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt"
+ line="227"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("TableLogBuffer#saveEvictedValue")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt"
+ line="264"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("UdfpsDisplayMode.enable")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDisplayMode.kt"
+ line="54"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `beginSection()` call is not always closed with a matching `endSection()` because the code in between may throw an exception"
+ errorLine1=" Trace.beginSection("UdfpsDisplayMode.disable")"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDisplayMode.kt"
+ line="83"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may throw an exception"
+ errorLine1=" Trace.traceBegin("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt"
+ line="131"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnclosedTrace"
+ message="The `traceBegin()` call is not always closed with a matching `traceEnd()` because the code in between may throw an exception"
+ errorLine1=" Trace.traceBegin("
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt"
+ line="148"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="StringFormatInvalid"
+ message="Format string '`high_temp_alarm_notify_message`' is not a valid format string so it should not be passed to `String.format`"
+ errorLine1=" d.setMessage(mContext.getString(R.string.high_temp_alarm_notify_message, ""));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="554"
+ column="22"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="2344"
+ column="5"
+ message="This definition does not require arguments"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur/strings.xml"
+ line="258"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `notification_group_overflow_indicator`: conversion is `s`, received `int` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" R.string.notification_group_overflow_indicator, number);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java"
+ line="151"
+ column="65"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="620"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings.xml"
+ line="1131"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings.xml"
+ line="1131"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings.xml"
+ line="1136"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="StringFormatMatches"
+ message="Suspicious argument type for formatting argument #1 in `days_timestamp`: conversion is `s`, received `long` (argument #2 in method call) (Did you mean formatting character `d`, 'o' or `x`?)"
+ errorLine1=" durationSinceLastInteraction.toDays());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java"
+ line="1315"
+ column="21"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="2997"
+ column="5"
+ message="Conflicting argument declaration here"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""theyre" is a common misspelling; did you mean "they're"?"
+ errorLine1=" <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"To set up Fingerprint Unlock again, your current fingerprint images and models will be deleted.\n\nAfter theyre deleted, youll need to set up Fingerprint Unlock again to use your fingerprint to unlock your phone or verify its you."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="195"
+ column="191"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""theyre" is a common misspelling; did you mean "they're"?"
+ errorLine1=" <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"To set up Fingerprint Unlock again, your current fingerprint images and models will be deleted.\n\nAfter theyre deleted, youll need to set up Fingerprint Unlock again to use your fingerprint to unlock your phone or verify its you."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings.xml"
+ line="195"
+ column="318"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""theyre" is a common misspelling; did you mean "they're"?"
+ errorLine1=" <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"To set up Fingerprint Unlock again, your current fingerprint images and model will be deleted.\n\nAfter theyre deleted, youll need to set up Fingerprint Unlock again to use your fingerprint to unlock your phone or verify its you."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="196"
+ column="199"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""theyre" is a common misspelling; did you mean "they're"?"
+ errorLine1=" <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"To set up Fingerprint Unlock again, your current fingerprint images and model will be deleted.\n\nAfter theyre deleted, youll need to set up Fingerprint Unlock again to use your fingerprint to unlock your phone or verify its you."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings.xml"
+ line="196"
+ column="325"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="quick_settings_disclosure_management_named_vpn" msgid="4137564460025113168">"Denne enheten tilhører organisasjonen din og er koblet til internett via <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="520"
+ column="155"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="quick_settings_disclosure_named_management_named_vpn" msgid="2169227918166358741">"Denne enheten tilhører <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> og er koblet til internett via <xliff:g id="VPN_APP">%2$s</xliff:g>"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="521"
+ column="175"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="quick_settings_disclosure_management_vpns" msgid="929181757984262902">"Denne enheten tilhører organisasjonen din og er koblet til internett via VPN-er"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="524"
+ column="149"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="quick_settings_disclosure_named_management_vpns" msgid="3312645578322079185">"Denne enheten tilhører <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> og er koblet til internett via VPN-er"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="525"
+ column="170"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="quick_settings_disclosure_vpns" msgid="3586175303518266301">"Denne enheten er koblet til internett via VPN-er"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="530"
+ column="108"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="153393105176944100">"Jobbappene dine er koblet til internett via <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="531"
+ column="130"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"De personlige appene dine er koblet til internett via <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="532"
+ column="141"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Denne enheten er koblet til internett via <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="533"
+ column="113"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="monitoring_description_named_vpn" msgid="8220190039787149671">"Denne enheten er koblet til internett via <xliff:g id="VPN_APP">%1$s</xliff:g>. Nettverksaktiviteten din, inkludert e-poster og nettlesingsdata, er synlig for VPN-leverandøren."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="549"
+ column="110"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="monitoring_description_managed_device_named_vpn" msgid="7693648349547785255">"Denne enheten er koblet til internett via <xliff:g id="VPN_APP">%1$s</xliff:g>. Nettverksaktiviteten din, inkludert e-poster og nettlesingsdata, er synlig for IT-administratoren din."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="550"
+ column="125"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"Denne enheten er koblet til internett via <xliff:g id="VPN_APP_0">%1$s</xliff:g> og <xliff:g id="VPN_APP_1">%2$s</xliff:g>. Nettverksaktiviteten din, inkludert e-poster og nettlesingsdata, er synlig for IT-administratoren din."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="551"
+ column="115"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"Jobbappene dine er koblet til internett via <xliff:g id="VPN_APP">%1$s</xliff:g>. Nettverksaktiviteten din i jobbapper, inkludert e-poster og nettlesingsdata, er synlige for IT-administratoren og VPN-leverandøren din."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="552"
+ column="128"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"De personlige appene dine er koblet til internett via <xliff:g id="VPN_APP">%1$s</xliff:g>. Nettverksaktiviteten din, inkludert e-poster og nettlesingsdata, er synlig for VPN-leverandøren din."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="553"
+ column="139"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message="Did you mean "Pos!" instead of "Pos1"?"
+ errorLine1=" <string name="keyboard_key_home" msgid="3734400625170020657">"Pos1"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings.xml"
+ line="718"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message="Did you mean "Pos!" instead of "Pos1"?"
+ errorLine1=" <string name="keyboard_key_move_home" msgid="3496502501803911971">"Pos1"</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings.xml"
+ line="738"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="Typos"
+ message=""internett" is usually capitalized as "Internett""
+ errorLine1=" <string name="mobile_data_disable_message" msgid="8604966027899770415">"Du får ikke tilgang til data eller internett via <xliff:g id="CARRIER">%s</xliff:g>. Internett er bare tilgjengelig via Wifi."</string>"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings.xml"
+ line="925"
+ column="112"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""pip_settings_bounds" is translated here but not found in default locale"
+ errorLine1=" <string translatable="false" name="pip_settings_bounds">"778 756 1258 1026"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ldrtl/config.xml"
+ line="20"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding">Drag left to quickly switch apps</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ldrtl/strings.xml"
+ line="21"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Sleep links om programme vinnig te wissel"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"መተግበሪያዎችን በፍጥነት ለመቀየር ወደ ግራ ይጎትቱ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"اسحب لليمين للتبديل السريع بين التطبيقات."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"তাত্ক্ষণিকভাৱে আনটো এপ্ ব্যৱহাৰ কৰিবলৈ বাওঁফালে টানক"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Digər tətbiqə sürətlə keçmək üçün sola çəkin"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Prevucite ulevo da biste brzo promenili aplikacije"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Каб хутка пераключыцца паміж праграмамі, перацягніце ўлева"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Плъзнете наляво за бързо превключване между приложенията"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"একটি অ্যাপ ছেড়ে দ্রুত অন্য অ্যাপে যেতে বাঁ দিকে টেনে আনুন"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Prevucite ulijevo za brzo prebacivanje između aplikacija"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arrossega el dit cap a l\'esquerra per canviar ràpidament d\'aplicació"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Přetažením doleva rychle přepnete aplikace"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Træk til venstre for hurtigt at skifte app"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Zum schnellen Wechseln der Apps nach links ziehen"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Σύρετε αριστερά για γρήγορη εναλλαγή εφαρμογών"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Drag left to quickly switch apps"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Drag left to quickly switch apps"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Drag left to quickly switch apps"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Drag left to quickly switch apps"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Drag left to quickly switch apps"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arrastra el dedo hacia la izquierda para cambiar de aplicación rápidamente"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arrastra a la izquierda para cambiar de app rápidamente"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Rakenduste kiiresti vahetamiseks lohistage vasakule"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arrastatu ezkerrera aplikazioa azkar aldatzeko"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"برای سریع جابهجا شدن میان برنامهها، به چپ بکشید"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Vaihda sovellusta nopeasti vetämällä vasemmalle"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Déplacer vers la gauche pour changer rapidement d\'application"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Balayez l\'écran vers la gauche pour changer rapidement d\'application"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-rCA-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Para cambiar de aplicación, arrastra o dedo rapidamente á esquerda"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ઍપને ઝડપથી સ્વિચ કરવા માટે ડાબે ખેંચો"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ऐप्लिकेशन को तेज़ी से बदलने के लिए उसे बाईं ओर खींचें और छोड़ें"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Povucite ulijevo da biste brzo promijenili aplikaciju"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Húzza balra az ujját az alkalmazások közötti gyors váltáshoz"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Քաշեք ձախ՝ հավելվածների միջև անցնելու համար"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Tarik ke kiri untuk beralih ke aplikasi dengan cepat"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Dragðu til vinstri til að skipta hratt á milli forrita"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Trascina verso sinistra per cambiare velocemente app"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"יש לגרור שמאלה כדי לעבור במהירות בין אפליקציות"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"左にドラッグするとアプリを素早く切り替えることができます"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"აპების სწრაფად გადასართავად ჩავლებით გადაიტანეთ მარცხნივ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Қолданбалар арасында жылдам ауысу үшін солға қарай сүйреңіз"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"អូសទៅឆ្វេង ដើម្បីប្ដូរកម្មវិធីបានរហ័ស"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಿಸಲು ತ್ವರಿತವಾಗಿ ಎಡಕ್ಕೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"앱을 빠르게 전환하려면 왼쪽으로 드래그"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Колдонмолорду тез которуштуруу үчүн, солго сүйрөңүз"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ລາກໄປຊ້າຍເພື່ອສະຫຼັບແອັບຢ່າງວ່ອງໄວ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Vilkite į kairę, kad greitai perjungtumėte programas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Lai ātri pārslēgtu lietotnes, velciet pa kreisi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Повлечете налево за брзо префрлање меѓу апликациите"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ആപ്പുകൾ പെട്ടെന്ന് മാറ്റാൻ ഇടത്തോട്ട് വലിച്ചിടുക"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Аппыг хурдан сэлгэхийн тулд зүүн тийш чирэх"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"अॅप्स त्वरित स्विच करण्यासाठी डावीकडे ड्रॅग करा"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Seret ke kiri untuk beralih apl dengan pantas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"အက်ပ်များ အမြန်ပြောင်းရန် ဘယ်ဘက်သို့ ဖိဆွဲပါ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Dra til venstre for å bytte app raskt"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"एपहरू द्रुत गतिमा बदल्न बायाँतिर ड्र्याग गर्नुहोस्"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Sleep naar links om snel tussen apps te schakelen"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ଆପ୍ ମଧ୍ୟରେ ଶୀଘ୍ର ବଦଳ କରିବା ପାଇଁ ବାମକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ਐਪਾਂ ਵਿਚਾਲੇ ਤੇਜ਼ੀ ਨਾਲ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਖੱਬੇ ਪਾਸੇ ਵੱਲ ਘਸੀਟੋ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Przeciągnij w lewo, by szybko przełączyć aplikacje"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arraste para a esquerda para mudar rapidamente de app"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arraste para a esquerda para mudar rapidamente de app"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arrastar para a esquerda para mudar rapidamente de app"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Trage spre stânga pentru a comuta rapid între aplicații"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Перетащите влево, чтобы быстро переключиться между приложениями"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ඉක්මනින් යෙදුම් මාරු කිරීමට වමට අදින්න"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Presunutím doľava rýchlo prepnete aplikácie"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Povlecite v levo za hiter preklop med aplikacijami"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Zvarrit majtas për të ndërruar aplikacionet me shpejtësi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Превуците улево да бисте брзо променили апликације"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Tryck och dra åt vänster för att snabbt byta mellan appar"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Buruta kushoto ili ubadili kati ya programu haraka"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ஆப்ஸை வேகமாக மாற்ற, இடப்புறம் இழுக்கவும்"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"యాప్లను శీఘ్రంగా స్విచ్ చేయడానికి ఎడమ వైపునకు లాగండి"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"ลากไปทางซ้ายเพื่อสลับแอปอย่างรวดเร็ว"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"I-drag pakaliwa para mabilisang magpalipat-lipat ng app."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Uygulamaları hızlıca değiştirmek için sola sürükleyin"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Потягніть уліво, щоб швидко переходити між додатками"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"تیزی سے ایپس کو سوئچ کرنے کے لیے بائيں طرف گھسیٹیں"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Ilovalarni tezkor almashtirish uchun chapga torting"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Kéo sang trái để chuyển nhanh giữa các ứng dụng"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"向左拖动可快速切换应用"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"向左拖曳即可快速切換應用程式"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"向左拖曳即可快速切換應用程式"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""recents_quick_scrub_onboarding" is translated here but not found in default locale"
+ errorLine1=" <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Hudulela ngakwesokunxele ukuze ushintshe ngokushesha izinhlelo zokusebenza"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu-ldrtl/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Vee alles uit"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"ሁሉንም አጥራ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"محو الكل"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Выдаліць усё"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Изчистване"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Esborra-ho"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Smazat vše"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Ryd alt"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Löschen"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Εκκαθ. όλων"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Clear all"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Borrar todo"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Eliminar todas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Kust. kõik"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"پاک کردن همه موارد"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Tyhjennä kaikki"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Tout effacer"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"सभी साफ़ करें"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Obriši sve"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Össz.törl."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Hapus semua"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Cancella"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"נקה הכל"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"すべて消去"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"모두 지우기"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Išv. viską"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Notīr.visu"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Ksgkn smua"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Tøm alle"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Alles wissen"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Wyczyść"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Limpar tudo"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Limpar td"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Şterg. tot"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Очистить все"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Vymazať všetko"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Izbriši vse"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Обриши све"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Rensa alla"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Futa zote"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"ล้างทั้งหมด"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"I-clear"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Tümü temzl"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Очист. все"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Xóa tất cả"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"全部清除"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"全部清除"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""status_bar_clear_all_button" is translated here but not found in default locale"
+ errorLine1=" <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Sula konke"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu-large/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Skerm is nou in landskapsoriëntering gesluit."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"አሁን ማያበወርድ ገፅ አቀማመጥ ተሸንጉሯል።"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"تم قفل الشاشة الآن في الاتجاه الأفقي"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"تم قفل الشاشة الآن في الاتجاه العمودي."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"স্ক্ৰীনখন এতিয়া লেণ্ডস্কে\'প স্ক্ৰীনৰ দিশত লক কৰা অৱস্থাত আছে"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Hazırda ekran landşaft orientasiyasında kilidlənib."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ekran je sada zaključan u vertikalnom položaju."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Цяпер экран заблакаваны ў альбомнай арыентацыі."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Екранът е заключен в хоризонтална ориентация."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Екранът е заключен във вертикална ориентация."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"এখন ল্যান্ডস্কেপ সজ্জাতে স্ক্রিন লক করা হয়েছে৷"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ekran je sada zaključan u vodoravnom prikazu."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ara la pantalla està bloquejada en orientació horitzontal."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Ara la pantalla està bloquejada en orientació vertical."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Obrazovka je teď uzamčena v orientaci na šířku."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Skærmen er nu låst i liggende retning."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Bildschirm bleibt jetzt im Querformat."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ο προσανατολισμός της οθόνης κλειδώθηκε σε οριζόντια προβολή."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Screen is now locked in landscape orientation."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Screen is now locked in landscape orientation."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Screen is now locked in landscape orientation."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Screen is now locked in portrait orientation."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Screen is now locked in landscape orientation."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Screen is now locked in landscape orientation."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"La pantalla está ahora bloqueada en orientación horizontal."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"La pantalla está bloqueada en orientación paisaje."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ekraan on nüüd lukustatud horisontaalasendisse."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Pantaila horizontalki blokeatuta dago."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"صفحه اکنون در حالت افقی قفل است."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"صفحه اکنون در جهت عمودی قفل است."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ruutu on nyt lukittu vaakasuuntaan."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Ruutu on nyt lukittu pystysuuntaan."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"L\'écran est désormais verrouillé en orientation paysage."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"L\'écran est désormais verrouillé au format paysage."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-rCA-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Agora a pantalla está bloqueada en orientación horizontal."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"સ્ક્રીન હવે લેન્ડસ્કેપ ઓરિએન્ટેશનમાં લૉક કરેલ છે."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"स्क्रीन अभी लैंडस्केप दिशा में लॉक है."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Zaslona je sada zaključan u pejzažnoj orijentaciji."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Zaslona je sada zaključan u portretnoj orijentaciji."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"A képernyő zárolva van fekvő tájolásban."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"A képernyő zárolva van álló tájolásban."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Էկրանն այժմ կողպված է հորիզոնական դիրքավորման մեջ:"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Sekarang layar dikunci dalam orientasi lanskap."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Sekarang layar dikunci dalam orientasi potret."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Skjárinn er nú læstur á langsniði."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Lo schermo è bloccato in orientamento orizzontale."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"המסך נעול כעת לרוחב."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"המסך נעול כעת לאורך"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"画面を横向きにロックしました。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ეკრანი ამჟამად დაბლოკილია თარაზულ ორიენტაციაში"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Экран қазір ландшафт бағытына бекітілген."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ឥឡូវអេក្រង់ជាប់សោក្នុងទិសផ្ដេក។"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ಪರದೆಯು ಇದೀಗ ಲ್ಯಾಂಡ್ಸ್ಕೇಪ್ ಒರಿಯಂಟೇಶನ್ನಲ್ಲಿ ಲಾಕ್ ಆಗಿದೆ."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"화면이 현재 가로 방향으로 잠겨 있습니다."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Экран азыр туурасынан кулпуланган."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked">Screen is now locked in landscape orientation.</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ໜ້າຈໍຕອນນີ້ຖືກລັອກໄວ້ໃນແບບລວງນອນ."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Dabar ekranas užrakintas horizontalioje pozicijoje."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Dabar ekranas užrakintas vertikalioje pozicijoje."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ekrāns tagad ir bloķēts ainavas orientācijā."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Ekrāns tagad ir bloķēts portreta orientācijā."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Сега екранот е заклучен во ориентација на пејзаж."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ലാൻഡ്സ്കേപ്പ് ഓറിയന്റേഷനിൽ സ്ക്രീൻ ലോക്കുചെയ്തു."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Дэлгэц хэвтээ чиглэлд түгжигдсэн."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"स्क्रीन आता लॅंडस्केप ओरिएंटेशनमध्ये लॉक केली आहे."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Skrin kini dikunci dalam orientasi landskap."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ဖန်သားပြင် အနေအထားက အလျားလိုက်အဖြစ် ပုံသေ လုပ်ထားပါသည်။"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Skjermen er nå låst i liggende retning."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"स्क्रिन अहिले ल्यान्डस्केप अवस्थामा बन्द छ।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Het scherm is nu vergrendeld in liggende stand."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଅବସ୍ଥାରେ ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ଲକ୍ ଅଛି।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ਸਕ੍ਰੀਨ ਹੁਣ ਲੈਂਡਸਕੇਪ ਅਨੁਕੂਲਨ ਵਿੱਚ ਲਾਕ ਕੀਤੀ ਗਈ ਹੈ।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ekran jest teraz zablokowany w orientacji poziomej"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"A tela está bloqueada na orientação cenário."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"A tela está bloqueada na orientação cenário."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"O ecrã está agora bloqueado na orientação horizontal."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ecranul este acum blocat în orientarea de tip peisaj."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Ecranul este acum blocat în orientarea de tip portret."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Выбрана только альбомная ориентация экрана."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"තිරය දැන් තිරස් දිශානතිය අගුළු දමා ඇත."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Obrazovka je teraz uzamknutá v orientácii na šírku."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Obrazovka je teraz uzamknutá v orientácii na výšku."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Zaslon je zaklenjen v ležeči usmerjenosti."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Zaslon je zaklenjen v pokončni usmerjenosti."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ekrani është kyçur tani në orientimin horizontal."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Екран је сада закључан у вертикалном положају."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Екран је сада закључан у хоризонталном положају."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Bildskärmens riktning är nu låst i liggande format."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Skrini imefungwa sasa katika uelekezo wa mandhari."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"தற்போது திரை நிலைபரப்பு திசையமைப்பில் பூட்டப்பட்டுள்ளது."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"స్క్రీన్ ఇప్పుడు ల్యాండ్స్కేప్ దృగ్విన్యాసంలో లాక్ చేయబడింది."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"ขณะนี้หน้าจอถูกล็อกในแนวนอน"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"ขณะนี้หน้าจอถูกล็อกการวางแนวในแนวตั้ง"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Naka-lock na ngayon ang screen at nasa pahigang oryentasyon."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Naka-lock na ngayon ang screen at nasa patayong orientation."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ekran şimdi yatay yönde kilitlendi."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Екран зараз заблоковано в альбомній орієнтації."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Екран зараз заблоковано в книжковій орієнтації."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"اسکرین اب لینڈ اسکیپ سمت بندی میں مقفل ہے۔"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Ekran hozir albom joylashuvi bo‘yicha qulflanadi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Màn hình hiện bị khóa theo hướng ngang."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="1716565836190665743">"Màn hình hiện bị khóa theo hướng dọc."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi-port/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"屏幕已锁定为横向浏览模式。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"螢幕現已鎖定為橫向模式"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"螢幕現已鎖定為橫向模式"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""toast_rotation_locked" is translated here but not found in default locale"
+ errorLine1=" <string name="toast_rotation_locked" msgid="4914046305911646988">"Isikrini okwamanje sivaliwe ekujikelezeni okumile."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu-land/strings.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Kennisgewings af"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"ማሳወቂያዎች ጠፍተዋል"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"إيقاف التنبيهات"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Паведамленні адключаныя"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Известията са изключени"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notificacions desactivades"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Oznámení jsou vypnuta"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Meddelelser: fra"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Benachrichtigungen aus"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Ειδοποιήσεις ανενεργές"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notifications off"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notificaciones desactivadas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notificaciones desactivadas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Teatised väljas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"اعلان ها خاموش"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Ilmoitukset pois käytöstä"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notifications désactivées"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"सूचनाएं बंद"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Obavijesti isključene"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Értesítések kikapcsolva"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Pemberitahuan mati"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notifiche disattivate"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"מצב התראות כבוי"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"通知OFF"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"알림 사용 안함"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Pranešimai išjungti"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Paziņojumi ir izslēgti."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Pemberitahuan dimatikan"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Varslinger er deaktivert"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Meldingen uit"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Powiadomienia wyłączone"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notificações desativadas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notificações desativadas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Notificările sunt dezactivate"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Уведомления отключены"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Upozornenia sú vypnuté"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Obvestila so izklopljena"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Обавештења су искључена"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Meddelanden inaktiverade"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Arifa imezimwa"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"การแจ้งเตือนปิดอยู่"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Naka-off ang mga notification"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Bildirimler kapalı"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Сповіщення вимкнено"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Tắt thông báo"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"通知功能已停用"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"關閉通知"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_title" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_title" msgid="1860117696034775851">"Izaziso zivaliwe"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu-large/strings.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Tik hier om kennisgewings weer aan te skakel."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"ማሳወቂያን መልሶ ለማብራ እዚህ ሁለቴ ንካ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"انقر هنا لإعادة تشغيل التنبيهات."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Націсніце тут, каб зноў уключыць апавяшчэнні."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Докоснете тук, за да включите отново известията."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Pica aquí per tornar a activar les notificacions."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Chcete-li oznámení znovu zapnout, klepněte sem."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Tryk her for at slå meddelelser til igen."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Tippen Sie hier, um die Benachrichtigungen wieder zu aktivieren."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Πατήστε εδώ για να ενεργοποιήσετε ξανά τις ειδοποιήσεις."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Tap here to turn notifications back on."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Toca aquí para volver a activar las notificaciones."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Toca aquí para volver a activar las notificaciones."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Teatiste uuesti sisselülitamiseks koputage siia."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"برای روشن کردن مجدد اعلان ها، اینجا را ضربه بزنید."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Ota ilmoitukset uudelleen käyttöön napauttamalla tätä."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Appuyez ici pour réactiver les notifications."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"सूचनाओं को पुन: चालू करने के लिए यहां टैप करें."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Dotaknite ovdje da biste ponovo uključili obavijesti."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Itt érintse meg az értesítések bekapcsolásához."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Ketuk di sini untuk menghidupkan pemberitahuan lagi."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Tocca qui per riattivare le notifiche."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"הקש כאן כדי להפעיל מחדש את ההתראות."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"通知を再度ONにするにはここをタップします。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"알림을 다시 사용하려면 여기를 터치하세요."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Jei norite įjungti pranešimus, palieskite čia."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Pieskarieties šeit, lai atkal ieslēgtu paziņojumus."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Ketik di sini untuk menghidupkan kembali pemberitahuan."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Trykk her for å aktivere varslinger på nytt."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Tik hier om meldingen weer in te schakelen."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Dotknij tutaj, aby z powrotem włączyć powiadomienia."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Toque aqui para ativar as notificações novamente."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Toque aqui para voltar a ativar as notificações."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Apăsaţi aici pentru a reactiva notificările."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Нажмите здесь, чтобы снова включить уведомления."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Klepnutím sem upozornenia znova povolíte."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Tapnite tukaj, da spet vklopite obvestila."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Додирните овде да бисте поново укључили обавештења."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Knacka lätt här om du vill aktivera meddelanden igen."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Gonga hapa ili kuwasha tena arifa."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"แตะที่นี่เพื่อเปิดการแจ้งเตือนอีกครั้ง"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Mag-tap dito upang i-on muli ang mga notification."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Bildirimleri tekrar açmak için buraya hafifçe vurun."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Торкніться тут, щоб знову ввімкнути сповіщення."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Chạm vào đây để bật lại thông báo."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"点按此处可重新启用通知功能。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"輕按這裡即可重新開啟通知。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""notifications_off_text" is translated here but not found in default locale"
+ errorLine1=" <string name="notifications_off_text" msgid="1439152806320786912">"Thepha lana ukuvula futhi izaziso."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu-large/strings.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"እንግዳ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ضيف"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"অতিথি"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Qonaq"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gost"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Госць"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Гост"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"অতিথি"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gost"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Convidat"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Host"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gæst"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gast"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Επισκέπτης"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Invitado"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Invitado"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Külaline"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gonbidatua"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"مهمان"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Vieras"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Invité"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-rCA/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Invité"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Convidado"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"અતિથિ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"मेहमान"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gost"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Vendég"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Հյուր"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Tamu"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gestur"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Ospite"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"אורח"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ゲスト"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"სტუმარი"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Қонақ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ភ្ញៀវ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ಅತಿಥಿ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"게스트"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Конок"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ແຂກ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Svečias"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Viesis"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Гостин"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"അതിഥി"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Зочин"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"अतिथी"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Tetamu"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ဧည့်သည်"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gjest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"अतिथि"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gast"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ଅତିଥି"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ਮਹਿਮਾਨ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gość"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Visitante"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Convidado"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Visitante"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Invitat"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Гость"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"අමුත්තා"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Hosť"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gost"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"I ftuar"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Гост"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Gäst"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Mgeni"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"விருந்தினர்"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"అతిథి"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"ผู้มาเยือน"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Bisita"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Misafir"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Гість"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"مہمان"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Mehmon"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Khách"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"访客"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"訪客"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"訪客"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_guest" is translated here but not found in default locale"
+ errorLine1=" <string name="car_guest" msgid="3738772168718508650">"Isivakashi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings_car.xml"
+ line="22"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"እንግዳ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ضيف"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"অতিথি"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Qonaq"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gost"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Госць"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Гост"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"অতিথি"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gost"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Convidat"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Host"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gæst"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gast"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Επισκέπτης"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Invitado"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Invitado"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Külaline"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gonbidatua"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"مهمان"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Vieras"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Invité"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-rCA/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Invité"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Convidado"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"અતિથિ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"मेहमान मोड"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gost"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Vendég"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Հյուր"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Tamu"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gestur"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Ospite"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"אורח"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ゲスト"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"სტუმარი"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Қонақ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ភ្ញៀវ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ಅತಿಥಿ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"게스트"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Конок"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ແຂກ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Svečias"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Viesis"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Гостин"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"അതിഥി"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Зочин"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"अतिथी"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Tetamu"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ဧည့်သည်"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gjest"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"अतिथि"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gast"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ଅତିଥି"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ਮਹਿਮਾਨ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gość"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Visitante"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Convidado"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Visitante"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Invitat"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Гость"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"අමුත්තා"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Hosť"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gost"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"I ftuar"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Гост"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Gäst"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Mgeni"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"விருந்தினர்"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"అతిథి"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"ผู้มาเยือน"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Bisita"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Misafir"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Гість"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"مہمان"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Mehmon"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Khách"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"访客"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"訪客"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"訪客"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""start_guest_session" is translated here but not found in default locale"
+ errorLine1=" <string name="start_guest_session" msgid="7055742120180595689">"Isivakashi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings_car.xml"
+ line="23"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Voeg gebruiker by"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ተጠቃሚ አክል"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"إضافة المستخدم"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ব্যৱহাৰকাৰী যোগ কৰক"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"İstifadəçi əlavə edin"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Dodaj korisnika"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Дадаць карыстальніка"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Добавяне на потребител"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ব্যবহারকারীকে যুক্ত করুন"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Dodaj korisnika"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Afegeix un usuari"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Přidat uživatele"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Tilføj bruger"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Nutzer hinzufügen"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Προσθήκη χρήστη"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Add User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Add User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Add User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Add User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Add User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Agregar usuario"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Añadir usuario"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Kasutaja lisamine"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Gehitu erabiltzaile bat"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"افزودن کاربر"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Lisää käyttäjä"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Ajouter un utilisateur"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-rCA/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Ajouter un utilisateur"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Engadir usuario"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"વપરાશકર્તા ઉમેરો"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"उपयोगकर्ता जोड़ें"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Dodajte korisnika"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Felhasználó hozzáadása"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Ավելացնել օգտատեր"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Tambahkan Pengguna"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Bæta notanda við"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Aggiungi utente"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"הוספת משתמש"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ユーザーを追加"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"მომხმარებლის დამატება"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Пайдаланушыны енгізу"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"បញ្ចូលអ្នកប្រើប្រាស់"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ಬಳಕೆದಾರ ಸೇರಿಸು"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"사용자 추가"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Колдонуучу кошуу"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ເພີ່ມຜູ້ໃຊ້"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Pridėti naudotoją"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Lietotāja pievienošana"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Додај корисник"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ഉപയോക്താവിനെ ചേര്ക്കുക"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Хэрэглэгч нэмэх"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"वापरकर्ता जोडा"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Tambah Pengguna"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"အသုံးပြုသူ ထည့်ရန်"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Legg til bruker"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"प्रयोगकर्ता थप्नुहोस्"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Gebruiker toevoegen"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ନ୍ତୁ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Dodaj użytkownika"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Adicionar usuário"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Adicionar utilizador"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Adicionar usuário"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Adăugați un utilizator"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Добавить пользователя"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"පරිශීලක එක් කරන්න"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Pridať používateľa"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Dodaj uporabnika"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Shto përdorues"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Додај корисника"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Lägg till användare"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Ongeza Mtumiaji"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"பயனரைச் சேர்க்கவும்"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"వినియోగదారును జోడించండి"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"เพิ่มผู้ใช้"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Magdagdag ng User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Kullanıcı Ekle"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Додати користувача"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"صارف شامل کریں"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Foydalanuvchi qo‘shish"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Thêm người dùng"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"添加用户"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"新增使用者"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"新增使用者"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_add_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_add_user" msgid="5245196248349230898">"Engeza umsebenzisi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings_car.xml"
+ line="24"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nuwe gebruiker"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"አዲስ ተጠቃሚ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"مستخدم جديد"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"নতুন ব্যৱহাৰকাৰী"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Yeni İstifadəçi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Novi korisnik"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Новы карыстальнік"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Нов потребител"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"নতুন ব্যবহারকারী"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Novi korisnik"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Usuari nou"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nový uživatel"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Ny bruger"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Neuer Nutzer"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Νέος χρήστης"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"New User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"New User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"New User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"New User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"New User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nuevo usuario"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nuevo usuario"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Uus kasutaja"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Erabiltzaile berria"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"کاربر جدید"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Uusi käyttäjä"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nouvel utilisateur"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-rCA/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nouvel utilisateur"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Novo usuario"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"નવા વપરાશકર્તા"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"नया उपयोगकर्ता"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Novi korisnik"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Új felhasználó"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Նոր օգտատեր"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Pengguna Baru"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nýr notandi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nuovo utente"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"משתמש חדש"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"新しいユーザー"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"ახალი მომხმარებელი"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Жаңа пайдаланушы"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"អ្នកប្រើប្រាស់ថ្មី"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"ಹೊಸ ಬಳಕೆದಾರ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"신규 사용자"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Жаңы колдонуучу"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"ຜູ້ໃຊ້ໃໝ່"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Naujas naudotojas"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Jauns lietotājs"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Нов корисник"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"പുതിയ ഉപയോക്താവ്"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Шинэ хэрэглэгч"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"नवीन वापरकर्ता"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Pengguna Baharu"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"အသုံးပြုသူ အသစ်"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Ny bruker"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"नयाँ प्रयोगकर्ता"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nieuwe gebruiker"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"ନୂଆ ୟୁଜର୍"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nowy użytkownik"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Novo usuário"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Novo utilizador"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Novo usuário"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Utilizator nou"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Новый пользователь"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"නව පරිශීලක"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nový používateľ"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Nov uporabnik"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Përdorues i ri"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Нови корисник"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Ny användare"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Mtumiaji Mpya"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"புதிய பயனர்"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"కొత్త వినియోగదారు"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"ผู้ใช้ใหม่"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Bagong User"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Yeni Kullanıcı"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Новий користувач"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"نیا صارف"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Yangi foydalanuvchi"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Người dùng mới"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"新用户"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"新使用者"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"新使用者"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""car_new_user" is translated here but not found in default locale"
+ errorLine1=" <string name="car_new_user" msgid="8142927244990323906">"Umsebenzisi omusha"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings_car.xml"
+ line="25"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሳቸውን ቦታ ማቀናበር አለባቸው።"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"عند إضافة مستخدم جديد، عليه إعداد مساحته."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"আপুনি কোনো নতুন ব্য়ৱহাৰকাৰীক যোগ কৰিলে তেখেতে নিজৰ বাবে খালী ঠাই ছেট আপ কৰিব লাগে।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Yeni istifadəçi əlavə etdiyinizdə həmin şəxs öz yerini təyin etməlidir."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kada dodate novog korisnika, ta osoba treba da podesi svoj prostor."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Калі вы дадаяце новага карыстальніка, яму трэба наладзіць свой профіль."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Когато добавите нов потребител, той трябва да настрои работното си пространство."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"আপনি কোনও নতুন ব্যবহারকারীকে যোগ করলে তাকে তার স্পেস সেট-আপ করে নিতে হবে।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Každý nově přidaný uživatel si musí nastavit vlastní prostor."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Når du tilføjer en ny bruger, skal vedkommende konfigurere sit område."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Wenn du einen neuen Nutzer hinzufügst, muss dieser seinen Bereich einrichten."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Όταν προσθέτετε έναν νέο χρήστη, αυτός ο χρήστης θα πρέπει να ρυθμίσει τον χώρο του."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Cuando agregues un usuario nuevo, esa persona deberá configurar su espacio."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Al añadir un nuevo usuario, este debe configurar su espacio."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Erabiltzaile bat gehitzen duzunean, bere eremua konfiguratu beharko du."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"وقتی کاربر جدیدی اضافه میکنید، آن فرد باید فضای خود را تنظیم کند."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kun lisäät uuden käyttäjän, hänen on määritettävä oman tilansa asetukset."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-rCA/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Cando engadas un usuario novo, este deberá configurar o seu espazo."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિએ તેમની સ્પેસ સેટ કરવાની જરૂર રહે છે."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो, उस व्यक्ति को अपनी जगह सेट करनी होती है."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját felületét."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Երբ դուք նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Þegar þú bætir nýjum notanda við þarf viðkomandi að setja upp sitt eigið svæði."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Il nuovo utente, una volta aggiunto, dovrà configurare il proprio spazio."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את המרחב שלו."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Енгізілген жаңа пайдаланушы өз профилін реттеуі керек."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"នៅពេលដែលអ្នកបញ្ចូលអ្នកប្រើប្រាស់ថ្មី បុគ្គលនោះត្រូវតែរៀបចំទំហំផ្ទុករបស់គេ។"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"ನೀವು ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Жаңы колдонуучу кошулганда, ал өзүнүн профилин жөндөп алышы керек."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ບຸກຄົນນັ້ນຈຳເປັນຕ້ອງຕັ້ງຄ່າພື້ນທີ່ຂອງເຂົາເຈົ້າ."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo vietą."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kad pievienosiet jaunu lietotāju, viņam būs jāizveido savs profils."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Кога додавате нов корисник, тоа лице треба да го постави својот простор."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"നിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തി സ്വന്തം ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Таныг шинэ хэрэглэгч нэмэх үед тухайн хэрэглэгч хувийн орон зайгаа тохируулах шаардлагатай."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"तुम्ही नवीन वापरकर्त्याला जोडल्यावर, त्या व्यक्तीने त्यांचे स्थान सेट करणे आवश्यक असते."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Apabila anda menambahkan pengguna baharu, orang itu perlu menyediakan ruang mereka."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"အသုံးပြုသူအသစ် ထည့်သည့်အခါ ထိုသူသည် မိမိ၏ နေရာကို စီစဉ်သတ်မှတ်ရပါမည်။"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"तपाईंले नयाँ प्रयोगकर्ता थप्दा ती व्यक्तिले आफ्नो स्थान सेटअप गर्नु पर्छ।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Wanneer je een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"ଯେତେବେଳେ ଆପଣ ଜଣେ ନୂଆ ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ିବେ, ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ନିଜ ପାଇଁ ସ୍ପେସ୍ ସେଟଅପ୍ କରିବାକୁ ପଡ଼ିବ।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣੀ ਜਗ੍ਹਾ ਸੈੱਟਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Когда вы добавите пользователя, ему потребуется настроить профиль."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"ඔබ අලුත් පරිශීලකයෙක් එක් කරන විට, එම පුද්ගලයාට තමන්ගේ ඉඩ සකසා ගැනීමට අවශ්ය වේ."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Када додате новог корисника, та особа треба да подеси свој простор."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Ukiongeza mtumiaji mpya, ni lazima aweke kikundi chake."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"మీరు కొత్త వినియోగదారును జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Yeni kullanıcı eklediğinizde, bu kişinin kendi alanını ayarlaması gerekir."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Коли ви додаєте нового користувача, він має налаштувати свій профіль."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Yangi profil qo‘shilgach, uni sozlash lozim."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Khi bạn thêm một người dùng mới, người đó cần thiết lập không gian của họ."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"当您添加新用户时,该用户必须设置自己的空间。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"新增的使用者需要自行設定個人空間。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"新增的使用者需要自行設定個人空間。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_setup" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_setup" msgid="1791011504259527329">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha izikhala zakhe."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings_car.xml"
+ line="26"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Enige gebruiker kan programme vir al die ander gebruikers opdateer."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ማዘመን ይችላል።"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"يمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"সকলো ব্য়ৱহাৰকাৰীয়ে অইন ব্য়ৱহাৰকাৰীৰ বাবে এপসমূহ আপডেট কৰিব পাৰে।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"İstənilən istifadəçi digər bütün istifadəçilər üçün tətbiqləri güncəlləyə bilər."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Svaki korisnik može da ažurira aplikacije za sve ostale korisnike."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Кожны карыстальнік прылады можа абнаўляць праграмы для іншых уліковых запісаў."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Всеки потребител може да актуализира приложенията за всички останали потребители."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"যেকোনও ব্যবহারকারী বাকি সব ব্যবহারকারীর জন্য অ্যাপ আপডেট করতে পারবেন।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Svaki korisnik može ažurirati aplikacije za sve druge korisnike."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Qualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Každý uživatel může aktualizovat aplikace všech ostatních uživatelů."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Alle brugere kan opdatere apps for alle andre brugere."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Jeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Οποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Any user can update apps for all other users."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Any user can update apps for all other users."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Any user can update apps for all other users."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Any user can update apps for all other users."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Any user can update apps for all other users."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Cualquier usuario podrá actualizar las apps de otras personas."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Cualquier usuario puede actualizar las aplicaciones del resto de los usuarios."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Iga kasutaja saab rakendusi värskendada kõigi teiste kasutajate jaoks."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Edozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-eu/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"هر کاربری میتواند برنامهها را برای همه کاربران دیگر بهروزرسانی کند."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Kaikki käyttäjät voivat päivittää muiden käyttäjien sovelluksia."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Tout utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr-rCA/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"N\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Calquera usuario pode actualizar as aplicacións para o resto dos usuarios."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"કોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"कोई भी उपयोगकर्ता, बाकी सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन अपडेट कर सकते हैं."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Svaki korisnik može ažurirati aplikacije za ostale korisnike."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Bármely felhasználó frissítheti az alkalmazásokat az összes felhasználó számára."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Ցանկացած օգտատեր կարող է թարմացնել հավելվածները բոլոր մյուս հաշիվների համար:"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Setiap pengguna dapat mengupdate aplikasi untuk semua pengguna lain."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Allir notendur geta uppfært forrit fyrir alla aðra notendur."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Qualsiasi utente può aggiornare le app per tutti gli altri."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"כל משתמש יכול לעדכן אפליקציות לכל שאר המשתמשים."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"どのユーザーも他のすべてのユーザーに代わってアプリを更新できます。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Кез келген пайдаланушы қолданбаларды барлық басқа пайдаланушылар үшін жаңарта алады."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kk/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"អ្នកប្រើប្រាស់ណាក៏អាចដំឡើងជំនាន់កម្មវិធីសម្រាប់អ្នកប្រើប្រាស់ទាំងអស់ផ្សេងទៀតបានដែរ។"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"모든 사용자는 다른 사용자를 위해 앱을 업데이트할 수 있습니다."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Колдонмолорду бир колдонуучу калган бардык колдонуучулар үчүн да жаңырта алат."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ຜູ້ໃຊ້ຕ່າງໆສາມາດອັບເດດແອັບສຳລັບຜູ້ໃຊ້ອື່ນທັງໝົດໄດ້."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Bet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Ikviens lietotājs var atjaunināt lietotnes citu lietotāju vietā."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Секој корисник може да ажурира апликации за сите други корисници."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ഏതൊരു ഉപയോക്താവിനും മറ്റെല്ലാ ഉപയോക്താക്കൾക്കുമായി ആപ്പുകൾ അപ്ഡേറ്റ് ചെയ്യാനാവും."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Бусад бүх хэрэглэгчийн аппыг дурын хэрэглэгч шинэчлэх боломжтой."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"कोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अॅप्स अपडेट करू शकतो."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Mana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"အသုံးပြုသူအားလုံးအတွက် အက်ပ်များကို မည်သူမဆို အပ်ဒိတ်လုပ်နိုင်သည်။"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Alle brukere kan oppdatere apper for alle andre brukere."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nb/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"सबै प्रयोगकर्ताले अन्य प्रयोगकर्ताका अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Elke gebruiker kan apps updaten voor alle andere gebruikers."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ଯେକୌଣସି ୟୁଜର୍ ଅନ୍ୟ ସମସ୍ତ ୟୁଜରଙ୍କ ପାଇଁ ଆପ୍କୁ ଅପଡେଟ୍ କରିପାରିବେ।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਹੋਰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Każdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Qualquer usuário pode atualizar apps para os demais usuários"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Qualquer utilizador pode atualizar aplicações para todos os outros utilizadores."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Qualquer usuário pode atualizar apps para os demais usuários"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Orice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Любой пользователь устройства может обновлять приложения для всех аккаунтов."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"සියලුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යෙදුම් යාවත්කාලීන කළ හැක."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Akýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Vsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Çdo përdorues mund t\'i përditësojë aplikacionet për të gjithë përdoruesit e tjerë."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Сваки корисник може да ажурира апликације за све остале кориснике."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Alla användare kan uppdatera appar för andra användare."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Mtumiaji yeyote anaweza kusasisha programu za watumiaji wengine."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"எந்தவொரு பயனரும், மற்ற பயனர்களுக்காக ஆப்ஸைப் புதுப்பிக்கலாம்."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం యాప్లను అప్డేట్ చేయవచ్చు."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"ผู้ใช้ทุกคนจะอัปเดตแอปให้แก่ผู้ใช้คนอื่นๆ ได้"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Maaaring mag-update ng mga app ang sinumang user para sa lahat ng iba pang user."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Herhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Будь-який користувач може оновлювати додатки для решти людей."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"کوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ur/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Qurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uz/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Bất kỳ người dùng nào cũng có thể cập nhật ứng dụng cho tất cả những người dùng khác."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"任何用户均可为所有其他用户更新应用。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"任何使用者都可以為所有其他使用者更新應用程式。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"任何使用者皆可為所有其他使用者更新應用程式。"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ExtraTranslation"
+ message=""user_add_user_message_update" is translated here but not found in default locale"
+ errorLine1=" <string name="user_add_user_message_update" msgid="3383320289232716179">"Noma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza zabanye abasebenzisi."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings_car.xml"
+ line="27"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_top_boundary_pct" msgid="2520148599096479332">"Top boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="95"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_top_boundary_pct" msgid="2520148599096479332">"Top boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="95"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_top_boundary_pct" msgid="2520148599096479332">"Top boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="95"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_top_boundary_pct" msgid="2520148599096479332">"Top boundary <xliff:g id="PERCENT">%1$d</xliff:g> percent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="95"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_bottom_boundary_pct" msgid="3880821519814946478">"Bottom boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="96"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_bottom_boundary_pct" msgid="3880821519814946478">"Bottom boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="96"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_bottom_boundary_pct" msgid="3880821519814946478">"Bottom boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="96"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_bottom_boundary_pct" msgid="3880821519814946478">"Bottom boundary <xliff:g id="PERCENT">%1$d</xliff:g> percent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="96"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_left_boundary_pct" msgid="8502323556112287469">"Left boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="97"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_left_boundary_pct" msgid="8502323556112287469">"Left boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="97"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_left_boundary_pct" msgid="8502323556112287469">"Left boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="97"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_left_boundary_pct" msgid="8502323556112287469">"Left boundary <xliff:g id="PERCENT">%1$d</xliff:g> percent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="97"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"Right boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="98"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"Right boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="98"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"Right boundary <xliff:g id="PERCENT">%1$d</xliff:g> per cent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="98"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"Right boundary <xliff:g id="PERCENT">%1$d</xliff:g> percent"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="98"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("seconds"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"Too many incorrect attempts.\nTry again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="176"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("seconds"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"Too many incorrect attempts.\nTry again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="176"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("seconds"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"Too many incorrect attempts.\nTry again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="176"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("seconds"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"Too many incorrect attempts.\nTry again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="176"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="224"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="224"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="224"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> percent."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="224"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Battery <xliff:g id="PERCENTAGE">%1$d</xliff:g> per cent; <xliff:g id="TIME">%2$s</xliff:g>"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="225"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Battery <xliff:g id="PERCENTAGE">%1$d</xliff:g> per cent; <xliff:g id="TIME">%2$s</xliff:g>"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="225"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Battery <xliff:g id="PERCENTAGE">%1$d</xliff:g> per cent; <xliff:g id="TIME">%2$s</xliff:g>"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="225"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Battery <xliff:g id="PERCENTAGE">%1$d</xliff:g> percent, <xliff:g id="TIME">%2$s</xliff:g>"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="225"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="226"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="226"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="226"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Battery charging, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> percent."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="226"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Battery <xliff:g id="PERCENTAGE">%d</xliff:g> per cent; charging paused for battery protection."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="227"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Battery <xliff:g id="PERCENTAGE">%d</xliff:g> per cent; charging paused for battery protection."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="227"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Battery <xliff:g id="PERCENTAGE">%d</xliff:g> per cent; charging paused for battery protection."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="227"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Battery <xliff:g id="PERCENTAGE">%d</xliff:g> percent, charging paused for battery protection."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="227"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Battery <xliff:g id="PERCENTAGE">%1$d</xliff:g> per cent; <xliff:g id="TIME">%2$s</xliff:g>, charging paused for battery protection."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="228"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Battery <xliff:g id="PERCENTAGE">%1$d</xliff:g> per cent; <xliff:g id="TIME">%2$s</xliff:g>, charging paused for battery protection."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="228"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("per"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Battery <xliff:g id="PERCENTAGE">%1$d</xliff:g> per cent; <xliff:g id="TIME">%2$s</xliff:g>, charging paused for battery protection."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="228"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Battery <xliff:g id="PERCENTAGE">%1$d</xliff:g> percent, <xliff:g id="TIME">%2$s</xliff:g>, charging paused for battery protection."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="228"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_top_boundary_pct">Top boundary <xliff:g id="percent" example="50">%1$d</xliff:g> percent</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="251"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_bottom_boundary_pct">Bottom boundary <xliff:g id="percent" example="50">%1$d</xliff:g> percent</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="253"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_left_boundary_pct">Left boundary <xliff:g id="percent" example="50">%1$d</xliff:g> percent</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="255"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="screenshot_right_boundary_pct">Right boundary <xliff:g id="percent" example="50">%1$d</xliff:g> percent</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="257"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("seconds"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="biometric_dialog_credential_too_many_attempts">Too many incorrect attempts.\nTry again in <xliff:g id="number">%d</xliff:g> seconds.</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="429"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level">Battery <xliff:g id="number">%d</xliff:g> percent.</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="535"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_with_estimate">Battery <xliff:g id="percentage" example="95%">%1$d</xliff:g> percent, <xliff:g id="time" example="Until 3:15pm">%2$s</xliff:g></string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="538"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging">Battery charging, <xliff:g id="battery_percentage">%d</xliff:g> percent.</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="541"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused">Battery <xliff:g id="percentage" example="90%">%d</xliff:g> percent, charging paused for battery protection.</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="544"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("percent"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="accessibility_battery_level_charging_paused_with_estimate">Battery <xliff:g id="percentage" example="90%">%1$d</xliff:g> percent, <xliff:g id="time" example="Until 3:15pm">%2$s</xliff:g>, charging paused for battery protection.</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="547"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("tiles"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="drag_to_remove_disabled" msgid="933046987838658850">"You need at least <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> tiles"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="835"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("tiles"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="drag_to_remove_disabled" msgid="933046987838658850">"You need at least <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> tiles"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="840"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("tiles"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="drag_to_remove_disabled" msgid="933046987838658850">"You need at least <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> tiles"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="840"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("tiles"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="drag_to_remove_disabled" msgid="933046987838658850">"You need at least <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> tiles"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="840"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("devices"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> devices selected"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="1096"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("devices"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> devices selected"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="1101"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("devices"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> devices selected"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="1101"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("devices"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> devices selected"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="1101"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("characters"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_broadcast_edit_hint_no_more_than_max" msgid="3923625800037673922">"Use fewer than <xliff:g id="LENGTH">%1$d</xliff:g> characters"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="1122"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("characters"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_broadcast_edit_hint_no_more_than_max" msgid="3923625800037673922">"Use fewer than <xliff:g id="LENGTH">%1$d</xliff:g> characters"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="1127"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("characters"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_broadcast_edit_hint_no_more_than_max" msgid="3923625800037673922">"Use fewer than <xliff:g id="LENGTH">%1$d</xliff:g> characters"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="1127"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("characters"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_broadcast_edit_hint_no_more_than_max" msgid="3923625800037673922">"Use fewer than <xliff:g id="LENGTH">%1$d</xliff:g> characters"</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="1127"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("tiles"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="drag_to_remove_disabled">You need at least <xliff:g id="min_num_tiles" example="6">%1$d</xliff:g> tiles</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="2211"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("devices"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_dialog_multiple_devices"><xliff:g id="count" example="2">%1$d</xliff:g> devices selected</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="2922"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="PluralsCandidate"
+ message="Formatting %d followed by words ("characters"): This should probably be a plural rather than a string"
+ errorLine1=" <string name="media_output_broadcast_edit_hint_no_more_than_max">Use fewer than <xliff:g id="length" example="16">%1$d</xliff:g> characters</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="2977"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnsafeIntentLaunch"
+ message="This intent could be coming from an untrusted source. It is later launched by an unprotected component. You could either make the component protected; or sanitize this intent using androidx.core.content.IntentSanitizer."
+ errorLine1=" final IntentSender intentSender = intent.getParcelableExtra("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java"
+ line="231"
+ column="51"/>
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java"
+ line="239"
+ column="25"
+ message="The unsafe intent is launched here."/>
+ </issue>
+
+ <issue
+ id="ExportedContentProvider"
+ message="Exported content providers can provide access to potentially sensitive data"
+ errorLine1=" <provider android:name=".keyguard.KeyguardSliceProvider" android:authorities="com.android.systemui.keyguard" android:grantUriPermissions="true" android:exported="true">"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="678"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ExportedReceiver"
+ message="Exported receiver does not require permission"
+ errorLine1=" <receiver android:name=".statusbar.KeyboardShortcutsReceiver" android:exported="true">"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="681"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ExportedReceiver"
+ message="Exported receiver does not require permission"
+ errorLine1=" <receiver android:name=".media.dialog.MediaOutputDialogReceiver" android:exported="true">"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="688"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ExportedService"
+ message="Exported service does not require permission"
+ errorLine1=" <service android:name="SystemUIService" android:exported="true"/>"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="381"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ExportedService"
+ message="Exported service does not require permission"
+ errorLine1=" <service android:name=".wallet.controller.WalletContextualLocationsService" android:exported="true"/>"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="382"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ExportedService"
+ message="Exported service does not require permission"
+ errorLine1=" <service android:name=".keyguard.KeyguardService" android:exported="true"/>"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="557"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ExportedService"
+ message="Exported service does not require permission"
+ errorLine1=" <service android:name=".dreams.DreamOverlayService" android:enabled="false" android:exported="true" android:singleUser="true"/>"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="559"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ExpiredTargetSdkVersion"
+ message="Google Play requires that apps target API level 33 or higher."
+ errorLine1=" <uses-sdk android:minSdkVersion="VanillaIceCream" android:targetSdkVersion="16"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/frameworks/base/packages/SystemUI/SystemUI-core/android_common/f4f47f0509e030e335c57c427145a02a/manifest_fixer/AndroidManifest.xml"
+ line="21"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/AbstractLockscreenShadeTransitionController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/AdditionalStartable.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/BackupManagerProxy.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/BaseShortcutSection.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/battery/BatterySaverModule.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/BatteryStateSnapshot.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricOperationInfo.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequest.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BiometricUnlockInteractor.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerViewBinder.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=" * Copyright (C) 2022 The Android Open Source Project"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=" * Copyright (C) 2022 The Android Open Source Project"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastSender.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/dagger/CarrierTextManagerLog.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationComponent.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationComponent.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationModule.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/ComposeBouncerViewBinder.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractor.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPatternView.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPatternViewBinder.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/CredentialStatus.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialView.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/communal/ui/view/layout/sections/DefaultCommunalHubSection.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/DefaultTilesRepository.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepository.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/DisplayRotation.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/drawable/DrawableSize.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/EllipseOverlapDetectorParams.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/EnhancedEstimates.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/EnhancedEstimatesImpl.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/ExpandableOutlineViewBinder.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/ExpandableOutlineViewModel.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/ExpandableViewBinder.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/ExpandableViewModel.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/Extensions.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/dagger/FaceAuthLog.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromBouncerToGoneTransition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromGoneToQuickSettingsTransition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromGoneToShadeTransition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToBouncerTransition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToGoneTransition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToQuickSettingsTransition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToShadeTransition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromShadeToQuickSettingsTransition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/utils/GlobalWindowManager.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpModule.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardClockFrame.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardDisplayModule.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardLog.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardStatusAreaView.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardStatusContainer.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardUpdateMonitorLog.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/LargeScreenUtils.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/LaunchAnimationParameters.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/LockScreenShadeOverScroller.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeKeyguardTransitionController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeScrimTransitionController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=" * Copyright (C) 2022 The Android Open Source Project"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaDataUtils.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorResultHandler.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/flags/NotOccludedCondition.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationClickNotifier.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInteractionTracker.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationMemoryMeter.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationMemoryViewWalker.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationPriorityBucket.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/broadcast/PendingRemovalStore.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PlaceHolderDrawable.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/ProtoDumpable.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/dagger/QSComponent.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSDisableFlagsLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/QSPipelineFlagsRepository.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSRestoreLog.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/dagger/QSScopeModule.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredRepository.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSSquishinessController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSUtils.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QuickTileLayout.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/ReferenceExt.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/RemainingAttempts.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/model/RestoreData.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractor.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/rotationlock/RotationLockModule.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/SafeMarqueeTextView.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/domain/interactor/SelectedUserInteractor.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/SelfTrackingLifetimeExtender.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseDialog.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScroller.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScroller.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHideIconsForBouncerManager.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTransitionAnimatorController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowModule.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLogger.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TilesSettingConverter.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/unfold/UnfoldHapticsPlayer.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/unfold/UnfoldKeyguardVisibilityListener.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepository.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/utils/UserRestrictionChecker.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/ui/dialog/UserSwitchDialog.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProvider.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/shared/model/WakefulnessModel.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */"
+ errorLine1=""
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/WindowMetricsProvider.kt"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="MissingApacheLicenseDetector"
+ message="License header is missing
Please add the following copyright and license header to the beginning of the file:

/*
 * 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.
 */">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java"
+ line="2"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" Paint pt = new Paint();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/DessertCaseView.java"
+ line="491"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" final Rect check = new Rect();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/DessertCaseView.java"
+ line="496"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" mOuterCircle = new Path();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/scroll/MagnifierView.java"
+ line="114"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" mInnerCircle = new Path();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/scroll/MagnifierView.java"
+ line="116"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" Rect scrimRect = new Rect(0, 0, getWidth(), getHeight() / 2);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/scroll/MagnifierView.java"
+ line="143"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw operations: Use `Canvas.getClipBounds(Rect)` instead of `Canvas.getClipBounds()` which allocates a temporary `Rect`"
+ errorLine1=" val bounds = canvas.clipBounds"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaContainerView.kt"
+ line="63"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" mBarTransitions.setBackgroundFrame(new Rect(0, frameHeight - height, w, h));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java"
+ line="1001"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" Paint paint = new Paint();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java"
+ line="200"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" Paint pt = new Paint();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java"
+ line="151"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" SmartSuggestionMeasures accumulatedMeasures = new SmartSuggestionMeasures("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java"
+ line="240"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" List<View> smartSuggestions = new ArrayList<>(smartActions);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java"
+ line="252"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" List<View> coveredSuggestions = new ArrayList<>();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java"
+ line="254"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" Paint paint = new Paint();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java"
+ line="141"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="DrawAllocation"
+ message="Avoid object allocations during draw/layout operations (preallocate and reuse instead)"
+ errorLine1=" animationViewController?.onSensorRectUpdated(RectF(sensorRect))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt"
+ line="84"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="WakelockTimeout"
+ message="Provide a timeout when requesting a wakelock with `PowerManager.Wakelock.acquire(long timeout)`. This will ensure the OS will cleanup any wakelocks that last longer than you intend, and will save your user's battery."
+ errorLine1=" mWakeLock.acquire();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java"
+ line="395"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WakelockTimeout"
+ message="Provide a timeout when requesting a wakelock with `PowerManager.Wakelock.acquire(long timeout)`. This will ensure the OS will cleanup any wakelocks that last longer than you intend, and will save your user's battery."
+ errorLine1=" pmWakeLock.acquire()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/wakelock/ClientTrackingWakeLock.kt"
+ line="41"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WakelockTimeout"
+ message="Provide a timeout when requesting a wakelock with `PowerManager.Wakelock.acquire(long timeout)`. This will ensure the OS will cleanup any wakelocks that last longer than you intend, and will save your user's battery."
+ errorLine1=" mShowKeyguardWakeLock.acquire();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="2395"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="WakelockTimeout"
+ message="Provide a timeout when requesting a wakelock with `PowerManager.Wakelock.acquire(long timeout)`. This will ensure the OS will cleanup any wakelocks that last longer than you intend, and will save your user's battery."
+ errorLine1=" mWakeLock.acquire();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java"
+ line="516"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="WakelockTimeout"
+ message="Provide a timeout when requesting a wakelock with `PowerManager.Wakelock.acquire(long timeout)`. This will ensure the OS will cleanup any wakelocks that last longer than you intend, and will save your user's battery."
+ errorLine1=" inner.acquire();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java"
+ line="134"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls bindService"
+ errorLine1=" mContext.bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java"
+ line="179"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls unbindService"
+ errorLine1=" mContext.unbindService(mConnection);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java"
+ line="208"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls bindServiceAsUser"
+ errorLine1=" bound = context"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt"
+ line="175"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls unbindService"
+ errorLine1=" context.unbindService(serviceConnection)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt"
+ line="210"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls bindServiceAsUser"
+ errorLine1=" bindResult = mContext.bindServiceAsUser(mServiceIntent, this, mFlags,"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/service/ObservableServiceConnection.java"
+ line="159"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls unbindService"
+ errorLine1=" mContext.unbindService(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/service/ObservableServiceConnection.java"
+ line="164"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls unbindService"
+ errorLine1=" mContext.unbindService(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/service/ObservableServiceConnection.java"
+ line="234"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls bindServiceAsUser"
+ errorLine1=" mBound = mContext.bindServiceAsUser(mQuickStepIntent,"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java"
+ line="828"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls unbindService"
+ errorLine1=" mContext.unbindService(mOverviewServiceConnection);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java"
+ line="887"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls bindServiceAsUser"
+ errorLine1=" return mContext.bindServiceAsUser(mIntent, this, flags, mUser);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java"
+ line="254"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls bindServiceAsUser"
+ errorLine1=" return mContext.bindServiceAsUser(mIntent, this,"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java"
+ line="256"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcastAsUser()` should be replaced with `BroadcastSender.sendBroadcastAsUser()`"
+ errorLine1=" sendBroadcastAsUser(intent, UserHandle.SYSTEM, PERMISSION_SELF)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt"
+ line="103"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" context.sendBroadcast(mTestIntent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java"
+ line="315"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" getContext().sendBroadcast(intent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java"
+ line="171"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" getContext().sendBroadcast(intent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java"
+ line="180"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" getContext().sendBroadcast(intent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java"
+ line="184"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" getContext().sendBroadcast(intent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java"
+ line="189"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" getContext().sendBroadcast(intent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java"
+ line="195"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" getContext().sendBroadcast(intent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java"
+ line="199"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcastAsUser()` should be replaced with `BroadcastSender.sendBroadcastAsUser()`"
+ errorLine1=" mContext.sendBroadcastAsUser(intent, UserHandle.ALL);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java"
+ line="2207"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcastAsUser()` should be replaced with `BroadcastSender.sendBroadcastAsUser()`"
+ errorLine1=" mContext.sendBroadcastAsUser(USER_PRESENT_INTENT,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="2688"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" context.sendBroadcast(intent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/widget/PeopleBackupHelper.java"
+ line="505"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" getContext().sendBroadcast(intent);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java"
+ line="199"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" sendBroadcast(intent, PERMISSION_SELF);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java"
+ line="255"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcastAsUser()` should be replaced with `BroadcastSender.sendBroadcastAsUser()`"
+ errorLine1=" context.sendBroadcastAsUser(intent, mUserId);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java"
+ line="157"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt"
+ line="83"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" mContext.sendBroadcast(new Intent(TunerService.ACTION_CLEAR));"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java"
+ line="317"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="BroadcastSentViaContext"
+ message="`Context.sendBroadcast()` should be replaced with `BroadcastSender.sendBroadcast()`"
+ errorLine1=" sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingActivity.java"
+ line="179"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt"
+ line="131"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java"
+ line="77"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java"
+ line="116"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" mAdapter.notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java"
+ line="840"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java"
+ line="299"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java"
+ line="69"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java"
+ line="475"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java"
+ line="488"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java"
+ line="224"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java"
+ line="275"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java"
+ line="484"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java"
+ line="505"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java"
+ line="513"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumePanelSlicesAdapter.java"
+ line="89"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardCarousel.java"
+ line="433"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" registerReceiver(mBroadcastReceiver, mIntentFilter, PERMISSION_SELF, null,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsActivity.java"
+ line="136"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver(mBroadcastReceiver, filter, Context.RECEIVER_EXPORTED_UNAUDITED);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java"
+ line="807"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" Intent intent = mContext.registerReceiver("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java"
+ line="160"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mBroadcastReceiver, intentFilter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java"
+ line="177"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" Intent i = getContext().registerReceiver(null,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/CarrierTextManager.java"
+ line="379"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mBannerActionBroadcastReceiver, internalFilter, PERMISSION_SELF,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="929"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt"
+ line="233"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver(mReceiver, filter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/CsdWarningDialog.java"
+ line="132"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mReceiver, filter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java"
+ line="125"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mReceiver, filter, null, null,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsClassicDebug.java"
+ line="146"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mReceiver,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/ImmersiveModeConfirmation.java"
+ line="469"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_DISABLE_ESIM),"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardEsimArea.java"
+ line="98"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" getContext().registerReceiver(mIntentReceiver, filter, null /* permission*/,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java"
+ line="401"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver(new BroadcastReceiver() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java"
+ line="145"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mDelayedLockBroadcastReceiver, delayedActionFilter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java"
+ line="1524"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver(appChangeReceiver, uninstallFilter)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt"
+ line="349"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver(appChangeReceiver, uninstallFilter)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt"
+ line="288"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" getContext().registerReceiver(mNotificationActionReceiver, intentFilter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java"
+ line="631"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, overlayFilter, null, null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java"
+ line="119"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mBaseBroadcastReceiver, internalFilter, PERMISSION_SELF, null,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java"
+ line="432"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mLauncherStateChangedReceiver, filter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java"
+ line="663"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mReceiver, filter, Context.RECEIVER_EXPORTED);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/service/PackageObserver.java"
+ line="91"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mBaseBroadcastReceiver, perAppFilter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java"
+ line="243"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mBaseBroadcastReceiver, bootComplete);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java"
+ line="247"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" getContext().registerReceiver(mReceiver, filter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java"
+ line="64"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" getContext().registerReceiver(mReceiver, filter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java"
+ line="66"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiverAsUser(this, UserHandle.ALL, filter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java"
+ line="827"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" Intent intent = mContext.registerReceiver("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java"
+ line="297"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mPermControllerChangeReceiver, PKG_CHANGE_INTENT_FILTER);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SafetyController.java"
+ line="81"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver(mReceiver, filter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/SafetyWarningDialog.java"
+ line="66"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver(this, filter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java"
+ line="142"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" getContext().registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, filter, null, null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java"
+ line="78"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiverAsUser(mChallengeReceiver, UserHandle.ALL,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java"
+ line="103"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiverAsUser("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/stylus/StylusUsiPowerUI.kt"
+ line="79"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiverForAllUsers("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java"
+ line="229"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" registerReceiver(mCloseSystemDialogs, new IntentFilter(ACTION_CLOSE_SYSTEM_DIALOGS),"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java"
+ line="130"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiverAsUser("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java"
+ line="439"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiverAsUser(mUninstallReceiver, userTracker.getUserHandle(), filter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java"
+ line="100"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiver(mBroadcastReceiver, filter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java"
+ line="774"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" activity.registerReceiver(this, filter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDisconnectedReceiver.java"
+ line="40"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" activity.registerReceiver(this, filter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDisconnectedReceiver.java"
+ line="48"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiverAsUser("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt"
+ line="134"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiverAsUser(mProfileReceiver, UserHandle.ALL, profileFilter,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java"
+ line="78"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiverForAllUsers(this, filter, null, backgroundHandler)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt"
+ line="148"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" registerReceiver(mWifiChangeReceiver, filter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingActivity.java"
+ line="177"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" registerReceiver(mWifiChangeReceiver, filter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingSecondaryUserActivity.java"
+ line="98"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" mContext.registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java"
+ line="402"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<Int>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/assist/data/repository/AssistRepository.kt"
+ line="29"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val mutableIsExpanded = MutableSharedFlow<Boolean>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt"
+ line="78"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _onAuthenticationResult = MutableSharedFlow<Boolean>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt"
+ line="129"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow(extraBufferCapacity = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt"
+ line="81"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow(extraBufferCapacity = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt"
+ line="86"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _onIncorrectBouncerInput = MutableSharedFlow<Unit>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt"
+ line="64"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _onImeHiddenByUser = MutableSharedFlow<Unit>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt"
+ line="84"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val resetToDefault = MutableSharedFlow<Unit>(replay = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt"
+ line="107"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.WhileSubscribed(), replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/panel/component/captioning/domain/CaptioningAvailabilityCriteria.kt"
+ line="48"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/CarrierConfigRepository.kt"
+ line="93"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.WhileSubscribed(), replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/data/repository/ColorCorrectionRepository.kt"
+ line="69"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.WhileSubscribed(), replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/data/repository/ColorInversionRepository.kt"
+ line="69"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _appWidgetIdToRemove = MutableSharedFlow<Int>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHost.kt"
+ line="45"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn("
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt"
+ line="142"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow(extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt"
+ line="165"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn("
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt"
+ line="236"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope = applicationScope, started = SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalTutorialRepository.kt"
+ line="94"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(coroutineScope, SharingStarted.Eagerly, replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/panel/domain/interactor/ComponentsInteractor.kt"
+ line="67"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/repository/ConnectivityRepository.kt"
+ line="157"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _validatedAttestation: MutableSharedFlow<ByteArray?> = MutableSharedFlow()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt"
+ line="92"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(tileScope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileDataInteractor.kt"
+ line="91"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<DefaultsRequest>("
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileDefaultsRepository.kt"
+ line="77"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(applicationScope, SharingStarted.WhileSubscribed(), replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileDefaultsRepository.kt"
+ line="93"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<Tile>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractor.kt"
+ line="55"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(tileScope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTilePackageUpdatesRepository.kt"
+ line="71"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<TileWithUser>(onBufferOverflow = BufferOverflow.DROP_OLDEST, replay = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileRepository.kt"
+ line="111"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" val mutableRefreshEvents = MutableSharedFlow<Unit>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileServiceInteractor.kt"
+ line="183"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" val demoModeFinishedEvent = MutableSharedFlow<Unit>(extraBufferCapacity = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt"
+ line="75"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" val mobileEvents = _mobileCommands.shareIn(scope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoModeMobileConnectionDataSource.kt"
+ line="56"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" val wifiEvents = _wifiCommands.shareIn(scope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/demo/DemoModeWifiDataSource.kt"
+ line="44"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt"
+ line="85"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val attemptEnterDeviceFromDeviceEntryIcon: MutableSharedFlow<Unit> = MutableSharedFlow()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntrySourceInteractor.kt"
+ line="54"
+ column="82"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow(extraBufferCapacity = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractor.kt"
+ line="62"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(bgApplicationScope, started = SharingStarted.WhileSubscribed(), replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt"
+ line="147"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(this, started = Lazily)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/HideNotificationsBinder.kt"
+ line="39"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<Long>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/domain/interactor/HomeControlsComponentInteractor.kt"
+ line="138"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(backgroundScope, SharingStarted.WhileSubscribed(), replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/InstalledTilesComponentRepository.kt"
+ line="84"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" val refreshTransition = MutableSharedFlow<Config>(extraBufferCapacity = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepository.kt"
+ line="59"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _keyguardAuthenticatedPrimaryAuth = MutableSharedFlow<Int>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/KeyguardBouncerRepository.kt"
+ line="178"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _userRequestedBouncerWhenAlreadyAuthenticated = MutableSharedFlow<Int>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/KeyguardBouncerRepository.kt"
+ line="183"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val unseenEntryAdded = MutableSharedFlow<NotificationEntry>(extraBufferCapacity = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt"
+ line="96"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val unseenEntryRemoved = MutableSharedFlow<NotificationEntry>(extraBufferCapacity = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt"
+ line="97"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _keyguardDone: MutableSharedFlow<KeyguardDone> = MutableSharedFlow()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt"
+ line="298"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" override val keyguardDoneAnimationsFinished: MutableSharedFlow<Unit> = MutableSharedFlow()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt"
+ line="304"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<Float>("
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt"
+ line="81"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.Eagerly)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt"
+ line="106"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<TransitionStep>("
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt"
+ line="149"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.Eagerly, replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt"
+ line="193"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.Eagerly, replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt"
+ line="207"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.Eagerly, replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt"
+ line="249"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<TransitionStep>("
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt"
+ line="117"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(applicationScope, started = SharingStarted.Eagerly, replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt"
+ line="130"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(coroutineScope, SharingStarted.Eagerly, replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt"
+ line="63"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(coroutineScope, SharingStarted.Eagerly, replay = 1)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt"
+ line="93"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<PackageChangeModel>(replay = 0, extraBufferCapacity = BUFFER_CAPACITY)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/common/data/repository/PackageUpdateMonitor.kt"
+ line="67"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _accessibilityHint = MutableSharedFlow<String>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt"
+ line="143"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<Int>("
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt"
+ line="179"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(scope, SharingStarted.Eagerly)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredRepository.kt"
+ line="123"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val userInputs: MutableSharedFlow<QSTileUserAction> = MutableSharedFlow()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt"
+ line="89"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val forceUpdates: MutableSharedFlow<Unit> = MutableSharedFlow()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt"
+ line="90"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn("
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt"
+ line="104"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(tileScope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt"
+ line="162"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn("
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt"
+ line="172"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(applicationScope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt"
+ line="150"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(applicationScope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt"
+ line="156"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn(applicationScope, SharingStarted.WhileSubscribed())"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt"
+ line="169"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _notificationStackChanged = MutableSharedFlow<Unit>(extraBufferCapacity = 1)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractor.kt"
+ line="57"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val _bouncerMessageChanged = MutableSharedFlow<String?>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractor.kt"
+ line="75"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val changes = MutableSharedFlow<Unit>()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/domain/interactor/SpatialAudioComponentInteractor.kt"
+ line="54"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn("
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/data/repository/UserA11yQsShortcutsRepository.kt"
+ line="56"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" private val changeEvents = MutableSharedFlow<ChangeAction>("
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepository.kt"
+ line="47"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<ChangeAction>(extraBufferCapacity = CHANGES_BUFFER_SIZE)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt"
+ line="54"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`shareIn()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" .shareIn("
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/panel/ui/viewmodel/VolumePanelViewModel.kt"
+ line="107"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow<Int>(extraBufferCapacity = QSSettingsRestoredRepository.BUFFER_CAPACITY)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/restoreprocessors/WorkTileRestoreProcessor.kt"
+ line="49"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SlowUserIdQuery"
+ message="Use `UserTracker.getUserId()` instead of `ActivityManager.getCurrentUser()`"
+ errorLine1=" mAudioManager.playSoundEffect(soundConstant, ActivityManager.getCurrentUser());"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java"
+ line="373"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="SlowUserIdQuery"
+ message="Use `UserTracker.getUserId()` instead of `ActivityManager.getCurrentUser()`"
+ errorLine1=" startActivityAsUser(intent, UserHandle.of(ActivityManager.getCurrentUser()));"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java"
+ line="373"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="SlowUserIdQuery"
+ message="Use `UserTracker.getUserId()` instead of `ActivityManager.getCurrentUser()`"
+ errorLine1=" int startingUser = ActivityManager.getCurrentUser();"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/settings/MultiUserUtilsModule.java"
+ line="70"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="SlowUserIdQuery"
+ message="Use `UserTracker.getUserId()` instead of `ActivityManager.getCurrentUser()`"
+ errorLine1=" ? UserHandle.of(ActivityManager.getCurrentUser()) : notificationUser;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java"
+ line="611"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="SlowUserIdQuery"
+ message="Use `UserTracker.getUserId()` instead of `ActivityManager.getCurrentUser()`"
+ errorLine1=" ActivityManager.getCurrentUser());"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java"
+ line="91"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="SlowUserIdQuery"
+ message="Use `UserTracker.getUserId()` instead of `ActivityManager.getCurrentUser()`"
+ errorLine1=" TextUtils.join(",", hideList), ActivityManager.getCurrentUser());"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java"
+ line="86"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="SlowUserIdQuery"
+ message="Use `UserTracker.getUserId()` instead of `ActivityManager.getCurrentUser()`"
+ errorLine1=" ActivityManager.getCurrentUser(),"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/stylus/StylusUsiPowerUI.kt"
+ line="236"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" getUserInfo("
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractor.kt"
+ line="173"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" manager.getUserInfo(lastSelectedNonGuestUserHandle)"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt"
+ line="149"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" mUserManager.getUserInfo(userId).isManagedProfile()"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java"
+ line="500"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" val userType = userManager.getUserInfo(userId).userType"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepositoryImpl.kt"
+ line="45"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" userManager.getUserInfo(it.taskInfo1.userId).toUserType(),"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt"
+ line="66"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" userManager.getUserInfo(it.taskInfo2!!.userId).toUserType(),"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt"
+ line="75"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" return mUserManager.getUserInfo(mCurrentUserId).isRestricted()"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java"
+ line="312"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" final UserInfo newUserInfo = mUserManager.getUserInfo(newUserId);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java"
+ line="386"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" Bitmap a = Bitmap.createBitmap(b.getWidth(), b.getHeight(), Bitmap.Config.ALPHA_8);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/DessertCaseView.java"
+ line="196"
+ column="83"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" ?: Bitmap.Config.ARGB_8888"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/drawable/DrawableSize.kt"
+ line="95"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" ?: Bitmap.Config.ARGB_8888"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/util/drawable/DrawableSize.kt"
+ line="95"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayDotImageView.java"
+ line="120"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowDragController.java"
+ line="182"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonDrawable.java"
+ line="329"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonDrawable.java"
+ line="357"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" shortcutKeyIconItemHeightWidth, Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java"
+ line="686"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java"
+ line="451"
+ column="92"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" : Bitmap.Config.RGB_565;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java"
+ line="452"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java"
+ line="355"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java"
+ line="359"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="Recycle"
+ message="This `TypedArray` should be recycled after use with `#recycle()`"
+ errorLine1=" TypedArray typedArray = context.obtainStyledAttributes("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java"
+ line="85"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="Recycle"
+ message="This `TypedArray` should be recycled after use with `#recycle()`"
+ errorLine1=" final TypedArray sa = mResources.obtainAttributes(mAttrs, R.styleable.Shortcut);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/ShortcutParser.java"
+ line="103"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `FrameLayout`: `layout_weight`"
+ errorLine1=" android:layout_weight="0""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/contextual.xml"
+ line="31"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `FrameLayout`: `layout_weight`"
+ errorLine1=" android:layout_weight="0""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/contextual.xml"
+ line="54"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param '`layout_weight`' (included from within a `FrameLayout` in `layout/controls_dialog.xml`)"
+ errorLine1=" android:layout_weight="1""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/controls_base_item.xml"
+ line="21"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="44"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignParentStart`"
+ errorLine1=" android:layout_alignParentStart="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="45"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="54"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignEnd`"
+ errorLine1=" android:layout_alignEnd="@id/pkg_icon""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="56"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_toEndOf`"
+ errorLine1=" android:layout_toEndOf="@id/pkg_icon">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="57"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param '`layout_weight`' (included from within a `FrameLayout` in `layout/contextual.xml`, included from within a `FrameLayout` in `layout/menu_ime.xml`)"
+ errorLine1=" android:layout_weight="0""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/ime_switcher.xml"
+ line="23"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="false""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="44"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignParentStart`"
+ errorLine1=" android:layout_alignParentStart="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="45"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="104"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignEnd`"
+ errorLine1=" android:layout_alignEnd="@id/conversation_icon""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="106"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_toEndOf`"
+ errorLine1=" android:layout_toEndOf="@id/conversation_icon">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="107"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="124"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="157"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="173"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignParentEnd`"
+ errorLine1=" android:layout_alignParentEnd="true" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="178"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_toEndOf`"
+ errorLine1=" android:layout_toEndOf="@id/silence_icon""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="353"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="43"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignParentStart`"
+ errorLine1=" android:layout_alignParentStart="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="44"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="53"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignEnd`"
+ errorLine1=" android:layout_alignEnd="@id/pkg_icon""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="55"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_toEndOf`"
+ errorLine1=" android:layout_toEndOf="@id/pkg_icon">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="56"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="82"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="100"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_toStartOf`"
+ errorLine1=" android:layout_toStartOf="@id/info""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="105"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="111"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignParentEnd`"
+ errorLine1=" android:layout_alignParentEnd="true" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="116"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_toEndOf`"
+ errorLine1=" android:layout_toEndOf="@id/silence_icon""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="301"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="42"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignParentStart`"
+ errorLine1=" android:layout_alignParentStart="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="43"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="52"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignEnd`"
+ errorLine1=" android:layout_alignEnd="@id/conversation_icon""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="54"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_toEndOf`"
+ errorLine1=" android:layout_toEndOf="@id/conversation_icon">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="55"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="67"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="83"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignParentEnd`"
+ errorLine1=" android:layout_alignParentEnd="true"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="88"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="124"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="131"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_above`"
+ errorLine1=" android:layout_above="@id/got_it_button">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml"
+ line="75"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml"
+ line="46"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml"
+ line="55"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerVertical`"
+ errorLine1=" android:layout_centerVertical="true""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml"
+ line="75"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ObsoleteSdkInt"
+ message="Unnecessary; SDK_INT is always >= 34"
+ errorLine1=" @RequiresApi(34)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java"
+ line="531"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="Do not place Android context classes in static fields (static reference to `SystemUIDialog` which has field `mContext` pointing to `Context`); this is a memory leak"
+ errorLine1=" var dialog: SystemUIDialog? = null"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt"
+ line="40"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This `AsyncTask` class should be static or leaks might occur (anonymous android.os.AsyncTask)"
+ errorLine1=" new AsyncTask<Icon, Void, Drawable>() {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java"
+ line="207"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="Do not place Android context classes in static fields (static reference to `KeyboardShortcutListSearch` which has field `mSearchEditText` pointing to `EditText`); this is a memory leak"
+ errorLine1=" @VisibleForTesting static KeyboardShortcutListSearch sInstance;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java"
+ line="100"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="Do not place Android context classes in static fields (static reference to `KeyboardShortcuts` which has field `mContext` pointing to `Context`); this is a memory leak"
+ errorLine1=" @VisibleForTesting static KeyboardShortcuts sInstance;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java"
+ line="83"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="Do not place Android context classes in static fields (static reference to `MediaOutputDialog` which has field `mContext` pointing to `Context`); this is a memory leak"
+ errorLine1=" var mediaOutputDialog: MediaOutputDialog? = null"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogManager.kt"
+ line="41"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This `AsyncTask` class should be static or leaks might occur (anonymous android.os.AsyncTask)"
+ errorLine1=" new AsyncTask<Void, Void, Void>() {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java"
+ line="742"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This field leaks a context object"
+ errorLine1=" private final Context mContext;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java"
+ line="1053"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This field leaks a context object"
+ errorLine1=" private ExpandableNotificationRow mRow;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java"
+ line="1062"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This field leaks a context object"
+ errorLine1=" private final Context mContext;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java"
+ line="62"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="Do not place Android context classes in static fields (static reference to `SystemUIInitializer` which has field `mContext` pointing to `Context`); this is a memory leak"
+ errorLine1=" // Must be static due to http://b/141008541."
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactoryBase.kt"
+ line="48"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This `AsyncTask` class should be static or leaks might occur (anonymous android.os.AsyncTask)"
+ errorLine1=" mUserInfoTask = new AsyncTask<Void, Void, UserInfoQueryResult>() {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java"
+ line="147"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UseCompoundDrawables"
+ message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_end_dialog.xml"
+ line="26"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UseCompoundDrawables"
+ message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="112"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="UseCompoundDrawables"
+ message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_initial_layout.xml"
+ line="36"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="UseCompoundDrawables"
+ message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_large_with_content.xml"
+ line="95"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (922 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M36.3,25.5c-0.4,-0.3,-1,-0.5,-1.5,-0.5c-0.1,0,-0.3,0,-0.4,0c-0.3,0,-0.5,0,-0.7,0.1c-0.6,0.1,-1.1,0.4,-1.5,0.8 c-0.8,0.6,-1.2,1.6,-1.2,2.7v3.5h-1.2V14c0,-1.4,-0.6,-2.7,-1.6,-3.6c-0.4,-0.4,-0.9,-0.8,-1.5,-1c-0.4,-0.1,-0.7,-0.2,-1.1,-0.3 C25.2,9,24.9,9,24.7,9s-0.5,0,-0.8,0.1c-0.4,0.1,-0.8,0.2,-1.1,0.3c-0.6,0.2,-1.1,0.6,-1.5,1c-1,0.9,-1.6,2.2,-1.6,3.6v10.3h-2.4v-4.5 c0,-1.2,-0.6,-2.2,-1.5,-2.8c-0.4,-0.3,-1,-0.5,-1.5,-0.6c-0.2,0,-0.3,-0.1,-0.5,-0.1c-0.2,0,-0.4,0,-0.6,0.1c-0.6,0.1,-1.1,0.3,-1.5,0.7 c-0.8,0.6,-1.4,1.6,-1.4,2.7v8c0,1.1,0.5,2.1,1.4,2.7c0.4,0.3,0.9,0.6,1.5,0.7c0.2,0,0.4,0.1,0.6,0.1h0.5h1.5h3.8V48 c0,1.4,0.6,2.7,1.6,3.6c0.4,0.4,0.9,0.8,1.5,1c0.4,0.1,0.7,0.2,1.1,0.3c0.2,0,0.5,0.1,0.8,0.1s0.5,0,0.8,-0.1 c0.4,-0.1,0.8,-0.2,1.1,-0.3c0.6,-0.2,1.1,-0.6,1.5,-1c1,-0.9,1.6,-2.2,1.6,-3.6v-9.1h1.2h1.2h1.5h0.7c0.1,0,0.3,0,0.4,0 c0.6,-0.1,1.1,-0.2,1.5,-0.5c0.9,-0.6,1.6,-1.7,1.6,-2.9v-7C37.9,27.2,37.3,26.1,36.3,25.5z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-nodpi/cactus1.xml"
+ line="22"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (983 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M19.400000,10.000000c-0.700000,-3.400000 -3.700000,-6.000000 -7.400000,-6.000000c-1.500000,0.000000 -2.900000,0.400000 -4.000000,1.200000l1.500000,1.500000C10.200000,6.200000 11.100000,6.000000 12.000000,6.000000c3.000000,0.000000 5.500000,2.500000 5.500000,5.500000L17.500000,12.000000L19.000000,12.000000c1.700000,0.000000 3.000000,1.300000 3.000000,3.000000c0.000000,1.100000 -0.600000,2.100000 -1.600000,2.600000l1.500000,1.500000c1.300000,-0.900000 2.100000,-2.400000 2.100000,-4.100000C24.000000,12.400000 21.900000,10.200000 19.400000,10.000000zM3.000000,5.300000L5.800000,8.000000C2.600000,8.200000 0.000000,10.800000 0.000000,14.000000c0.000000,3.300000 2.700000,6.000000 6.000000,6.000000l11.700000,0.000000l2.000000,2.000000l1.300000,-1.300000L4.300000,4.000000L3.000000,5.300000zM7.700000,10.000000l8.000000,8.000000L6.000000,18.000000c-2.200000,0.000000 -4.000000,-1.800000 -4.000000,-4.000000c0.000000,-2.200000 1.800000,-4.000000 4.000000,-4.000000L7.700000,10.000000z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-nodpi/cloud_off.xml"
+ line="22"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (983 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M19.400000,10.000000c-0.700000,-3.400000 -3.700000,-6.000000 -7.400000,-6.000000c-1.500000,0.000000 -2.900000,0.400000 -4.000000,1.200000l1.500000,1.500000C10.200000,6.200000 11.100000,6.000000 12.000000,6.000000c3.000000,0.000000 5.500000,2.500000 5.500000,5.500000L17.500000,12.000000L19.000000,12.000000c1.700000,0.000000 3.000000,1.300000 3.000000,3.000000c0.000000,1.100000 -0.600000,2.100000 -1.600000,2.600000l1.500000,1.500000c1.300000,-0.900000 2.100000,-2.400000 2.100000,-4.100000C24.000000,12.400000 21.900000,10.200000 19.400000,10.000000zM3.000000,5.300000L5.800000,8.000000C2.600000,8.200000 0.000000,10.800000 0.000000,14.000000c0.000000,3.300000 2.700000,6.000000 6.000000,6.000000l11.700000,0.000000l2.000000,2.000000l1.300000,-1.300000L4.300000,4.000000L3.000000,5.300000zM7.700000,10.000000l8.000000,8.000000L6.000000,18.000000c-2.200000,0.000000 -4.000000,-1.800000 -4.000000,-4.000000c0.000000,-2.200000 1.800000,-4.000000 4.000000,-4.000000L7.700000,10.000000z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/cloud_off.xml"
+ line="22"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (925 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M34.4,43.95Q31.55,43.95 29.45,42.4Q27.35,40.85 26.35,38.3Q25.35,35.75 24.375,34.325Q23.4,32.9 20.7,30.75Q17.4,28.1 15.95,25.1Q14.5,22.1 14.5,17.8Q14.5,11.8 18.3,7.975Q22.1,4.15 28.1,4.15Q34,4.15 37.875,7.825Q41.75,11.5 42,17.2H39Q38.75,12.8 35.725,9.975Q32.7,7.15 28.1,7.15Q23.6,7.15 20.55,10.225Q17.5,13.3 17.5,17.8Q17.5,21.4 18.9,24.025Q20.3,26.65 23.55,29.1Q25.5,30.55 26.675,32.25Q27.85,33.95 28.9,36.45Q29.75,38.55 31.125,39.75Q32.5,40.95 34.4,40.95Q36.15,40.95 37.425,39.75Q38.7,38.55 38.95,36.8H41.95Q41.7,39.8 39.55,41.875Q37.4,43.95 34.4,43.95ZM11.95,32.9Q9.1,29.75 7.55,25.825Q6,21.9 6,17.6Q6,13.35 7.475,9.375Q8.95,5.4 11.95,2.35L14.2,4.35Q11.6,7 10.3,10.425Q9,13.85 9,17.6Q9,21.3 10.325,24.725Q11.65,28.15 14.2,30.85ZM28.1,22.45Q26.15,22.45 24.8,21.1Q23.45,19.75 23.45,17.8Q23.45,15.85 24.8,14.45Q26.15,13.05 28.1,13.05Q30.05,13.05 31.45,14.45Q32.85,15.85 32.85,17.8Q32.85,19.75 31.45,21.1Q30.05,22.45 28.1,22.45Z"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/hearing.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1848 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M6.000000,18.000000c0.000000,0.600000 0.400000,1.000000 1.000000,1.000000l1.000000,0.000000l0.000000,3.500000C8.000000,23.299999 8.700000,24.000000 9.500000,24.000000c0.800000,0.000000 1.500000,-0.700000 1.500000,-1.500000L11.000000,19.000000l2.000000,0.000000l0.000000,3.500000c0.000000,0.800000 0.700000,1.500000 1.500000,1.500000c0.800000,0.000000 1.500000,-0.700000 1.500000,-1.500000L16.000000,19.000000l1.000000,0.000000c0.600000,0.000000 1.000000,-0.400000 1.000000,-1.000000L18.000000,8.000000L6.000000,8.000000L6.000000,18.000000zM3.500000,8.000000C2.700000,8.000000 2.000000,8.700000 2.000000,9.500000l0.000000,7.000000C2.000000,17.299999 2.700000,18.000000 3.500000,18.000000C4.300000,18.000000 5.000000,17.299999 5.000000,16.500000l0.000000,-7.000000C5.000000,8.700000 4.300000,8.000000 3.500000,8.000000zM20.500000,8.000000C19.700001,8.000000 19.000000,8.700000 19.000000,9.500000l0.000000,7.000000c0.000000,0.800000 0.700000,1.500000 1.500000,1.500000c0.800000,0.000000 1.500000,-0.700000 1.500000,-1.500000l0.000000,-7.000000C22.000000,8.700000 21.299999,8.000000 20.500000,8.000000zM15.500000,2.200000l1.300000,-1.300000c0.200000,-0.200000 0.200000,-0.500000 0.000000,-0.700000c-0.200000,-0.200000 -0.500000,-0.200000 -0.700000,0.000000l-1.500000,1.500000C13.900000,1.200000 13.000000,1.000000 12.000000,1.000000c-1.000000,0.000000 -1.900000,0.200000 -2.700000,0.600000L7.900000,0.100000C7.700000,0.000000 7.300000,0.000000 7.100000,0.100000C7.000000,0.300000 7.000000,0.700000 7.100000,0.900000l1.300000,1.300000C7.000000,3.300000 6.000000,5.000000 6.000000,7.000000l12.000000,0.000000C18.000000,5.000000 17.000000,3.200000 15.500000,2.200000zM10.000000,5.000000L9.000000,5.000000L9.000000,4.000000l1.000000,0.000000L10.000000,5.000000zM15.000000,5.000000l-1.000000,0.000000L14.000000,4.000000l1.000000,0.000000L15.000000,5.000000z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_android.xml"
+ line="22"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1121 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M23.9998,10.667C16.6398,10.667 10.6665,16.6403 10.6665,24.0003C10.6665,31.3603 16.6398,37.3337 23.9998,37.3337C31.3598,37.3337 37.3332,31.3603 37.3332,24.0003C37.3332,16.6403 31.3598,10.667 23.9998,10.667ZM17.4265,32.3737C17.9998,31.1737 21.4932,30.0003 23.9998,30.0003C26.5065,30.0003 30.0132,31.1737 30.5732,32.3737C28.7598,33.8137 26.4798,34.667 23.9998,34.667C21.5198,34.667 19.2398,33.8137 17.4265,32.3737ZM23.9998,27.3337C25.9465,27.3337 30.5732,28.1203 32.4798,30.4403C33.8398,28.6537 34.6665,26.427 34.6665,24.0003C34.6665,18.1203 29.8798,13.3337 23.9998,13.3337C18.1198,13.3337 13.3332,18.1203 13.3332,24.0003C13.3332,26.427 14.1598,28.6537 15.5198,30.4403C17.4265,28.1203 22.0532,27.3337 23.9998,27.3337ZM23.9998,16.0003C21.4132,16.0003 19.3332,18.0803 19.3332,20.667C19.3332,23.2537 21.4132,25.3337 23.9998,25.3337C26.5865,25.3337 28.6665,23.2537 28.6665,20.667C28.6665,18.0803 26.5865,16.0003 23.9998,16.0003ZM21.9998,20.667C21.9998,21.7737 22.8932,22.667 23.9998,22.667C25.1065,22.667 25.9998,21.7737 25.9998,20.667C25.9998,19.5603 25.1065,18.667 23.9998,18.667C22.8932,18.667 21.9998,19.5603 21.9998,20.667Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_avatar_guest_user.xml"
+ line="23"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1055 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData=" M66.67 -27.59 C66.67,-27.59 66.67,-66.67 66.67,-66.67 C66.67,-66.67 27.59,-66.67 27.59,-66.67 C27.59,-66.67 0,-94.25 0,-94.25 C0,-94.25 -27.58,-66.67 -27.58,-66.67 C-27.58,-66.67 -66.66,-66.67 -66.66,-66.67 C-66.66,-66.67 -66.66,-27.59 -66.66,-27.59 C-66.66,-27.59 -94.25,0 -94.25,0 C-94.25,0 -66.66,27.58 -66.66,27.58 C-66.66,27.58 -66.66,66.66 -66.66,66.66 C-66.66,66.66 -27.58,66.66 -27.58,66.66 C-27.58,66.66 0,94.25 0,94.25 C0,94.25 27.59,66.66 27.59,66.66 C27.59,66.66 66.67,66.66 66.67,66.66 C66.67,66.66 66.67,27.58 66.67,27.58 C66.67,27.58 94.25,0 94.25,0 C94.25,0 66.67,-27.59 66.67,-27.59c M50 20.66 C50,20.66 50,50 50,50 C50,50 20.67,50 20.67,50 C20.67,50 0,70.66 0,70.66 C0,70.66 -20.66,50 -20.66,50 C-20.66,50 -50,50 -50,50 C-50,50 -50,20.66 -50,20.66 C-50,20.66 -70.66,0 -70.66,0 C-70.66,0 -50,-20.67 -50,-20.67 C-50,-20.67 -50,-50 -50,-50 C-50,-50 -20.66,-50 -20.66,-50 C-20.66,-50 0,-70.67 0,-70.67 C0,-70.67 20.67,-50 20.67,-50 C20.67,-50 50,-50 50,-50 C50,-50 50,-20.67 50,-20.67 C50,-20.67 70.67,0 70.67,0 C70.67,0 50,20.66 50,20.66c " />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_brightness_full.xml"
+ line="19"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1055 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData=" M66.67 -27.59 C66.67,-27.59 66.67,-66.67 66.67,-66.67 C66.67,-66.67 27.59,-66.67 27.59,-66.67 C27.59,-66.67 0,-94.25 0,-94.25 C0,-94.25 -27.58,-66.67 -27.58,-66.67 C-27.58,-66.67 -66.66,-66.67 -66.66,-66.67 C-66.66,-66.67 -66.66,-27.59 -66.66,-27.59 C-66.66,-27.59 -94.25,0 -94.25,0 C-94.25,0 -66.66,27.58 -66.66,27.58 C-66.66,27.58 -66.66,66.66 -66.66,66.66 C-66.66,66.66 -27.58,66.66 -27.58,66.66 C-27.58,66.66 0,94.25 0,94.25 C0,94.25 27.59,66.66 27.59,66.66 C27.59,66.66 66.67,66.66 66.67,66.66 C66.67,66.66 66.67,27.58 66.67,27.58 C66.67,27.58 94.25,0 94.25,0 C94.25,0 66.67,-27.59 66.67,-27.59c M50 20.66 C50,20.66 50,50 50,50 C50,50 20.67,50 20.67,50 C20.67,50 0,70.66 0,70.66 C0,70.66 -20.66,50 -20.66,50 C-20.66,50 -50,50 -50,50 C-50,50 -50,20.66 -50,20.66 C-50,20.66 -70.66,0 -70.66,0 C-70.66,0 -50,-20.67 -50,-20.67 C-50,-20.67 -50,-50 -50,-50 C-50,-50 -20.66,-50 -20.66,-50 C-20.66,-50 0,-70.67 0,-70.67 C0,-70.67 20.67,-50 20.67,-50 C20.67,-50 50,-50 50,-50 C50,-50 50,-20.67 50,-20.67 C50,-20.67 70.67,0 70.67,0 C70.67,0 50,20.66 50,20.66c " />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_brightness_low.xml"
+ line="19"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1054 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M66.67 -27.59 C66.67,-27.59 66.67,-66.67 66.67,-66.67 C66.67,-66.67 27.59,-66.67 27.59,-66.67 C27.59,-66.67 0,-94.25 0,-94.25 C0,-94.25 -27.58,-66.67 -27.58,-66.67 C-27.58,-66.67 -66.66,-66.67 -66.66,-66.67 C-66.66,-66.67 -66.66,-27.59 -66.66,-27.59 C-66.66,-27.59 -94.25,0 -94.25,0 C-94.25,0 -66.66,27.58 -66.66,27.58 C-66.66,27.58 -66.66,66.66 -66.66,66.66 C-66.66,66.66 -27.58,66.66 -27.58,66.66 C-27.58,66.66 0,94.25 0,94.25 C0,94.25 27.59,66.66 27.59,66.66 C27.59,66.66 66.67,66.66 66.67,66.66 C66.67,66.66 66.67,27.58 66.67,27.58 C66.67,27.58 94.25,0 94.25,0 C94.25,0 66.67,-27.59 66.67,-27.59c M50 20.66 C50,20.66 50,50 50,50 C50,50 20.67,50 20.67,50 C20.67,50 0,70.66 0,70.66 C0,70.66 -20.66,50 -20.66,50 C-20.66,50 -50,50 -50,50 C-50,50 -50,20.66 -50,20.66 C-50,20.66 -70.66,0 -70.66,0 C-70.66,0 -50,-20.67 -50,-20.67 C-50,-20.67 -50,-50 -50,-50 C-50,-50 -20.66,-50 -20.66,-50 C-20.66,-50 0,-70.67 0,-70.67 C0,-70.67 20.67,-50 20.67,-50 C20.67,-50 50,-50 50,-50 C50,-50 50,-20.67 50,-20.67 C50,-20.67 70.67,0 70.67,0 C70.67,0 50,20.66 50,20.66c " />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_brightness_medium.xml"
+ line="19"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (831 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M12,16Q13.875,16 15.188,14.688Q16.5,13.375 16.5,11.5Q16.5,9.625 15.188,8.312Q13.875,7 12,7Q10.125,7 8.812,8.312Q7.5,9.625 7.5,11.5Q7.5,13.375 8.812,14.688Q10.125,16 12,16ZM12,14.2Q10.875,14.2 10.088,13.412Q9.3,12.625 9.3,11.5Q9.3,10.375 10.088,9.587Q10.875,8.8 12,8.8Q13.125,8.8 13.913,9.587Q14.7,10.375 14.7,11.5Q14.7,12.625 13.913,13.412Q13.125,14.2 12,14.2ZM12,19Q8.35,19 5.35,16.962Q2.35,14.925 1,11.5Q2.35,8.075 5.35,6.037Q8.35,4 12,4Q15.65,4 18.65,6.037Q21.65,8.075 23,11.5Q21.65,14.925 18.65,16.962Q15.65,19 12,19ZM12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5Q12,11.5 12,11.5ZM12,17Q14.825,17 17.188,15.512Q19.55,14.025 20.8,11.5Q19.55,8.975 17.188,7.487Q14.825,6 12,6Q9.175,6 6.812,7.487Q4.45,8.975 3.2,11.5Q4.45,14.025 6.812,15.512Q9.175,17 12,17Z"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_broadcast_code_eye.xml"
+ line="25"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1041 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M798,840Q673,840 551,785.5Q429,731 329,631Q229,531 174.5,409Q120,287 120,162Q120,144 132,132Q144,120 162,120L324,120Q338,120 349,129.5Q360,139 362,152L388,292Q390,308 387,319Q384,330 376,338L279,436Q299,473 326.5,507.5Q354,542 387,574Q418,605 452,631.5Q486,658 524,680L618,586Q627,577 641.5,572.5Q656,568 670,570L808,598Q822,602 831,612.5Q840,623 840,636L840,798Q840,816 828,828Q816,840 798,840ZM241,360L307,294Q307,294 307,294Q307,294 307,294L290,200Q290,200 290,200Q290,200 290,200L201,200Q201,200 201,200Q201,200 201,200Q206,241 215,281Q224,321 241,360ZM599,718Q638,735 678.5,745Q719,755 760,758Q760,758 760,758Q760,758 760,758L760,670Q760,670 760,670Q760,670 760,670L666,651Q666,651 666,651Q666,651 666,651L599,718ZM241,360Q241,360 241,360Q241,360 241,360Q241,360 241,360Q241,360 241,360L241,360Q241,360 241,360Q241,360 241,360L241,360Q241,360 241,360Q241,360 241,360L241,360ZM599,718L599,718Q599,718 599,718Q599,718 599,718L599,718Q599,718 599,718Q599,718 599,718L599,718Q599,718 599,718Q599,718 599,718Q599,718 599,718Q599,718 599,718Z"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_call.xml"
+ line="25"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (902 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M15,9.683V7C15,6.7348 14.8946,6.4804 14.7071,6.2929C14.5196,6.1054 14.2652,6 14,6H10C9.7348,6 9.4804,6.1054 9.2929,6.2929C9.1053,6.4804 9,6.7348 9,7V9.683C7.855,10.2245 6.8787,11.067 6.1756,12.1205C5.4725,13.174 5.0689,14.3988 5.0081,15.6639C4.9473,16.929 5.2315,18.1868 5.8304,19.3029C6.4292,20.4189 7.3202,21.3512 8.408,22H15.592C16.6798,21.3512 17.5707,20.4189 18.1696,19.3029C18.7685,18.1868 19.0527,16.929 18.9919,15.6639C18.9311,14.3988 18.5275,13.174 17.8244,12.1205C17.1212,11.067 16.145,10.2245 15,9.683ZM14.989,20H9.011C8.3852,19.5381 7.877,18.9352 7.5276,18.2402C7.1783,17.5453 6.9975,16.7778 7,16C7.0041,15.0553 7.2746,14.131 7.7803,13.3331C8.286,12.5351 9.0065,11.896 9.859,11.489L11,10.946V8H13V10.946L14.141,11.489C14.9935,11.896 15.714,12.5351 16.2197,13.3331C16.7254,14.131 16.9959,15.0553 17,16C17.0025,16.7778 16.8217,17.5453 16.4723,18.2402C16.123,18.9352 15.6148,19.5381 14.989,20Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_air_freshener_off.xml"
+ line="41"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1852 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M18,2.01L6,2C5.7371,1.9991 5.4766,2.0502 5.2335,2.1504C4.9905,2.2506 4.7696,2.3979 4.5837,2.5838C4.3978,2.7696 4.2505,2.9905 4.1504,3.2335C4.0502,3.4766 3.9991,3.7371 4,4V20C3.9991,20.2629 4.0502,20.5234 4.1504,20.7665C4.2505,21.0096 4.3978,21.2304 4.5837,21.4163C4.7696,21.6022 4.9905,21.7494 5.2335,21.8496C5.4766,21.9498 5.7371,22.0009 6,22H18C18.2629,22.0009 18.5234,21.9498 18.7665,21.8496C19.0095,21.7494 19.2304,21.6022 19.4163,21.4163C19.6022,21.2304 19.7495,21.0096 19.8496,20.7665C19.9498,20.5234 20.0009,20.2629 20,20V4C20.0007,3.7376 19.9493,3.4778 19.8489,3.2354C19.7485,2.993 19.6011,2.7728 19.4151,2.5878C19.2291,2.4027 19.0083,2.2564 18.7654,2.1572C18.5225,2.0581 18.2624,2.008 18,2.01ZM11,5C11.1978,5 11.3911,5.0587 11.5556,5.1686C11.72,5.2785 11.8482,5.4346 11.9239,5.6173C11.9996,5.8 12.0194,6.0011 11.9808,6.1951C11.9422,6.3891 11.847,6.5673 11.7071,6.7072C11.5673,6.847 11.3891,6.9423 11.1951,6.9809C11.0011,7.0194 10.8,6.9995 10.6173,6.9238C10.4346,6.8481 10.2784,6.72 10.1685,6.5556C10.0586,6.3911 10,6.1978 10,6C10,5.7348 10.1054,5.4804 10.2929,5.2929C10.4804,5.1053 10.7348,5 11,5ZM7,6C7,5.8022 7.0587,5.6089 7.1685,5.4445C7.2784,5.28 7.4346,5.1519 7.6173,5.0762C7.8,5.0005 8.0011,4.9806 8.1951,5.0192C8.3891,5.0578 8.5673,5.153 8.7071,5.2929C8.847,5.4327 8.9422,5.611 8.9808,5.8049C9.0194,5.9989 8.9996,6.2 8.9239,6.3827C8.8482,6.5654 8.72,6.7215 8.5556,6.8314C8.3911,6.9413 8.1978,7 8,7C7.7348,7 7.4804,6.8947 7.2929,6.7072C7.1054,6.5196 7,6.2652 7,6ZM12,18C11.0032,18.008 10.0441,17.6198 9.3335,16.9207C8.623,16.2216 8.2192,15.2688 8.211,14.272C8.2109,13.7806 8.3092,13.2941 8.5,12.8412C8.6908,12.3883 8.9703,11.9782 9.322,11.635L12,9L14.678,11.635C15.0297,11.9782 15.3092,12.3883 15.5,12.8412C15.6908,13.2941 15.7891,13.7806 15.789,14.272C15.7808,15.2688 15.377,16.2216 14.6665,16.9207C13.9559,17.6198 12.9968,18.008 12,18Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_dishwasher_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (878 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M12,15C11.6044,15 11.2177,15.1174 10.8889,15.3372C10.56,15.5569 10.3036,15.8692 10.1522,16.2346C10.0009,16.6001 9.9613,17.0022 10.0384,17.3901C10.1156,17.7781 10.3061,18.1346 10.5858,18.4143C10.8655,18.694 11.2219,18.8845 11.6098,18.9617C11.9978,19.0388 12.3999,18.999 12.7654,18.8477C13.1308,18.6963 13.4432,18.44 13.6629,18.1111C13.8827,17.7822 14,17.3956 14,17C14,16.4696 13.7893,15.9608 13.4142,15.5857C13.0391,15.2106 12.5304,15 12,15ZM12,18C11.8022,18 11.6089,17.9414 11.4444,17.8315C11.28,17.7217 11.1518,17.5653 11.0761,17.3826C11.0004,17.1998 10.9806,16.9989 11.0192,16.8049C11.0578,16.611 11.153,16.4328 11.2929,16.293C11.4327,16.1531 11.6109,16.0579 11.8049,16.0193C11.9989,15.9807 12.2,16.0005 12.3827,16.0762C12.5654,16.1519 12.7216,16.2799 12.8315,16.4443C12.9413,16.6088 13,16.8022 13,17C13,17.2652 12.8946,17.5195 12.7071,17.707C12.5196,17.8946 12.2652,18 12,18Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_doorbell_off.xml"
+ line="26"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1266 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M17,2H7C6.4696,2 5.9609,2.2106 5.5858,2.5857C5.2107,2.9608 5,3.4696 5,4V20C5,20.5304 5.2107,21.0392 5.5858,21.4143C5.9609,21.7894 6.4696,22 7,22H17C17.5304,22 18.0391,21.7894 18.4142,21.4143C18.7893,21.0392 19,20.5304 19,20V4C19,3.4696 18.7893,2.9608 18.4142,2.5857C18.0391,2.2106 17.5304,2 17,2ZM12,19C11.6044,19 11.2178,18.8826 10.8889,18.6628C10.56,18.4431 10.3036,18.1308 10.1522,17.7654C10.0009,17.3999 9.9613,16.9978 10.0384,16.6099C10.1156,16.2219 10.3061,15.8654 10.5858,15.5857C10.8655,15.306 11.2219,15.1155 11.6098,15.0383C11.9978,14.9612 12.3999,15.001 12.7654,15.1523C13.1308,15.3037 13.4432,15.56 13.6629,15.8889C13.8827,16.2178 14,16.6044 14,17C14,17.5304 13.7893,18.0392 13.4142,18.4143C13.0391,18.7894 12.5304,19 12,19ZM11,12.5H13C13,12.7652 12.8946,13.0195 12.7071,13.207C12.5196,13.3946 12.2652,13.5 12,13.5C11.7348,13.5 11.4804,13.3946 11.2929,13.207C11.1054,13.0195 11,12.7652 11,12.5ZM16,12H8V11H9V8.6599C8.9488,7.9537 9.1455,7.2519 9.5562,6.675C9.9669,6.0982 10.5659,5.6827 11.25,5.5V5.25C11.25,5.0511 11.329,4.8604 11.4697,4.7197C11.6103,4.5791 11.8011,4.5 12,4.5C12.1989,4.5 12.3897,4.5791 12.5303,4.7197C12.671,4.8604 12.75,5.0511 12.75,5.25V5.5C13.4351,5.6809 14.0352,6.0961 14.4462,6.6733C14.8572,7.2506 15.0532,7.9533 15,8.6599V11H16V12Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_doorbell_on.xml"
+ line="26"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (3845 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M16.345,8.3611L14.055,9.1791C13.8731,9.0458 13.6785,8.9309 13.474,8.8361C13.6398,7.9956 14.1302,7.2543 14.839,6.7731C15.3079,6.465 15.6646,6.0136 15.8558,5.4861C16.047,4.9587 16.0625,4.3836 15.8999,3.8466C15.7374,3.3097 15.4055,2.8397 14.9538,2.5069C14.5022,2.1741 13.955,1.9963 13.394,2.0001C8.994,2.0001 7.157,5.0071 8.361,7.6551L9.179,9.9451C9.0458,10.1269 8.9309,10.3215 8.836,10.5261C7.9954,10.3606 7.254,9.8701 6.773,9.1611C6.465,8.6922 6.0135,8.3355 5.4861,8.1443C4.9587,7.9531 4.3835,7.9375 3.8466,8.1001C3.3096,8.2627 2.8396,8.5946 2.5068,9.0462C2.174,9.4979 1.9962,10.0451 2,10.6061C2,15.0061 5.007,16.843 7.655,15.639L9.945,14.821C10.1267,14.9541 10.3209,15.069 10.525,15.1641C10.3598,16.0048 9.8692,16.7463 9.16,17.227C8.691,17.5351 8.3343,17.9867 8.1431,18.5142C7.9519,19.0418 7.9365,19.617 8.0992,20.154C8.2619,20.691 8.5939,21.161 9.0457,21.4937C9.4976,21.8264 10.0449,22.004 10.606,22.0001C15.006,22.0001 16.843,18.993 15.639,16.345L14.821,14.0551C14.954,13.8734 15.0689,13.6791 15.164,13.475C16.0048,13.6402 16.7462,14.1309 17.227,14.8401C17.5351,15.3091 17.9866,15.6657 18.5141,15.8569C19.0417,16.0481 19.6169,16.0636 20.1539,15.9009C20.6909,15.7382 21.1609,15.4061 21.4936,14.9543C21.8264,14.5025 22.004,13.9551 22,13.394C22,9 18.993,7.1571 16.345,8.3611ZM12,13.5001C11.7033,13.5001 11.4133,13.4121 11.1666,13.2473C10.92,13.0824 10.7277,12.8482 10.6142,12.5741C10.5006,12.3 10.4709,11.9984 10.5288,11.7074C10.5867,11.4164 10.7296,11.1492 10.9393,10.9394C11.1491,10.7296 11.4164,10.5867 11.7074,10.5289C11.9983,10.471 12.2999,10.5007 12.574,10.6143C12.8481,10.7278 13.0824,10.92 13.2472,11.1667C13.412,11.4134 13.5,11.7034 13.5,12.0001C13.5,12.3979 13.342,12.7794 13.0607,13.0607C12.7793,13.342 12.3978,13.5001 12,13.5001ZM10.245,5.2161C10.6327,4.7742 11.1217,4.4328 11.6701,4.2211C12.2184,4.0093 12.8099,3.9335 13.394,4.0001C13.5259,3.9959 13.6555,4.0354 13.7627,4.1124C13.8699,4.1893 13.9487,4.2995 13.987,4.4258C14.0253,4.5521 14.0208,4.6875 13.9744,4.811C13.9279,4.9346 13.842,5.0393 13.73,5.1091C13.1418,5.5017 12.6392,6.0092 12.2521,6.601C11.8651,7.1929 11.6018,7.8568 11.478,8.553C11.2666,8.5847 11.0587,8.6362 10.857,8.707L10.181,6.8271C10.0515,6.576 9.9893,6.2955 10.0005,6.0131C10.0117,5.7308 10.0959,5.4561 10.245,5.2161ZM6.827,13.816C6.576,13.9458 6.2956,14.0083 6.0132,13.9973C5.7308,13.9862 5.4561,13.902 5.216,13.753C4.7745,13.3655 4.4332,12.8769 4.2215,12.3289C4.0098,11.7809 3.9338,11.1898 4,10.6061C3.9959,10.4742 4.0353,10.3446 4.1123,10.2374C4.1893,10.1302 4.2994,10.0513 4.4257,10.0131C4.552,9.9748 4.6874,9.9792 4.8109,10.0257C4.9345,10.0722 5.0392,10.1581 5.109,10.2701C5.5015,10.8581 6.0088,11.3607 6.6005,11.7477C7.1922,12.1347 7.8559,12.3981 8.552,12.522C8.5844,12.7334 8.6363,12.9413 8.707,13.1431L6.827,13.816ZM13.755,18.782C13.3675,19.2242 12.8786,19.566 12.3302,19.7781C11.7818,19.9902 11.1902,20.0664 10.606,20.0001C10.4741,20.0042 10.3445,19.9647 10.2373,19.8878C10.1301,19.8108 10.0512,19.7006 10.013,19.5743C9.9747,19.448 9.9791,19.3126 10.0256,19.1891C10.0721,19.0656 10.158,18.9608 10.27,18.8911C10.8581,18.4987 11.3606,17.9914 11.7475,17.3997C12.1343,16.808 12.3974,16.1441 12.521,15.4481C12.7327,15.4156 12.9409,15.3638 13.143,15.2931L13.818,17.173C13.9477,17.4241 14.0101,17.7045 13.999,17.9869C13.988,18.2692 13.9039,18.5439 13.755,18.7841V18.782ZM18.891,13.7281C18.4985,13.1399 17.991,12.6373 17.3992,12.2504C16.8073,11.8636 16.1432,11.6005 15.447,11.477C15.4154,11.2653 15.3639,11.057 15.293,10.855L17.173,10.1801C17.424,10.0503 17.7044,9.9879 17.9868,9.9989C18.2692,10.0099 18.5439,10.094 18.784,10.243C19.2261,10.631 19.5677,11.1202 19.7795,11.669C19.9912,12.2178 20.0669,12.8097 20,13.394C20.0041,13.5259 19.9647,13.6555 19.8877,13.7628C19.8107,13.87 19.7006,13.9488 19.5743,13.9871C19.448,14.0253 19.3126,14.0209 19.1891,13.9744C19.0655,13.928 18.9608,13.8421 18.891,13.73V13.7281Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_fan_off.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1740 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M16.345,8.3611L14.055,9.1791C13.8731,9.0458 13.6785,8.9309 13.474,8.8361C13.6398,7.9956 14.1302,7.2543 14.839,6.7731C15.3079,6.465 15.6646,6.0136 15.8558,5.4861C16.047,4.9587 16.0625,4.3836 15.8999,3.8466C15.7374,3.3097 15.4055,2.8397 14.9538,2.5069C14.5022,2.1741 13.955,1.9963 13.394,2.0001C8.994,2.0001 7.157,5.0071 8.361,7.6551L9.179,9.9451C9.0457,10.1269 8.9309,10.3215 8.836,10.5261C7.9954,10.3606 7.254,9.8701 6.773,9.1611C6.465,8.6922 6.0135,8.3355 5.4861,8.1443C4.9587,7.9531 4.3835,7.9375 3.8466,8.1001C3.3096,8.2627 2.8396,8.5946 2.5068,9.0462C2.174,9.4979 1.9962,10.0451 2,10.6061C2,15.0061 5.007,16.843 7.655,15.639L9.945,14.821C10.1267,14.9541 10.3209,15.069 10.525,15.1641C10.3598,16.0048 9.8692,16.7463 9.16,17.227C8.691,17.5351 8.3343,17.9867 8.1431,18.5142C7.9519,19.0418 7.9365,19.617 8.0992,20.154C8.2619,20.691 8.5939,21.161 9.0457,21.4937C9.4976,21.8264 10.0449,22.004 10.606,22.0001C15.006,22.0001 16.843,18.993 15.639,16.345L14.821,14.0551C14.954,13.8734 15.0689,13.6791 15.164,13.475C16.0048,13.6402 16.7462,14.1309 17.227,14.8401C17.5351,15.3091 17.9866,15.6657 18.5141,15.8569C19.0417,16.0481 19.6169,16.0636 20.1539,15.9009C20.6909,15.7382 21.1609,15.4061 21.4936,14.9543C21.8264,14.5025 22.004,13.9551 22,13.394C22,9 18.993,7.1571 16.345,8.3611ZM12,13.5001C11.7033,13.5001 11.4133,13.4121 11.1666,13.2473C10.92,13.0824 10.7277,12.8482 10.6142,12.5741C10.5006,12.3 10.4709,11.9984 10.5288,11.7074C10.5867,11.4164 10.7296,11.1492 10.9393,10.9394C11.1491,10.7296 11.4164,10.5867 11.7074,10.5289C11.9983,10.471 12.2999,10.5007 12.574,10.6143C12.8481,10.7278 13.0824,10.92 13.2472,11.1667C13.412,11.4134 13.5,11.7034 13.5,12.0001C13.5,12.3979 13.342,12.7794 13.0607,13.0607C12.7794,13.342 12.3978,13.5001 12,13.5001Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_fan_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1072 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M18,8H17V6C17,4.6739 16.4732,3.402 15.5355,2.4644C14.5979,1.5267 13.3261,1 12,1C10.6739,1 9.4022,1.5267 8.4645,2.4644C7.5268,3.402 7,4.6739 7,6V8H6C5.47,8.0016 4.9623,8.2127 4.5875,8.5874C4.2128,8.9621 4.0016,9.47 4,10V20C4.0016,20.5299 4.2128,21.0379 4.5875,21.4126C4.9623,21.7873 5.47,21.9984 6,22H18C18.5299,21.9984 19.0377,21.7873 19.4125,21.4126C19.7872,21.0379 19.9984,20.5299 20,20V10C19.9984,9.47 19.7872,8.9621 19.4125,8.5874C19.0377,8.2127 18.5299,8.0016 18,8ZM12,17C11.6044,17 11.2178,16.8828 10.8889,16.6631C10.56,16.4433 10.3036,16.1306 10.1522,15.7651C10.0009,15.3997 9.9613,14.9978 10.0384,14.6099C10.1156,14.2219 10.3061,13.8656 10.5858,13.5859C10.8655,13.3062 11.2219,13.1157 11.6098,13.0386C11.9978,12.9614 12.3999,13.001 12.7654,13.1523C13.1308,13.3037 13.4432,13.5598 13.6629,13.8887C13.8827,14.2176 14,14.6044 14,15C13.9984,15.5299 13.7872,16.0379 13.4125,16.4126C13.0377,16.7873 12.5299,16.9984 12,17ZM15,8H9V6C9,5.2043 9.3161,4.4415 9.8787,3.8789C10.4413,3.3163 11.2044,3 12,3C12.7956,3 13.5587,3.3163 14.1213,3.8789C14.6839,4.4415 15,5.2043 15,6V8Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_lock_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1585 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M20,4H4C3.4696,4 2.9609,4.2107 2.5858,4.5858C2.2107,4.9609 2,5.4696 2,6V18C2,18.5304 2.2107,19.0391 2.5858,19.4142C2.9609,19.7893 3.4696,20 4,20H20C20.5304,20 21.0391,19.7893 21.4142,19.4142C21.7893,19.0391 22,18.5304 22,18V6C22,5.4696 21.7893,4.9609 21.4142,4.5858C21.0391,4.2107 20.5304,4 20,4ZM15,17H5V7H15V17ZM18,17C17.8022,17 17.6089,16.9413 17.4444,16.8314C17.28,16.7215 17.1518,16.5654 17.0761,16.3827C17.0004,16.2 16.9806,15.9989 17.0192,15.8049C17.0578,15.611 17.153,15.4327 17.2929,15.2928C17.4327,15.153 17.6109,15.0578 17.8049,15.0192C17.9989,14.9806 18.2,15.0005 18.3827,15.0762C18.5654,15.1519 18.7216,15.28 18.8315,15.4445C18.9414,15.6089 19,15.8022 19,16C19,16.2652 18.8946,16.5196 18.7071,16.7072C18.5196,16.8947 18.2652,17 18,17ZM18,13C17.8022,13 17.6089,12.9413 17.4444,12.8314C17.28,12.7215 17.1518,12.5654 17.0761,12.3827C17.0004,12.2 16.9806,11.9989 17.0192,11.8049C17.0578,11.611 17.153,11.4327 17.2929,11.2928C17.4327,11.153 17.6109,11.0578 17.8049,11.0192C17.9989,10.9806 18.2,11.0005 18.3827,11.0762C18.5654,11.1519 18.7216,11.28 18.8315,11.4445C18.9414,11.6089 19,11.8022 19,12C19,12.2652 18.8946,12.5196 18.7071,12.7072C18.5196,12.8947 18.2652,13 18,13ZM18,9C17.8022,9 17.6089,8.9413 17.4444,8.8314C17.28,8.7215 17.1518,8.5654 17.0761,8.3827C17.0004,8.2 16.9806,7.9989 17.0192,7.8049C17.0578,7.6109 17.153,7.4327 17.2929,7.2929C17.4327,7.153 17.6109,7.0578 17.8049,7.0192C17.9989,6.9806 18.2,7.0005 18.3827,7.0762C18.5654,7.1519 18.7216,7.28 18.8315,7.4445C18.9414,7.6089 19,7.8022 19,8C19,8.2652 18.8946,8.5196 18.7071,8.7072C18.5196,8.8947 18.2652,9 18,9Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_microwave_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1375 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M22.379,20.515L21,15V13C21,12.4696 20.7893,11.9609 20.4142,11.5858C20.0391,11.2107 19.5304,11 19,11H15V4C15,3.2043 14.6839,2.4413 14.1213,1.8787C13.5587,1.3161 12.7956,1 12,1C11.2043,1 10.4413,1.3161 9.8786,1.8787C9.316,2.4413 9,3.2043 9,4V11H5C4.4695,11 3.9608,11.2107 3.5858,11.5858C3.2107,11.9609 3,12.4696 3,13V15L1.621,20.515C1.5473,20.8099 1.5417,21.1178 1.6048,21.4151C1.6679,21.7125 1.798,21.9916 1.9851,22.2311C2.1722,22.4707 2.4115,22.6645 2.6847,22.7977C2.958,22.9309 3.258,23.0001 3.562,23H20.438C20.742,23.0001 21.042,22.9309 21.3152,22.7977C21.5884,22.6645 21.8277,22.4707 22.0149,22.2311C22.202,21.9916 22.332,21.7125 22.3951,21.4151C22.4582,21.1178 22.4527,20.8099 22.379,20.515ZM11,4C11,3.7348 11.1053,3.4804 11.2929,3.2929C11.4804,3.1054 11.7348,3 12,3C12.2652,3 12.5195,3.1054 12.7071,3.2929C12.8946,3.4804 13,3.7348 13,4V11H11V4ZM5,13H19V15H5V13ZM18,21V19C18,18.7348 17.8946,18.4804 17.7071,18.2929C17.5195,18.1054 17.2652,18 17,18C16.7348,18 16.4804,18.1054 16.2929,18.2929C16.1053,18.4804 16,18.7348 16,19V21H13V19C13,18.7348 12.8946,18.4804 12.7071,18.2929C12.5195,18.1054 12.2652,18 12,18C11.7348,18 11.4804,18.1054 11.2929,18.2929C11.1053,18.4804 11,18.7348 11,19V21H8V19C8,18.7348 7.8946,18.4804 7.7071,18.2929C7.5195,18.1054 7.2652,18 7,18C6.7348,18 6.4804,18.1054 6.2929,18.2929C6.1053,18.4804 6,18.7348 6,19V21H3.562L4.562,17H19.438L20.438,21H18Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_mop_off.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1204 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M22.379,20.515L21,15V13C21,12.4696 20.7893,11.9609 20.4142,11.5858C20.0391,11.2107 19.5304,11 19,11H15V4C15,3.2043 14.6839,2.4413 14.1213,1.8787C13.5587,1.3161 12.7956,1 12,1C11.2043,1 10.4413,1.3161 9.8787,1.8787C9.316,2.4413 9,3.2043 9,4V11H5C4.4695,11 3.9608,11.2107 3.5858,11.5858C3.2107,11.9609 3,12.4696 3,13V15L1.621,20.515C1.5473,20.8099 1.5417,21.1178 1.6048,21.4151C1.6679,21.7125 1.798,21.9916 1.9851,22.2311C2.1722,22.4707 2.4115,22.6645 2.6847,22.7977C2.958,22.9309 3.258,23.0001 3.562,23H20.438C20.742,23.0001 21.042,22.9309 21.3152,22.7977C21.5885,22.6645 21.8277,22.4707 22.0148,22.2311C22.202,21.9916 22.332,21.7125 22.3951,21.4151C22.4582,21.1178 22.4527,20.8099 22.379,20.515ZM18,21V19C18,18.7348 17.8946,18.4804 17.7071,18.2929C17.5195,18.1054 17.2652,18 17,18C16.7348,18 16.4804,18.1054 16.2929,18.2929C16.1053,18.4804 16,18.7348 16,19V21H13V19C13,18.7348 12.8946,18.4804 12.7071,18.2929C12.5195,18.1054 12.2652,18 12,18C11.7348,18 11.4804,18.1054 11.2929,18.2929C11.1053,18.4804 11,18.7348 11,19V21H8V19C8,18.7348 7.8946,18.4804 7.7071,18.2929C7.5195,18.1054 7.2652,18 7,18C6.7348,18 6.4804,18.1054 6.2929,18.2929C6.1053,18.4804 6,18.7348 6,19V21H3.562L4.562,17H19.438L20.438,21H18Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_mop_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1592 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M17,12C17,12.5304 16.7893,13.0391 16.4142,13.4142C16.0391,13.7893 15.5304,14 15,14H9C8.4696,14 7.9609,13.7893 7.5858,13.4142C7.2107,13.0391 7,12.5304 7,12V10H3V19C3,19.5304 3.2107,20.0391 3.5858,20.4142C3.9609,20.7893 4.4696,21 5,21H19C19.5304,21 20.0391,20.7893 20.4142,20.4142C20.7893,20.0391 21,19.5304 21,19V10H17V12ZM8,18C7.8022,18 7.6089,17.9413 7.4444,17.8314C7.28,17.7215 7.1518,17.5654 7.0761,17.3827C7.0004,17.2 6.9806,16.9989 7.0192,16.8049C7.0578,16.611 7.153,16.4327 7.2929,16.2928C7.4328,16.153 7.6109,16.0578 7.8049,16.0192C7.9989,15.9806 8.2,16.0005 8.3827,16.0762C8.5654,16.1519 8.7216,16.28 8.8315,16.4445C8.9413,16.6089 9,16.8022 9,17C9,17.2652 8.8946,17.5196 8.7071,17.7072C8.5196,17.8947 8.2652,18 8,18ZM12,18C11.8022,18 11.6089,17.9413 11.4444,17.8314C11.28,17.7215 11.1518,17.5654 11.0761,17.3827C11.0004,17.2 10.9806,16.9989 11.0192,16.8049C11.0578,16.611 11.153,16.4327 11.2929,16.2928C11.4327,16.153 11.6109,16.0578 11.8049,16.0192C11.9989,15.9806 12.2,16.0005 12.3827,16.0762C12.5654,16.1519 12.7216,16.28 12.8315,16.4445C12.9414,16.6089 13,16.8022 13,17C13,17.2652 12.8946,17.5196 12.7071,17.7072C12.5196,17.8947 12.2652,18 12,18ZM16,18C15.8022,18 15.6089,17.9413 15.4444,17.8314C15.28,17.7215 15.1518,17.5654 15.0761,17.3827C15.0004,17.2 14.9806,16.9989 15.0192,16.8049C15.0578,16.611 15.153,16.4327 15.2929,16.2928C15.4327,16.153 15.6109,16.0578 15.8049,16.0192C15.9989,15.9806 16.2,16.0005 16.3827,16.0762C16.5654,16.1519 16.7216,16.28 16.8315,16.4445C16.9414,16.6089 17,16.8022 17,17C17,17.2652 16.8946,17.5196 16.7071,17.7072C16.5196,17.8947 16.2652,18 16,18Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_multicooker_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (829 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M12,2C10.0222,2 8.0888,2.5865 6.4443,3.6853C4.7998,4.7841 3.5181,6.346 2.7612,8.1732C2.0043,10.0005 1.8063,12.0111 2.1922,13.9509C2.578,15.8907 3.5304,17.6725 4.9289,19.071C6.3275,20.4696 8.1093,21.422 10.0491,21.8079C11.9889,22.1937 13.9996,21.9956 15.8268,21.2388C17.6541,20.4819 19.2159,19.2002 20.3147,17.5557C21.4135,15.9112 22,13.9778 22,12C22,9.3478 20.9464,6.8043 19.0711,4.929C17.1957,3.0536 14.6522,2 12,2ZM12,20C10.4178,20 8.871,19.5308 7.5554,18.6517C6.2399,17.7727 5.2145,16.5233 4.609,15.0615C4.0035,13.5997 3.845,11.9912 4.1537,10.4393C4.4624,8.8875 5.2243,7.462 6.3432,6.3431C7.462,5.2243 8.8874,4.4624 10.4393,4.1537C11.9911,3.845 13.5997,4.0035 15.0615,4.609C16.5233,5.2145 17.7727,6.2398 18.6518,7.5554C19.5308,8.871 20,10.4177 20,12C20,14.1217 19.1572,16.1566 17.6569,17.6569C16.1566,19.1572 14.1217,20 12,20Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_outlet_off.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (814 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M12,10C12.5933,10 13.1734,9.824 13.6667,9.4944C14.1601,9.1648 14.5446,8.6963 14.7716,8.1481C14.9987,7.5999 15.0581,6.9966 14.9424,6.4147C14.8266,5.8327 14.5409,5.2982 14.1213,4.8787C13.7018,4.4591 13.1672,4.1734 12.5853,4.0576C12.0033,3.9419 11.4001,4.0013 10.8519,4.2284C10.3038,4.4555 9.8352,4.8399 9.5056,5.3333C9.1759,5.8266 9,6.4067 9,7C9,7.7957 9.3161,8.5587 9.8787,9.1214C10.4413,9.684 11.2044,10 12,10ZM12,6C12.1978,6 12.3911,6.0587 12.5556,6.1686C12.72,6.2785 12.8482,6.4346 12.9239,6.6173C12.9996,6.8 13.0194,7.0011 12.9808,7.1951C12.9422,7.3891 12.847,7.5673 12.7071,7.7072C12.5673,7.847 12.3891,7.9423 12.1951,7.9809C12.0011,8.0194 11.8,7.9995 11.6173,7.9238C11.4346,7.8481 11.2784,7.72 11.1685,7.5556C11.0587,7.3911 11,7.1978 11,7C11,6.7348 11.1054,6.4804 11.2929,6.2929C11.4804,6.1053 11.7348,6 12,6Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_remote_control_off.xml"
+ line="26"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (3261 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M16,1H8C7.4696,1 6.9609,1.2107 6.5858,1.5858C6.2107,1.9609 6,2.4696 6,3V21C6,21.5304 6.2107,22.0391 6.5858,22.4142C6.9609,22.7893 7.4696,23 8,23H16C16.5304,23 17.0391,22.7893 17.4142,22.4142C17.7893,22.0391 18,21.5304 18,21V3C18,2.4696 17.7893,1.9609 17.4142,1.5858C17.0391,1.2107 16.5304,1 16,1ZM10,20C9.8022,20 9.6089,19.9413 9.4444,19.8314C9.28,19.7215 9.1518,19.5654 9.0761,19.3827C9.0004,19.2 8.9806,18.9989 9.0192,18.8049C9.0578,18.611 9.153,18.4327 9.2929,18.2928C9.4327,18.153 9.6109,18.0578 9.8049,18.0192C9.9989,17.9806 10.2,18.0005 10.3827,18.0762C10.5654,18.1519 10.7216,18.28 10.8315,18.4445C10.9414,18.6089 11,18.8022 11,19C11,19.2652 10.8946,19.5196 10.7071,19.7072C10.5196,19.8947 10.2652,20 10,20ZM10,17C9.8022,17 9.6089,16.9413 9.4444,16.8314C9.28,16.7215 9.1518,16.5654 9.0761,16.3827C9.0004,16.2 8.9806,15.9989 9.0192,15.8049C9.0578,15.611 9.153,15.4327 9.2929,15.2928C9.4327,15.153 9.6109,15.0578 9.8049,15.0192C9.9989,14.9806 10.2,15.0005 10.3827,15.0762C10.5654,15.1519 10.7216,15.28 10.8315,15.4445C10.9414,15.6089 11,15.8022 11,16C11,16.2652 10.8946,16.5196 10.7071,16.7072C10.5196,16.8947 10.2652,17 10,17ZM10,14C9.8022,14 9.6089,13.9413 9.4444,13.8314C9.28,13.7215 9.1518,13.5654 9.0761,13.3827C9.0004,13.2 8.9806,12.9989 9.0192,12.8049C9.0578,12.611 9.153,12.4327 9.2929,12.2928C9.4327,12.153 9.6109,12.0578 9.8049,12.0192C9.9989,11.9806 10.2,12.0005 10.3827,12.0762C10.5654,12.1519 10.7216,12.28 10.8315,12.4445C10.9414,12.6089 11,12.8022 11,13C11,13.2652 10.8946,13.5196 10.7071,13.7072C10.5196,13.8947 10.2652,14 10,14ZM14,20C13.8022,20 13.6089,19.9413 13.4444,19.8314C13.28,19.7215 13.1518,19.5654 13.0761,19.3827C13.0004,19.2 12.9806,18.9989 13.0192,18.8049C13.0578,18.611 13.153,18.4327 13.2929,18.2928C13.4327,18.153 13.6109,18.0578 13.8049,18.0192C13.9989,17.9806 14.2,18.0005 14.3827,18.0762C14.5654,18.1519 14.7216,18.28 14.8315,18.4445C14.9414,18.6089 15,18.8022 15,19C15,19.2652 14.8946,19.5196 14.7071,19.7072C14.5196,19.8947 14.2652,20 14,20ZM14,17C13.8022,17 13.6089,16.9413 13.4444,16.8314C13.28,16.7215 13.1518,16.5654 13.0761,16.3827C13.0004,16.2 12.9806,15.9989 13.0192,15.8049C13.0578,15.611 13.153,15.4327 13.2929,15.2928C13.4327,15.153 13.6109,15.0578 13.8049,15.0192C13.9989,14.9806 14.2,15.0005 14.3827,15.0762C14.5654,15.1519 14.7216,15.28 14.8315,15.4445C14.9414,15.6089 15,15.8022 15,16C15,16.2652 14.8946,16.5196 14.7071,16.7072C14.5196,16.8947 14.2652,17 14,17ZM14,14C13.8022,14 13.6089,13.9413 13.4444,13.8314C13.28,13.7215 13.1518,13.5654 13.0761,13.3827C13.0004,13.2 12.9806,12.9989 13.0192,12.8049C13.0578,12.611 13.153,12.4327 13.2929,12.2928C13.4327,12.153 13.6109,12.0578 13.8049,12.0192C13.9989,11.9806 14.2,12.0005 14.3827,12.0762C14.5654,12.1519 14.7216,12.28 14.8315,12.4445C14.9414,12.6089 15,12.8022 15,13C15,13.2652 14.8946,13.5196 14.7071,13.7072C14.5196,13.8947 14.2652,14 14,14ZM12,10C11.4067,10 10.8266,9.824 10.3333,9.4944C9.8399,9.1647 9.4554,8.6962 9.2284,8.1481C9.0013,7.5999 8.9419,6.9966 9.0576,6.4147C9.1734,5.8327 9.4591,5.2982 9.8787,4.8787C10.2982,4.4591 10.8328,4.1734 11.4147,4.0576C11.9967,3.9419 12.5999,4.0013 13.1481,4.2284C13.6962,4.4555 14.1648,4.8399 14.4944,5.3333C14.8241,5.8266 15,6.4067 15,7C15,7.7957 14.6839,8.5587 14.1213,9.1213C13.5587,9.684 12.7956,10 12,10Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_remote_control_on.xml"
+ line="26"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (909 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M2,7V17H22V7H2ZM11,13H5V11H11V13ZM14,13C13.8022,13 13.6089,12.9414 13.4444,12.8315C13.28,12.7217 13.1518,12.5653 13.0761,12.3826C13.0004,12.1998 12.9806,11.9989 13.0192,11.8049C13.0578,11.611 13.153,11.4328 13.2929,11.293C13.4327,11.1531 13.6109,11.0579 13.8049,11.0193C13.9989,10.9807 14.2,11.0005 14.3827,11.0762C14.5654,11.1519 14.7216,11.2799 14.8315,11.4443C14.9414,11.6088 15,11.8022 15,12C15,12.2652 14.8946,12.5195 14.7071,12.707C14.5196,12.8946 14.2652,13 14,13ZM17,13C16.8022,13 16.6089,12.9414 16.4444,12.8315C16.28,12.7217 16.1518,12.5653 16.0761,12.3826C16.0004,12.1998 15.9806,11.9989 16.0192,11.8049C16.0578,11.611 16.153,11.4328 16.2929,11.293C16.4327,11.1531 16.6109,11.0579 16.8049,11.0193C16.9989,10.9807 17.2,11.0005 17.3827,11.0762C17.5654,11.1519 17.7216,11.2799 17.8315,11.4443C17.9414,11.6088 18,11.8022 18,12C18,12.2652 17.8946,12.5195 17.7071,12.707C17.5196,12.8946 17.2652,13 17,13Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_set_top_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1931 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M19.56,11.361L13,8.4408V6.9999C13,6.7347 12.8946,6.4804 12.7071,6.2929C12.5196,6.1054 12.2652,5.9999 12,5.9999C11.8022,5.9999 11.6089,5.9413 11.4444,5.8315C11.28,5.7216 11.1518,5.5652 11.0761,5.3825C11.0004,5.1998 10.9806,4.9988 11.0192,4.8049C11.0578,4.6109 11.153,4.4327 11.2929,4.2929C11.4327,4.153 11.6109,4.0578 11.8049,4.0192C11.9989,3.9806 12.2,4.0004 12.3827,4.0761C12.5654,4.1518 12.7216,4.2798 12.8315,4.4443C12.9414,4.6087 13,4.8021 13,4.9999H15C15.0015,4.4496 14.8517,3.9095 14.5668,3.4386C14.2819,2.9678 13.8729,2.5843 13.3847,2.3303C12.8965,2.0762 12.3478,1.9613 11.7987,1.9982C11.2496,2.0351 10.7212,2.2224 10.2714,2.5395C9.8216,2.8566 9.4677,3.2915 9.2484,3.7963C9.0291,4.3011 8.9529,4.8563 9.0282,5.4015C9.1034,5.9467 9.3272,6.4608 9.6749,6.8874C10.0227,7.3139 10.4811,7.6365 11,7.82V8.4499L4.44,11.37C4.0115,11.5562 3.6468,11.8636 3.3909,12.2546C3.1351,12.6455 2.9992,13.1028 3,13.57V13.58C2.9995,13.8979 3.0617,14.2129 3.1831,14.5068C3.3046,14.8006 3.4828,15.0676 3.7076,15.2924C3.9325,15.5172 4.1994,15.6954 4.4933,15.8168C4.7871,15.9382 5.1021,16.0004 5.42,15.9999H7V21.9999H17V15.9999H18.58C18.898,16.0004 19.2129,15.9382 19.5067,15.8168C19.8006,15.6954 20.0676,15.5172 20.2924,15.2924C20.5172,15.0676 20.6954,14.8006 20.8169,14.5068C20.9383,14.2129 21.0005,13.8979 21,13.58V13.57C20.9994,13.1019 20.8631,12.644 20.6075,12.2519C20.3519,11.8598 19.988,11.5504 19.56,11.361ZM15,19.9999H9V14.9999H15V19.9999ZM18.58,13.9999H17V12.9999H7V13.9999H5.42C5.3642,13.9993 5.3091,13.9877 5.2577,13.9657C5.2064,13.9438 5.1599,13.9119 5.1209,13.872C5.0819,13.8321 5.0512,13.7846 5.0304,13.7328C5.0097,13.681 4.9993,13.6258 5,13.57C4.999,13.4889 5.0222,13.4094 5.0668,13.3417C5.1114,13.274 5.1752,13.221 5.25,13.1899L12,10.1899L18.75,13.1899C18.8245,13.2243 18.8876,13.2795 18.9319,13.3486C18.9761,13.4176 18.9998,13.4979 19,13.58C18.9995,13.6912 18.9551,13.7977 18.8764,13.8764C18.7978,13.955 18.6912,13.9994 18.58,13.9999Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_styler_off.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1908 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M19.56,11.361L13,8.4408V6.9999C13,6.7347 12.8946,6.4804 12.7071,6.2929C12.5196,6.1054 12.2652,5.9999 12,5.9999C11.8022,5.9999 11.6089,5.9413 11.4444,5.8315C11.28,5.7216 11.1518,5.5652 11.0761,5.3825C11.0004,5.1998 10.9806,4.9988 11.0192,4.8049C11.0578,4.6109 11.153,4.4327 11.2929,4.2929C11.4327,4.153 11.6109,4.0578 11.8049,4.0192C11.9989,3.9806 12.2,4.0004 12.3827,4.0761C12.5654,4.1518 12.7216,4.2798 12.8315,4.4443C12.9414,4.6087 13,4.8021 13,4.9999H15C15.0015,4.4496 14.8517,3.9095 14.5668,3.4386C14.2819,2.9678 13.8729,2.5843 13.3847,2.3303C12.8965,2.0762 12.3478,1.9613 11.7987,1.9982C11.2496,2.0351 10.7212,2.2224 10.2714,2.5395C9.8216,2.8566 9.4677,3.2915 9.2484,3.7963C9.0291,4.3011 8.9529,4.8563 9.0282,5.4015C9.1034,5.9467 9.3272,6.4608 9.6749,6.8874C10.0227,7.3139 10.4811,7.6365 11,7.82V8.4499L4.44,11.37C4.0115,11.5562 3.6468,11.8636 3.3909,12.2546C3.1351,12.6455 2.9992,13.1028 3,13.57V13.58C2.9995,13.8979 3.0617,14.2129 3.1831,14.5068C3.3046,14.8006 3.4828,15.0676 3.7076,15.2924C3.9325,15.5172 4.1994,15.6954 4.4933,15.8168C4.7871,15.9382 5.1021,16.0004 5.42,15.9999H7V21.9999H17V15.9999H18.58C18.898,16.0004 19.2129,15.9382 19.5067,15.8168C19.8006,15.6954 20.0676,15.5172 20.2924,15.2924C20.5172,15.0676 20.6954,14.8006 20.8169,14.5068C20.9383,14.2129 21.0005,13.8979 21,13.58V13.57C20.9994,13.1019 20.8631,12.644 20.6075,12.2519C20.3519,11.8598 19.988,11.5504 19.56,11.361ZM18.58,14.0009H17V13.0009H7V14.0009H5.42C5.3642,14.0002 5.3091,13.9887 5.2577,13.9667C5.2064,13.9448 5.1599,13.9129 5.1209,13.873C5.0819,13.833 5.0512,13.7859 5.0304,13.7341C5.0097,13.6822 4.9993,13.6268 5,13.571C4.999,13.4899 5.0222,13.4104 5.0668,13.3427C5.1114,13.275 5.1752,13.222 5.25,13.1908L12,10.1908L18.75,13.1908C18.8245,13.2253 18.8876,13.2804 18.9319,13.3495C18.9761,13.4186 18.9998,13.4989 19,13.581C18.9992,13.692 18.9547,13.7982 18.8761,13.8766C18.7974,13.9551 18.6911,13.9994 18.58,13.9999V14.0009Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_styler_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1228 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M15,12V6C15,5.2043 14.6839,4.4413 14.1213,3.8787C13.5587,3.3161 12.7956,3 12,3C11.2044,3 10.4413,3.3161 9.8787,3.8787C9.3161,4.4413 9,5.2043 9,6V12C8.3795,12.4662 7.8759,13.0702 7.5288,13.7644C7.1817,14.4586 7.0007,15.2239 7,16C7.0021,17.0723 7.3531,18.1148 8,18.97V19H8.02C8.4815,19.6206 9.0818,20.1246 9.7729,20.4719C10.4639,20.8192 11.2266,21.0001 12,21.0001C12.7734,21.0001 13.5361,20.8192 14.2271,20.4719C14.9182,20.1246 15.5185,19.6206 15.98,19H16V18.97C16.6469,18.1148 16.9979,17.0723 17,16C16.9993,15.2239 16.8183,14.4586 16.4712,13.7644C16.1241,13.0702 15.6205,12.4662 15,12ZM14.4,17.773L14.367,17.819C14.0952,18.1807 13.744,18.4752 13.3405,18.6799C12.937,18.8846 12.4919,18.9941 12.0395,18.9998C11.5871,19.0055 11.1394,18.9073 10.7309,18.7128C10.3223,18.5184 9.9638,18.2327 9.683,17.878L9.604,17.778C9.2154,17.2664 9.0034,16.6425 9,16C9.0016,15.5346 9.1108,15.0758 9.3189,14.6595C9.5271,14.2432 9.8286,13.8805 10.2,13.6L11,13V6C11,5.7348 11.1054,5.4804 11.2929,5.2929C11.4804,5.1054 11.7348,5 12,5C12.2652,5 12.5196,5.1054 12.7071,5.2929C12.8946,5.4804 13,5.7348 13,6V13L13.8,13.6C14.1714,13.8805 14.4729,14.2432 14.6811,14.6595C14.8892,15.0758 14.9984,15.5346 15,16C14.9967,16.6403 14.7862,17.2623 14.4,17.773V17.773Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_thermostat_off.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (941 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M8,6.5V11.76C8.8027,12.2963 9.4117,13.0766 9.7369,13.9856C10.0622,14.8946 10.0865,15.8841 9.8062,16.8079C9.526,17.7317 8.9561,18.541 8.1807,19.1161C7.4052,19.6912 6.4654,20.0017 5.5,20.0017C4.5346,20.0017 3.5948,19.6912 2.8193,19.1161C2.0439,18.541 1.474,17.7317 1.1938,16.8079C0.9135,15.8841 0.9378,14.8946 1.2631,13.9856C1.5883,13.0766 2.1973,12.2963 3,11.76V6.5C3,5.837 3.2634,5.2011 3.7322,4.7322C4.2011,4.2634 4.837,4 5.5,4C6.163,4 6.7989,4.2634 7.2678,4.7322C7.7366,5.2011 8,5.837 8,6.5ZM3.049,16H7.949C8.0467,15.5132 7.9978,15.0084 7.8084,14.5495C7.619,14.0905 7.2976,13.6981 6.885,13.422L5.998,12.828V6.5C5.998,6.3674 5.9453,6.2402 5.8516,6.1465C5.7578,6.0527 5.6306,6 5.498,6C5.3654,6 5.2382,6.0527 5.1445,6.1465C5.0507,6.2402 4.998,6.3674 4.998,6.5V12.828L4.111,13.422C3.7061,13.6922 3.3887,14.0746 3.1976,14.5223C3.0065,14.97 2.95,15.4637 3.035,15.943C3.0363,15.951 3.0389,15.959 3.0416,15.967C3.0453,15.978 3.049,15.989 3.049,16Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_unknown_off.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (924 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M8,6.5V11.76C8.8027,12.2963 9.4117,13.0766 9.7369,13.9856C10.0622,14.8946 10.0865,15.8841 9.8062,16.8079C9.526,17.7317 8.9561,18.541 8.1807,19.1161C7.4052,19.6912 6.4654,20.0017 5.5,20.0017C4.5346,20.0017 3.5948,19.6912 2.8193,19.1161C2.0439,18.541 1.474,17.7317 1.1938,16.8079C0.9135,15.8841 0.9378,14.8946 1.2631,13.9856C1.5883,13.0766 2.1973,12.2963 3,11.76V6.5C3,5.837 3.2634,5.2011 3.7322,4.7322C4.2011,4.2634 4.837,4 5.5,4C6.163,4 6.7989,4.2634 7.2678,4.7322C7.7366,5.2011 8,5.837 8,6.5ZM3.049,16H7.949C8.0469,15.5134 7.9983,15.0087 7.8093,14.5498C7.6202,14.0909 7.2992,13.6984 6.887,13.422L6,12.828V6.5C6,6.3674 5.9473,6.2402 5.8535,6.1465C5.7598,6.0527 5.6326,6 5.5,6C5.3674,6 5.2402,6.0527 5.1465,6.1465C5.0527,6.2402 5,6.3674 5,6.5V12.828L4.111,13.422C3.7061,13.6922 3.3887,14.0746 3.1976,14.5223C3.0065,14.97 2.95,15.4637 3.035,15.943C3.0363,15.951 3.0389,15.959 3.0416,15.967C3.0453,15.978 3.049,15.989 3.049,16Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_unknown_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1581 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M4,16.0001C3.4067,16.0001 2.8266,16.176 2.3333,16.5057C1.8399,16.8353 1.4554,17.3039 1.2284,17.8521C1.0013,18.4002 0.9419,19.0034 1.0576,19.5854C1.1734,20.1673 1.4591,20.7019 1.8787,21.1214C2.2982,21.541 2.8328,21.8267 3.4147,21.9425C3.9967,22.0582 4.5999,21.9988 5.148,21.7717C5.6962,21.5447 6.1648,21.1602 6.4944,20.6668C6.824,20.1735 7,19.5934 7,19.0001C7,18.2045 6.6839,17.4414 6.1213,16.8788C5.5587,16.3162 4.7957,16.0001 4,16.0001ZM4,20.0001C3.8022,20.0001 3.6089,19.9415 3.4444,19.8316C3.28,19.7217 3.1518,19.5655 3.0761,19.3828C3.0004,19.2001 2.9806,18.999 3.0192,18.805C3.0578,18.611 3.153,18.4329 3.2929,18.293C3.4327,18.1532 3.6109,18.0579 3.8049,18.0193C3.9989,17.9807 4.2,18.0005 4.3827,18.0762C4.5654,18.1519 4.7216,18.2801 4.8315,18.4445C4.9413,18.609 5,18.8023 5,19.0001C5,19.2653 4.8946,19.5197 4.7071,19.7072C4.5196,19.8947 4.2652,20.0001 4,20.0001ZM23,20.0001V22.0001H16V20.0001H18.49L12.01,4.5901C11.7747,4.0366 11.3553,3.5814 10.823,3.3016C10.2906,3.0217 9.6779,2.9344 9.0885,3.0544C8.4991,3.1744 7.9693,3.4943 7.5888,3.96C7.2082,4.4257 7.0002,5.0086 7,5.6101V9.0001H9C10.0609,9.0001 11.0783,9.4215 11.8284,10.1717C12.5786,10.9218 13,11.9392 13,13.0001V22.0001H7.99C8.4398,21.4103 8.7508,20.7267 8.9,20.0001H11V13.0001C10.9984,12.4702 10.7872,11.9624 10.4125,11.5876C10.0377,11.2129 9.5299,11.0017 9,11.0001H4V14.0001C3.3113,13.9992 2.6301,14.1422 2,14.4201V9.0001H5V5.6101C5.0002,4.5458 5.3685,3.5144 6.0426,2.6908C6.7165,1.8672 7.6547,1.3021 8.6979,1.0913C9.741,0.8806 10.825,1.0372 11.7659,1.5345C12.7068,2.0319 13.4466,2.8394 13.86,3.8201L20.66,20.0001H23Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_vacuum_off.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (867 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M4,16.0001C3.4067,16.0001 2.8266,16.176 2.3333,16.5057C1.8399,16.8353 1.4554,17.3039 1.2284,17.8521C1.0013,18.4002 0.9419,19.0034 1.0576,19.5854C1.1734,20.1673 1.4591,20.7018 1.8787,21.1214C2.2982,21.541 2.8328,21.8267 3.4147,21.9424C3.9967,22.0582 4.5999,21.9988 5.148,21.7717C5.6962,21.5447 6.1648,21.1602 6.4944,20.6668C6.824,20.1735 7,19.5934 7,19.0001C7,18.2044 6.6839,17.4414 6.1213,16.8788C5.5587,16.3162 4.7957,16.0001 4,16.0001ZM4,20.0001C3.8022,20.0001 3.6089,19.9415 3.4444,19.8316C3.28,19.7217 3.1518,19.5655 3.0761,19.3828C3.0004,19.2001 2.9806,18.999 3.0192,18.805C3.0578,18.611 3.153,18.4329 3.2929,18.293C3.4327,18.1531 3.6109,18.0579 3.8049,18.0193C3.9989,17.9807 4.2,18.0005 4.3827,18.0762C4.5654,18.1519 4.7216,18.2801 4.8315,18.4445C4.9413,18.609 5,18.8023 5,19.0001C5,19.2653 4.8946,19.5196 4.7071,19.7072C4.5196,19.8947 4.2652,20.0001 4,20.0001Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_vacuum_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (2132 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M9.64,16.3601C10.2694,16.969 11.1129,17.3061 11.9886,17.2988C12.8643,17.2916 13.7021,16.9405 14.3213,16.3213C14.9406,15.7021 15.2916,14.8642 15.2989,13.9885C15.3061,13.1128 14.9689,12.2693 14.36,11.6399L9.64,16.3601ZM18,2.01L6,2C5.7371,1.9991 5.4766,2.0502 5.2336,2.1504C4.9905,2.2506 4.7696,2.3979 4.5837,2.5838C4.3978,2.7696 4.2505,2.9906 4.1504,3.2336C4.0502,3.4767 3.9991,3.7371 4,4V20C3.9991,20.2629 4.0502,20.5233 4.1504,20.7664C4.2505,21.0094 4.3978,21.2304 4.5837,21.4163C4.7696,21.6022 4.9905,21.7494 5.2336,21.8496C5.4766,21.9498 5.7371,22.0009 6,22H18C18.2629,22.0009 18.5234,21.9498 18.7665,21.8496C19.0095,21.7494 19.2304,21.6022 19.4163,21.4163C19.6022,21.2304 19.7495,21.0094 19.8497,20.7664C19.9498,20.5233 20.0009,20.2629 20,20V4C20.0007,3.7376 19.9493,3.4778 19.8489,3.2354C19.7485,2.993 19.6011,2.773 19.4151,2.5879C19.2291,2.4028 19.0083,2.2564 18.7654,2.1572C18.5225,2.0581 18.2624,2.008 18,2.01ZM11,5C11.1978,5 11.3911,5.0586 11.5556,5.1685C11.72,5.2783 11.8482,5.4347 11.9239,5.6174C11.9996,5.8002 12.0194,6.0011 11.9808,6.1951C11.9422,6.3891 11.847,6.5672 11.7071,6.707C11.5673,6.8469 11.3891,6.9421 11.1951,6.9807C11.0011,7.0193 10.8001,6.9995 10.6173,6.9238C10.4346,6.8481 10.2784,6.7201 10.1685,6.5557C10.0587,6.3912 10,6.1978 10,6C10,5.7348 10.1054,5.4805 10.2929,5.293C10.4804,5.1054 10.7348,5 11,5ZM8,5C8.1978,5 8.3911,5.0586 8.5556,5.1685C8.72,5.2783 8.8482,5.4347 8.9239,5.6174C8.9996,5.8002 9.0194,6.0011 8.9808,6.1951C8.9422,6.3891 8.847,6.5672 8.7071,6.707C8.5673,6.8469 8.3891,6.9421 8.1951,6.9807C8.0011,7.0193 7.8001,6.9995 7.6173,6.9238C7.4346,6.8481 7.2784,6.7201 7.1685,6.5557C7.0587,6.3912 7,6.1978 7,6C7,5.7348 7.1054,5.4805 7.2929,5.293C7.4804,5.1054 7.7348,5 8,5ZM12,19C11.0111,19 10.0444,18.7066 9.2222,18.1572C8.3999,17.6078 7.759,16.827 7.3806,15.9133C7.0022,14.9997 6.9032,13.9946 7.0961,13.0247C7.289,12.0548 7.7652,11.1636 8.4645,10.4644C9.1637,9.7651 10.0547,9.2891 11.0246,9.0962C11.9945,8.9033 12.9998,9.0022 13.9134,9.3806C14.8271,9.7591 15.608,10.3999 16.1574,11.2222C16.7068,12.0444 17,13.0111 17,14C17,15.3261 16.4732,16.598 15.5355,17.5357C14.5979,18.4733 13.3261,19 12,19Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_washer_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1783 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M13.553,8.0161C13.1979,7.6625 12.9486,7.2166 12.8333,6.729C12.7179,6.2413 12.741,5.7311 12.9,5.2558C12.9134,5.2214 12.9162,5.1839 12.9082,5.1479C12.9003,5.1119 12.8818,5.0792 12.8552,5.0537C12.8286,5.0281 12.795,5.0109 12.7586,5.0044C12.7223,4.9979 12.6849,5.0023 12.6511,5.0171C8.8941,6.6581 10.4031,10.6938 10.4031,10.7568C10.4028,10.8187 10.3848,10.8792 10.3511,10.9311C10.3174,10.9831 10.2695,11.0243 10.2131,11.0498C10.2031,11.0498 9.974,11.1708 9.769,10.8838C9.5395,10.5707 9.3759,10.2145 9.2879,9.8364C9.1999,9.4583 9.1894,9.0663 9.2571,8.6841C9.2647,8.6434 9.2587,8.6012 9.2398,8.5644C9.2209,8.5276 9.1902,8.4984 9.1527,8.4809C9.1152,8.4635 9.0729,8.459 9.0326,8.4682C8.9923,8.4775 8.9562,8.5001 8.93,8.5322C8.503,9.08 8.2253,9.7288 8.1241,10.416C8.023,11.1032 8.1018,11.805 8.3528,12.4526C8.6039,13.1003 9.0187,13.6719 9.5567,14.1113C10.0946,14.5507 10.7373,14.8431 11.4221,14.9599C15.6071,15.4939 17.1871,11.2899 14.7041,8.9599C14.3381,8.6159 13.909,8.3721 13.553,8.0161ZM13.3241,12.8691C13.0354,13.1235 12.6634,13.2626 12.2787,13.2607C11.8939,13.2589 11.5233,13.116 11.2371,12.8589C11.225,12.8488 11.2159,12.836 11.2107,12.8213C11.2054,12.8065 11.2042,12.7903 11.2072,12.7749C11.2101,12.7595 11.2172,12.7452 11.2275,12.7334C11.2379,12.7216 11.2512,12.7129 11.2661,12.708C11.5164,12.6335 11.7426,12.4939 11.9216,12.3037C12.1005,12.1135 12.226,11.8794 12.2851,11.625C12.3198,11.2109 12.2684,10.7941 12.1341,10.4009C12.067,10.0764 12.087,9.74 12.1921,9.4258C12.196,9.4132 12.2035,9.4023 12.2138,9.394C12.2241,9.3858 12.2366,9.3809 12.2497,9.3799C12.2628,9.3788 12.2759,9.3817 12.2874,9.3882C12.2989,9.3946 12.3081,9.4042 12.3141,9.416C12.6801,10.236 13.8361,10.6222 13.8361,11.6162C13.843,11.8492 13.801,12.081 13.7128,12.2969C13.6246,12.5127 13.4922,12.7076 13.3241,12.8691Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_water_heater_off.xml"
+ line="26"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1632 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M16,2H8C6.9391,2 5.9217,2.4212 5.1716,3.1714C4.4214,3.9215 4,4.9391 4,6V20C4,20.5304 4.2107,21.039 4.5858,21.4141C4.9609,21.7891 5.4696,22 6,22H18C18.5304,22 19.0391,21.7891 19.4142,21.4141C19.7893,21.039 20,20.5304 20,20V6C20,4.9391 19.5786,3.9215 18.8284,3.1714C18.0783,2.4212 17.0609,2 16,2ZM8.93,8.5278C8.9561,8.4957 8.9922,8.4736 9.0325,8.4644C9.0729,8.4551 9.1151,8.4591 9.1526,8.4766C9.1902,8.494 9.2208,8.5237 9.2397,8.5605C9.2586,8.5974 9.2647,8.6395 9.257,8.6802C9.1893,9.0625 9.1998,9.4544 9.2878,9.8325C9.3758,10.2106 9.5395,10.5668 9.769,10.8799C9.969,11.1669 10.203,11.0499 10.213,11.0459C10.2694,11.0204 10.3173,10.9792 10.351,10.9272C10.3847,10.8753 10.4027,10.8148 10.403,10.7529C10.403,10.6899 8.894,6.6532 12.651,5.0132C12.6848,4.9985 12.7223,4.994 12.7586,5.0005C12.7949,5.007 12.8285,5.0238 12.8551,5.0493C12.8817,5.0749 12.9002,5.108 12.9082,5.144C12.9162,5.1801 12.9133,5.2175 12.9,5.2519C12.741,5.7272 12.7178,6.2374 12.8332,6.7251C12.9486,7.2127 13.1979,7.6586 13.553,8.0122C13.909,8.3682 14.338,8.6121 14.704,8.9541C17.187,11.2821 15.604,15.4861 11.422,14.9541C10.7376,14.8371 10.0952,14.5448 9.5576,14.1055C9.0199,13.6662 8.6053,13.0946 8.3543,12.4473C8.1033,11.7999 8.0244,11.0986 8.1252,10.4116C8.2261,9.7247 8.5034,9.0756 8.93,8.5278ZM18,20H6V16C6.7396,15.9897 7.4619,16.2246 8.054,16.668C8.3188,16.8888 8.6527,17.0098 8.9975,17.0098C9.3423,17.0098 9.6762,16.8888 9.941,16.668C10.5357,16.2281 11.2558,15.9907 11.9955,15.9907C12.7352,15.9907 13.4553,16.2281 14.05,16.668C14.3161,16.889 14.6511,17.0103 14.997,17.0103C15.3429,17.0103 15.6779,16.889 15.944,16.668C16.5368,16.2244 17.2597,15.9896 18,16V20Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_water_heater_on.xml"
+ line="26"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (834 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M17.654,7.563L12,2L6.346,7.563C5.6036,8.2877 5.0136,9.1533 4.6108,10.1094C4.2079,11.0654 4.0002,12.0924 4,13.1299C4.0174,15.2343 4.87,17.2458 6.3703,18.7217C7.8705,20.1975 9.8956,21.017 12,21C14.1044,21.017 16.1295,20.1975 17.6297,18.7217C19.13,17.2458 19.9826,15.2343 20,13.1299C20,12.0924 19.7925,11.0654 19.3896,10.1094C18.9867,9.1533 18.3966,8.2875 17.654,7.563ZM12,18C11.7348,18 11.4804,17.8946 11.2929,17.707C11.1054,17.5195 11,17.2652 11,17C11,16.7348 11.1054,16.4805 11.2929,16.293C11.4804,16.1054 11.7348,16 12,16C12.7956,16 13.5587,15.6837 14.1213,15.1211C14.6839,14.5585 15,13.7956 15,13C15,12.7348 15.1054,12.4805 15.2929,12.293C15.4804,12.1054 15.7348,12 16,12C16.2652,12 16.5196,12.1054 16.7071,12.293C16.8946,12.4805 17,12.7348 17,13C16.9984,14.3256 16.4711,15.5964 15.5338,16.5337C14.5964,17.471 13.3256,17.9984 12,18Z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_device_water_on.xml"
+ line="23"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1526 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M480,520Q414,520 367,473Q320,426 320,360Q320,294 367,247Q414,200 480,200Q546,200 593,247Q640,294 640,360Q640,426 593,473Q546,520 480,520ZM160,840L160,728Q160,695 177,666Q194,637 224,622Q275,596 339,578Q403,560 480,560Q557,560 621,578Q685,596 736,622Q766,637 783,666Q800,695 800,728L800,840L160,840ZM240,760L720,760L720,728Q720,717 714.5,708Q709,699 700,694Q664,676 607.5,658Q551,640 480,640Q409,640 352.5,658Q296,676 260,694Q251,699 245.5,708Q240,717 240,728L240,760ZM480,440Q513,440 536.5,416.5Q560,393 560,360Q560,327 536.5,303.5Q513,280 480,280Q447,280 423.5,303.5Q400,327 400,360Q400,393 423.5,416.5Q447,440 480,440ZM39,200L39,120Q56,120 70,113.5Q84,107 95,96Q106,85 112,71Q118,57 118,40L199,40Q199,73 186.5,102Q174,131 152,153Q130,175 101,187.5Q72,200 39,200ZM39,361L39,281Q90,281 133.5,262Q177,243 209,210Q241,177 260,133.5Q279,90 279,40L360,40Q360,106 335,164.5Q310,223 266,267Q222,311 164,336Q106,361 39,361ZM920,361Q854,361 795.5,336Q737,311 693,267Q649,223 624,164.5Q599,106 599,40L679,40Q679,90 698,133.5Q717,177 750,210Q783,243 826.5,262Q870,281 920,281L920,361ZM920,200Q887,200 858,187.5Q829,175 807,153Q785,131 772.5,102Q760,73 760,40L840,40Q840,57 846.5,71Q853,85 864,96Q875,107 889,113.5Q903,120 920,120L920,200ZM480,360Q480,360 480,360Q480,360 480,360Q480,360 480,360Q480,360 480,360Q480,360 480,360Q480,360 480,360Q480,360 480,360Q480,360 480,360ZM480,760L480,760Q480,760 480,760Q480,760 480,760Q480,760 480,760Q480,760 480,760Q480,760 480,760Q480,760 480,760Q480,760 480,760Q480,760 480,760L480,760L480,760Z" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_head_tracking.xml"
+ line="25"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1366 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M20.000000,5.000000L4.000000,5.000000C2.900000,5.000000 2.000000,5.900000 2.000000,7.000000l0.000000,10.000000c0.000000,1.100000 0.900000,2.000000 2.000000,2.000000l16.000000,0.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000L22.000000,7.000000C22.000000,5.900000 21.100000,5.000000 20.000000,5.000000zM11.000000,8.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000L11.000000,8.000000zM11.000000,11.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000L11.000000,11.000000zM8.000000,8.000000l2.000000,0.000000l0.000000,2.000000L8.000000,10.000000L8.000000,8.000000zM8.000000,11.000000l2.000000,0.000000l0.000000,2.000000L8.000000,13.000000L8.000000,11.000000zM7.000000,13.000000L5.000000,13.000000l0.000000,-2.000000l2.000000,0.000000L7.000000,13.000000zM7.000000,10.000000L5.000000,10.000000L5.000000,8.000000l2.000000,0.000000L7.000000,10.000000zM16.000000,17.000000L8.000000,17.000000l0.000000,-2.000000l8.000000,0.000000L16.000000,17.000000zM16.000000,13.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L16.000000,13.000000zM16.000000,10.000000l-2.000000,0.000000L14.000000,8.000000l2.000000,0.000000L16.000000,10.000000zM19.000000,13.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L19.000000,13.000000zM19.000000,10.000000l-2.000000,0.000000L17.000000,8.000000l2.000000,0.000000L19.000000,10.000000z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-sw900dp/ic_ime_switcher_default.xml"
+ line="23"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1395 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M10,12Q8.35,12 7.175,10.825Q6,9.65 6,8Q6,6.35 7.175,5.175Q8.35,4 10,4Q11.65,4 12.825,5.175Q14,6.35 14,8Q14,9.65 12.825,10.825Q11.65,12 10,12ZM2,20V17.2Q2,16.375 2.425,15.65Q2.85,14.925 3.6,14.55Q4.875,13.9 6.475,13.45Q8.075,13 10,13Q10.2,13 10.35,13Q10.5,13 10.65,13.05Q10.45,13.5 10.312,13.988Q10.175,14.475 10.1,15H10Q8.225,15 6.812,15.45Q5.4,15.9 4.5,16.35Q4.275,16.475 4.138,16.7Q4,16.925 4,17.2V18H10.3Q10.45,18.525 10.7,19.038Q10.95,19.55 11.25,20ZM16,21L15.7,19.5Q15.4,19.375 15.137,19.238Q14.875,19.1 14.6,18.9L13.15,19.35L12.15,17.65L13.3,16.65Q13.25,16.3 13.25,16Q13.25,15.7 13.3,15.35L12.15,14.35L13.15,12.65L14.6,13.1Q14.875,12.9 15.137,12.762Q15.4,12.625 15.7,12.5L16,11H18L18.3,12.5Q18.6,12.625 18.863,12.775Q19.125,12.925 19.4,13.15L20.85,12.65L21.85,14.4L20.7,15.4Q20.75,15.7 20.75,16.025Q20.75,16.35 20.7,16.65L21.85,17.65L20.85,19.35L19.4,18.9Q19.125,19.1 18.863,19.238Q18.6,19.375 18.3,19.5L18,21ZM17,18Q17.825,18 18.413,17.413Q19,16.825 19,16Q19,15.175 18.413,14.587Q17.825,14 17,14Q16.175,14 15.588,14.587Q15,15.175 15,16Q15,16.825 15.588,17.413Q16.175,18 17,18ZM10,10Q10.825,10 11.413,9.412Q12,8.825 12,8Q12,7.175 11.413,6.588Q10.825,6 10,6Q9.175,6 8.588,6.588Q8,7.175 8,8Q8,8.825 8.588,9.412Q9.175,10 10,10ZM10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8ZM10,15Q10,15 10,15Q10,15 10,15Q10,15 10,15Q10,15 10,15Q10,15 10,15Q10,15 10,15Z"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_manage_users.xml"
+ line="22"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (866 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M14.95,11.3l1.62,-1.61C16.84,10.41 17,11.18 17,12s-0.16,1.61 -0.44,2.33l-1.61,-1.61C14.56,12.33 14.56,11.69 14.95,11.3zM18.69,7.54c-0.26,0.26 -0.32,0.65 -0.17,0.98c0.47,1.07 0.72,2.24 0.72,3.47c0,1.24 -0.26,2.43 -0.73,3.49c-0.14,0.32 -0.09,0.69 0.16,0.94c0.4,0.4 1.09,0.29 1.34,-0.23c0.63,-1.3 0.98,-2.76 0.98,-4.3c-0.01,-1.46 -0.33,-2.86 -0.91,-4.12C19.84,7.23 19.12,7.11 18.69,7.54zM15.26,15.74c0.41,0.41 0.41,1.07 0,1.48l-4.51,4.51C10.57,21.89 10.32,22 10.04,22C9.47,22 9,21.53 9,20.96v-6.45l-4.05,4.05c-0.41,0.41 -1.06,0.41 -1.47,0s-0.41,-1.06 0,-1.47L8.57,12L3.48,6.9c-0.41,-0.41 -0.41,-1.06 0,-1.47s1.06,-0.41 1.47,0L9,9.49V3.04C9,2.47 9.47,2 10.04,2c0.28,0 0.53,0.11 0.72,0.29l4.5,4.5c0.41,0.41 0.41,1.07 0,1.48L11.51,12L15.26,15.74zM13.14,7.53l-2.15,-2.15v4.3C10.99,9.68 13.14,7.53 13.14,7.53zM13.14,16.47l-2.15,-2.15v4.3C10.99,18.62 13.14,16.47 13.14,16.47z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml"
+ line="23"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (836 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M2,12C2,6.48 6.47,2 11.99,2C17.52,2 22,6.48 22,12c0,0.34 -0.02,0.67 -0.05,1h-2.02c0.04,-0.33 0.07,-0.66 0.07,-1c0,-0.69 -0.1,-1.36 -0.26,-2h-3.38c0.08,0.66 0.14,1.32 0.14,2c0,0.34 -0.01,0.67 -0.04,1h-2.01c0.03,-0.33 0.05,-0.66 0.05,-1c0,-0.68 -0.07,-1.35 -0.16,-2H9.66c-0.09,0.65 -0.16,1.32 -0.16,2s0.07,1.34 0.16,2H13v2h-2.91c0.43,1.43 1.08,2.76 1.91,3.96V20h1v1.95C12.67,21.98 12.33,22 11.99,22C6.47,22 2,17.52 2,12zM15.97,8h2.95c-0.96,-1.65 -2.49,-2.93 -4.33,-3.56C15.19,5.55 15.65,6.75 15.97,8zM13.91,8C13.48,6.57 12.83,5.24 12,4.04c-0.83,1.2 -1.48,2.53 -1.91,3.96H13.91zM4,12c0,0.69 0.1,1.36 0.26,2h3.38c-0.08,-0.66 -0.14,-1.32 -0.14,-2s0.06,-1.34 0.14,-2H4.26C4.1,10.64 4,11.31 4,12zM8.03,16H5.08c0.96,1.66 2.49,2.93 4.33,3.56C8.81,18.45 8.35,17.25 8.03,16zM5.08,8h2.95c0.32,-1.25 0.78,-2.45 1.38,-3.56C7.57,5.07 6.04,6.34 5.08,8z""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_qs_no_internet_unavailable.xml"
+ line="23"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1847 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M13.85,22.25h-3.7c-0.74,0 -1.36,-0.54 -1.45,-1.27l-0.27,-1.89c-0.27,-0.14 -0.53,-0.29 -0.79,-0.46l-1.8,0.72c-0.7,0.26 -1.47,-0.03 -1.81,-0.65L2.2,15.53c-0.35,-0.66 -0.2,-1.44 0.36,-1.88l1.53,-1.19c-0.01,-0.15 -0.02,-0.3 -0.02,-0.46c0,-0.15 0.01,-0.31 0.02,-0.46l-1.52,-1.19C1.98,9.9 1.83,9.09 2.2,8.47l1.85,-3.19c0.34,-0.62 1.11,-0.9 1.79,-0.63l1.81,0.73c0.26,-0.17 0.52,-0.32 0.78,-0.46l0.27,-1.91c0.09,-0.7 0.71,-1.25 1.44,-1.25h3.7c0.74,0 1.36,0.54 1.45,1.27l0.27,1.89c0.27,0.14 0.53,0.29 0.79,0.46l1.8,-0.72c0.71,-0.26 1.48,0.03 1.82,0.65l1.84,3.18c0.36,0.66 0.2,1.44 -0.36,1.88l-1.52,1.19c0.01,0.15 0.02,0.3 0.02,0.46s-0.01,0.31 -0.02,0.46l1.52,1.19c0.56,0.45 0.72,1.23 0.37,1.86l-1.86,3.22c-0.34,0.62 -1.11,0.9 -1.8,0.63l-1.8,-0.72c-0.26,0.17 -0.52,0.32 -0.78,0.46l-0.27,1.91C15.21,21.71 14.59,22.25 13.85,22.25zM13.32,20.72c0,0.01 0,0.01 0,0.02L13.32,20.72zM10.68,20.7l0,0.02C10.69,20.72 10.69,20.71 10.68,20.7zM10.62,20.25h2.76l0.37,-2.55l0.53,-0.22c0.44,-0.18 0.88,-0.44 1.34,-0.78l0.45,-0.34l2.38,0.96l1.38,-2.4l-2.03,-1.58l0.07,-0.56c0.03,-0.26 0.06,-0.51 0.06,-0.78c0,-0.27 -0.03,-0.53 -0.06,-0.78l-0.07,-0.56l2.03,-1.58l-1.39,-2.4l-2.39,0.96l-0.45,-0.35c-0.42,-0.32 -0.87,-0.58 -1.33,-0.77L13.75,6.3l-0.37,-2.55h-2.76L10.25,6.3L9.72,6.51C9.28,6.7 8.84,6.95 8.38,7.3L7.93,7.63L5.55,6.68L4.16,9.07l2.03,1.58l-0.07,0.56C6.09,11.47 6.06,11.74 6.06,12c0,0.26 0.02,0.53 0.06,0.78l0.07,0.56l-2.03,1.58l1.38,2.4l2.39,-0.96l0.45,0.35c0.43,0.33 0.86,0.58 1.33,0.77l0.53,0.22L10.62,20.25zM18.22,17.72c0,0.01 -0.01,0.02 -0.01,0.03L18.22,17.72zM5.77,17.71l0.01,0.02C5.78,17.72 5.77,17.71 5.77,17.71zM3.93,9.47L3.93,9.47C3.93,9.47 3.93,9.47 3.93,9.47zM18.22,6.27c0,0.01 0.01,0.02 0.01,0.02L18.22,6.27zM5.79,6.25L5.78,6.27C5.78,6.27 5.79,6.26 5.79,6.25zM13.31,3.28c0,0.01 0,0.01 0,0.02L13.31,3.28zM10.69,3.26l0,0.02C10.69,3.27 10.69,3.27 10.69,3.26z"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_settings.xml"
+ line="22"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1847 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M13.85,22.25h-3.7c-0.74,0 -1.36,-0.54 -1.45,-1.27l-0.27,-1.89c-0.27,-0.14 -0.53,-0.29 -0.79,-0.46l-1.8,0.72c-0.7,0.26 -1.47,-0.03 -1.81,-0.65L2.2,15.53c-0.35,-0.66 -0.2,-1.44 0.36,-1.88l1.53,-1.19c-0.01,-0.15 -0.02,-0.3 -0.02,-0.46c0,-0.15 0.01,-0.31 0.02,-0.46l-1.52,-1.19C1.98,9.9 1.83,9.09 2.2,8.47l1.85,-3.19c0.34,-0.62 1.11,-0.9 1.79,-0.63l1.81,0.73c0.26,-0.17 0.52,-0.32 0.78,-0.46l0.27,-1.91c0.09,-0.7 0.71,-1.25 1.44,-1.25h3.7c0.74,0 1.36,0.54 1.45,1.27l0.27,1.89c0.27,0.14 0.53,0.29 0.79,0.46l1.8,-0.72c0.71,-0.26 1.48,0.03 1.82,0.65l1.84,3.18c0.36,0.66 0.2,1.44 -0.36,1.88l-1.52,1.19c0.01,0.15 0.02,0.3 0.02,0.46s-0.01,0.31 -0.02,0.46l1.52,1.19c0.56,0.45 0.72,1.23 0.37,1.86l-1.86,3.22c-0.34,0.62 -1.11,0.9 -1.8,0.63l-1.8,-0.72c-0.26,0.17 -0.52,0.32 -0.78,0.46l-0.27,1.91C15.21,21.71 14.59,22.25 13.85,22.25zM13.32,20.72c0,0.01 0,0.01 0,0.02L13.32,20.72zM10.68,20.7l0,0.02C10.69,20.72 10.69,20.71 10.68,20.7zM10.62,20.25h2.76l0.37,-2.55l0.53,-0.22c0.44,-0.18 0.88,-0.44 1.34,-0.78l0.45,-0.34l2.38,0.96l1.38,-2.4l-2.03,-1.58l0.07,-0.56c0.03,-0.26 0.06,-0.51 0.06,-0.78c0,-0.27 -0.03,-0.53 -0.06,-0.78l-0.07,-0.56l2.03,-1.58l-1.39,-2.4l-2.39,0.96l-0.45,-0.35c-0.42,-0.32 -0.87,-0.58 -1.33,-0.77L13.75,6.3l-0.37,-2.55h-2.76L10.25,6.3L9.72,6.51C9.28,6.7 8.84,6.95 8.38,7.3L7.93,7.63L5.55,6.68L4.16,9.07l2.03,1.58l-0.07,0.56C6.09,11.47 6.06,11.74 6.06,12c0,0.26 0.02,0.53 0.06,0.78l0.07,0.56l-2.03,1.58l1.38,2.4l2.39,-0.96l0.45,0.35c0.43,0.33 0.86,0.58 1.33,0.77l0.53,0.22L10.62,20.25zM18.22,17.72c0,0.01 -0.01,0.02 -0.01,0.03L18.22,17.72zM5.77,17.71l0.01,0.02C5.78,17.72 5.77,17.71 5.77,17.71zM3.93,9.47L3.93,9.47C3.93,9.47 3.93,9.47 3.93,9.47zM18.22,6.27c0,0.01 0.01,0.02 0.01,0.02L18.22,6.27zM5.79,6.25L5.78,6.27C5.78,6.27 5.79,6.26 5.79,6.25zM13.31,3.28c0,0.01 0,0.01 0,0.02L13.31,3.28zM10.69,3.26l0,0.02C10.69,3.27 10.69,3.27 10.69,3.26z"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_settings_24dp.xml"
+ line="25"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1227 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M920,401Q848,401 782,373.5Q716,346 665,295Q614,244 586.5,178Q559,112 559,40L639,40Q639,97 660,148Q681,199 721,239Q761,279 812,300.5Q863,322 920,322L920,401ZM920,242Q879,242 842.5,227Q806,212 777,183Q748,154 733,117.5Q718,81 718,40L797,40Q797,65 806.5,87.5Q816,110 833,127Q850,144 872.5,153Q895,162 920,162L920,242ZM400,520Q334,520 287,473Q240,426 240,360Q240,294 287,247Q334,200 400,200Q466,200 513,247Q560,294 560,360Q560,426 513,473Q466,520 400,520ZM80,840L80,728Q80,695 97,666Q114,637 144,622Q195,596 259,578Q323,560 400,560Q477,560 541,578Q605,596 656,622Q686,637 703,666Q720,695 720,728L720,840L80,840ZM160,760L640,760L640,728Q640,717 634.5,708Q629,699 620,694Q584,676 527.5,658Q471,640 400,640Q329,640 272.5,658Q216,676 180,694Q171,699 165.5,708Q160,717 160,728L160,760ZM400,440Q433,440 456.5,416.5Q480,393 480,360Q480,327 456.5,303.5Q433,280 400,280Q367,280 343.5,303.5Q320,327 320,360Q320,393 343.5,416.5Q367,440 400,440ZM400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360ZM400,760L400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760L400,760L400,760Z" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_spatial_audio.xml"
+ line="25"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (1224 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M750,550L806,494Q766,454 743.5,402.5Q721,351 721,294Q721,237 743.5,186Q766,135 806,95L750,37Q699,88 670,155Q641,222 641,294Q641,366 670,432.5Q699,499 750,550ZM862,436L918,380Q901,363 891,341Q881,319 881,294Q881,269 891,247Q901,225 918,208L862,151Q833,180 817,216Q801,252 801,293Q801,334 817,371Q833,408 862,436ZM400,520Q334,520 287,473Q240,426 240,360Q240,294 287,247Q334,200 400,200Q466,200 513,247Q560,294 560,360Q560,426 513,473Q466,520 400,520ZM80,840L80,728Q80,695 97,666Q114,637 144,622Q195,596 259,578Q323,560 400,560Q477,560 541,578Q605,596 656,622Q686,637 703,666Q720,695 720,728L720,840L80,840ZM160,760L640,760L640,728Q640,717 634.5,708Q629,699 620,694Q584,676 527.5,658Q471,640 400,640Q329,640 272.5,658Q216,676 180,694Q171,699 165.5,708Q160,717 160,728L160,760ZM400,440Q433,440 456.5,416.5Q480,393 480,360Q480,327 456.5,303.5Q433,280 400,280Q367,280 343.5,303.5Q320,327 320,360Q320,393 343.5,416.5Q367,440 400,440ZM400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360Q400,360 400,360ZM400,760L400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760Q400,760 400,760L400,760L400,760Z" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/ic_spatial_audio_off.xml"
+ line="25"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="VectorPath"
+ message="Very long vector path (921 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+ errorLine1=" android:pathData="M11.95,18Q12.475,18 12.838,17.637Q13.2,17.275 13.2,16.75Q13.2,16.225 12.838,15.863Q12.475,15.5 11.95,15.5Q11.425,15.5 11.062,15.863Q10.7,16.225 10.7,16.75Q10.7,17.275 11.062,17.637Q11.425,18 11.95,18ZM11.05,14.15H12.9Q12.9,13.325 13.088,12.85Q13.275,12.375 14.15,11.55Q14.8,10.9 15.175,10.312Q15.55,9.725 15.55,8.9Q15.55,7.5 14.525,6.75Q13.5,6 12.1,6Q10.675,6 9.788,6.75Q8.9,7.5 8.55,8.55L10.2,9.2Q10.325,8.75 10.763,8.225Q11.2,7.7 12.1,7.7Q12.9,7.7 13.3,8.137Q13.7,8.575 13.7,9.1Q13.7,9.6 13.4,10.037Q13.1,10.475 12.65,10.85Q11.55,11.825 11.3,12.325Q11.05,12.825 11.05,14.15ZM12,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,22Z"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/media_output_status_help.xml"
+ line="25"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="ViewHolder"
+ message="Unconditional layout inflation from view adapter: Should use View Holder pattern (use recycled view passed into this method as the second parameter) for smoother scrolling"
+ errorLine1=" layoutInflater.inflate("
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt"
+ line="229"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="HandlerLeak"
+ message="This `Handler` class should be static or leaks might occur (anonymous android.os.Handler)"
+ errorLine1=" private Handler mHandler = new Handler() {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/GestureRecorder.java"
+ line="144"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="HandlerLeak"
+ message="This `Handler` class should be static or leaks might occur (anonymous android.os.Handler)"
+ errorLine1=" private Handler mHandler = new Handler() {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java"
+ line="2165"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="HandlerLeak"
+ message="This `Handler` class should be static or leaks might occur (com.android.systemui.keyboard.KeyboardUI.KeyboardUIHandler)"
+ errorLine1=" private final class KeyboardUIHandler extends Handler {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java"
+ line="430"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="HandlerLeak"
+ message="This `Handler` class should be static or leaks might occur (anonymous android.os.Handler)"
+ errorLine1=" private Handler mHandler = new Handler() {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/logcat/LogAccessDialogActivity.java"
+ line="171"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="HandlerLeak"
+ message="This `Handler` class should be static or leaks might occur (com.android.systemui.shortcut.ShortcutKeyServiceProxy.H)"
+ errorLine1=" private final class H extends Handler {"
+ errorLine2=" ~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyServiceProxy.java"
+ line="49"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="MergeRootFrame"
+ message="This `<FrameLayout>` can be replaced with a `<merge>` tag"
+ errorLine1="<FrameLayout"
+ errorLine2="^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/controls_detail_dialog.xml"
+ line="18"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MergeRootFrame"
+ message="This `<FrameLayout>` can be replaced with a `<merge>` tag"
+ errorLine1="<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android""
+ errorLine2="^">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/rotate_suggestion.xml"
+ line="17"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="UseValueOf"
+ message="Use `Long.valueOf(c2.getLastInteractionTimestamp())` instead"
+ errorLine1=" .sorted((c1, c2) -> new Long(c2.getLastInteractionTimestamp()).compareTo("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java"
+ line="307"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UseValueOf"
+ message="Use `Long.valueOf(c1.getLastInteractionTimestamp())` instead"
+ errorLine1=" new Long(c1.getLastInteractionTimestamp())))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java"
+ line="308"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="DisableBaselineAlignment"
+ message="Set `android:baselineAligned="false"` on this element for better performance"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/controls_app_item.xml"
+ line="22"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="DisableBaselineAlignment"
+ message="Set `android:baselineAligned="false"` on this element for better performance"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="93"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="DisableBaselineAlignment"
+ message="Set `android:baselineAligned="false"` on this element for better performance"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="199"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="DisableBaselineAlignment"
+ message="Set `android:baselineAligned="false"` on this element for better performance"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="250"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="DisableBaselineAlignment"
+ message="Set `android:baselineAligned="false"` on this element for better performance"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_list_item.xml"
+ line="25"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="DisableBaselineAlignment"
+ message="Set `android:baselineAligned="false"` on this element for better performance"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/privacy_dialog_v2.xml"
+ line="63"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="DisableBaselineAlignment"
+ message="Set `android:baselineAligned="false"` on this element for better performance"
+ errorLine1="<LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/qs_dialog_secondary_mobile_network.xml"
+ line="17"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="114"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="150"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="208"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="275"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_list_item.xml"
+ line="48"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_height` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_height="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_dialog.xml"
+ line="109"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_large_with_content.xml"
+ line="38"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_with_content.xml"
+ line="129"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_height` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_height="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_small.xml"
+ line="38"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/privacy_dialog_v2.xml"
+ line="73"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `match_parent` for better performance"
+ errorLine1=" android:layout_width="match_parent""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/qs_dialog_secondary_mobile_network.xml"
+ line="38"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_height` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_height="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/remote_input.xml"
+ line="79"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="InefficientWeight"
+ message="Use a `layout_width` of `0dp` instead of `wrap_content` for better performance"
+ errorLine1=" android:layout_width="wrap_content""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar_notification_section_header.xml"
+ line="37"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NestedWeights"
+ message="Nested weights are bad for performance"
+ errorLine1=" android:layout_weight="1""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_placeholder_layout.xml"
+ line="47"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?android:colorBackground` with a theme that also paints a background (inferred theme is `@android_style/Theme_Translucent_NoTitleBar_Fullscreen`)"
+ errorLine1=" android:background="?android:colorBackground""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/auth_biometric_background.xml"
+ line="20"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?android:attr/colorBackground` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="?android:attr/colorBackground">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="29"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?android:attr/dividerHorizontal` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="?android:attr/dividerHorizontal" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/keyboard_shortcuts_category_separator.xml"
+ line="25"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?android:attr/colorBackground` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="?android:attr/colorBackground""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_projection_recent_tasks.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `@drawable/system_bar_background` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="@drawable/system_bar_background">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml"
+ line="27"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorOnSurfaceVariant` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="?androidprv:attr/materialColorOnSurfaceVariant" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_children_divider.xml"
+ line="24"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainerHigh` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="?androidprv:attr/materialColorSurfaceContainerHigh""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_snooze.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?android:attr/colorAccent` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="?android:attr/colorAccent">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="31"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?android:attr/colorAccent` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="?android:attr/colorAccent""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="28"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?android:attr/colorAccent` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="?android:attr/colorAccent""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="28"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `@drawable/status_bar_user_chip_bg` with a theme that also paints a background (inferred theme is `@style/Theme.SystemUI`)"
+ errorLine1=" android:background="@drawable/status_bar_user_chip_bg""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar_user_chip_container.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UselessLeaf"
+ message="This `LinearLayout` view is unnecessary (no children, no `background`, no `id`, no `style`)"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/global_actions_grid.xml"
+ line="37"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="UselessLeaf"
+ message="This `LinearLayout` view is unnecessary (no children, no `background`, no `id`, no `style`)"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/global_actions_grid.xml"
+ line="43"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="UselessLeaf"
+ message="This `LinearLayout` view is unnecessary (no children, no `background`, no `id`, no `style`)"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout-land/global_actions_grid.xml"
+ line="49"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="UselessLeaf"
+ message="This `LinearLayout` view is unnecessary (no children, no `background`, no `id`, no `style`)"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/global_actions_grid.xml"
+ line="73"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UselessLeaf"
+ message="This `LinearLayout` view is unnecessary (no children, no `background`, no `id`, no `style`)"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/global_actions_grid.xml"
+ line="79"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UselessLeaf"
+ message="This `LinearLayout` view is unnecessary (no children, no `background`, no `id`, no `style`)"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/global_actions_grid.xml"
+ line="85"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `ScrollView` layout or its `FrameLayout` parent is possibly unnecessary"
+ errorLine1=" <ScrollView"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/alert_dialog_systemui.xml"
+ line="39"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `FrameLayout` parent is possibly unnecessary"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/combined_qs_header.xml"
+ line="128"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `FrameLayout` parent is possibly unnecessary"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/controls_detail_dialog.xml"
+ line="23"
+ column="4"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `LinearLayout` parent is unnecessary"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="58"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `RelativeLayout` layout or its `LinearLayout` parent is possibly unnecessary"
+ errorLine1=" <RelativeLayout"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/global_actions_view.xml"
+ line="37"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `RelativeLayout` layout or its `FrameLayout` parent is unnecessary"
+ errorLine1=" <RelativeLayout"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/magnifier_controllers.xml"
+ line="25"
+ column="4"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `FrameLayout` layout or its `LinearLayout` parent is unnecessary"
+ errorLine1=" <FrameLayout"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_list_item.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `FrameLayout` parent is possibly unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notif_half_shelf.xml"
+ line="28"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `LinearLayout` parent is possibly unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml"
+ line="69"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `LinearLayout` parent is possibly unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_initial_layout.xml"
+ line="23"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `LinearLayout` parent is possibly unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_placeholder_layout.xml"
+ line="23"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `LinearLayout` parent is unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_tile_view.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `LinearLayout` parent is unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_tile_view.xml"
+ line="32"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `FrameLayout` parent is possibly unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_empty.xml"
+ line="22"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `RelativeLayout` layout or its `LinearLayout` parent is unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <RelativeLayout"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_with_content.xml"
+ line="28"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `FrameLayout` parent is possibly unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_small.xml"
+ line="22"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `FrameLayout` parent is possibly unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_small_horizontal.xml"
+ line="22"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `ScrollView` layout or its `LinearLayout` parent is unnecessary"
+ errorLine1=" <ScrollView"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_record_dialog.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `FrameLayout` layout or its `FrameLayout` parent is possibly unnecessary"
+ errorLine1=" <FrameLayout"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar.xml"
+ line="66"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `LinearLayout` parent is unnecessary"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml"
+ line="24"
+ column="4"/>
+ </issue>
+
+ <issue
+ id="UselessParent"
+ message="This `LinearLayout` layout or its `FrameLayout` parent is unnecessary; transfer the `background` attribute to the other view"
+ errorLine1=" <LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_dialog_row.xml"
+ line="29"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="RedundantNamespace"
+ message="This namespace declaration is redundant"
+ errorLine1=" <shape xmlns:android="http://schemas.android.com/apk/res/android">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable/rounded_ripple.xml"
+ line="19"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnusedNamespace"
+ message="Unused namespace `systemui`"
+ errorLine1=" xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar.xml"
+ line="23"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Stoor tans skermkiekie..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-af/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"ቅጽበታዊ ገፅ ዕይታ በማስቀመጥ ላይ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"جارٍ حفظ لقطة الشاشة..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Skrinşot yadda saxlanır..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Čuvanje snimka ekrana..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Захаванне скрыншота..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Екранната снимка се запазва..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"স্ক্রিনশট সেভ করা হচ্ছে..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Spašavanje snimka ekrana..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"S\'està desant la captura de pantalla..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Ukládání snímku obrazovky..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Gemmer screenshot..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-da/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Screenshot wird gespeichert..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-de/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Αποθήκευση στιγμιότυπου οθόνης..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-el/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Guardando la captura de pantalla..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es-rUS/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Guardando captura..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Kuvatõmmise salvestamine ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Tallennetaan kuvakaappausta..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fi/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"स्क्रीनशॉट सहेजा जा रहा है..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Spremanje snimke zaslona..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Képernyőkép mentése..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hu/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Սքրինշոթը պահվում է..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Menyimpan screenshot..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"המערכת שומרת את צילום המסך..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"スクリーンショットを保存しています..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"កំពុងរក្សាទុករូបថតអេក្រង់..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"캡쳐화면 저장 중..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Скриншот сакталууда..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ky/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"ກຳລັງບັນທຶກພາບໜ້າຈໍ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Išsaugoma ekrano kopija..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Notiek ekrānuzņēmuma saglabāšana..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lv/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Сликата на екранот се зачувува..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Menyimpan tangkapan skrin..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Screenshot opslaan..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-nl/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Zapisywanie zrzutu ekranu..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Salvando captura de tela..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"A guardar captura de ecrã..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Salvando captura de tela..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Se salvează captura de ecran..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Сохранение..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Prebieha ukladanie snímky obrazovky..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Shranjevanje posnetka zaslona ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Чување снимка екрана..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Skärmbilden sparas ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Inahifadhi picha ya skrini..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"กำลังบันทึกภาพหน้าจอ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Ekran görüntüsü kaydediliyor..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Збереження знімка екрана..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-uk/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Đang lưu ảnh chụp màn hình..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"正在保存屏幕截图..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"正在儲存螢幕擷取畫面..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rHK/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="screenshot_saving_title" msgid="2298349784913287333">"Ilondoloz umfanekiso weskrini..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings.xml"
+ line="77"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"በማብራት ላይ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Aktiv edilir..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Uključuje se..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Включва се..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"កំពុងបើក..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"켜는 중..."</string>"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"ກຳລັງເປີດ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"A ativar..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Se activează..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Укључује се..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Inawasha..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"กำลังเปิด..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Iyavula..."</string>"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings.xml"
+ line="292"
+ column="99"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"በማብራት ላይ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Aktiv edilir..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Uključuje se..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Включва се..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"កំពុងបើក..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"켜는 중..."</string>"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"ກຳລັງເປີດ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"A ativar..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Se activează..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Укључује се..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Inawasha..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"กำลังเปิด..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Iyavula..."</string>"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings.xml"
+ line="308"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Connecting..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rCA/strings.xml"
+ line="318"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Connecting..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rXC/strings.xml"
+ line="318"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Łączę..."</string>"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pl/strings.xml"
+ line="318"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"በማገናኘት ላይ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"جارٍ الاتصال..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ar/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"সংযোগ কৰি থকা হৈছে..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-as/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Qoşulur..."</string>"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Povezuje se..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Падлучэнне..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-be/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Установява се връзка..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"সংযুক্ত হচ্ছে..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bn/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Povezivanje..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bs/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"S\'està connectant..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ca/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Připojování..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-cs/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Connecting..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rAU/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Connecting..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rGB/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Connecting..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-en-rIN/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-es/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Ühenduse loomine ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-et/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"در حال اتصال..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fa/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Connexion en cours..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-fr/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gl/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"કનેક્ટ કરી રહ્યું છે..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-gu/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"कनेक्ट हो रहा है..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hi/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Povezivanje..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hr/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Միանում է..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-hy/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Menghubungkan..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-in/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Tengist..."</string>"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-is/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Connessione in corso..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-it/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"מתבצע חיבור..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-iw/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"接続しています..."</string>"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ja/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"დაკავშირება..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ka/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"កំពុងតភ្ជាប់..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"연결 중..."</string>"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"ກຳລັງເຊື່ອມຕໍ່..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Prisijungiama..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lt/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Се поврзува..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mk/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"കണക്റ്റുചെയ്യുന്നു..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ml/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Холбогдож байна..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mn/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"कनेक्ट करत आहे..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-mr/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Menyambung..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ms/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"ဆက်သွယ်နေ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-my/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"कनेक्ट गरिँदै छ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"ସଂଯୋଗ କରୁଛି..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-or/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pa/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rBR/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"A ligar..."</string>"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Se conectează..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Соединение..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ru/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"සම්බන්ධ වෙමින්..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-si/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Pripája sa..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sk/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Vzpostavljanje povezave ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sl/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Po lidhet..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sq/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Повезује се..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Ansluter ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sv/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Inaunganisha..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"இணைக்கிறது..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ta/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"కనెక్ట్ అవుతోంది..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-te/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"กำลังเชื่อมต่อ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Kumokonekta..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tl/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Bağlanılıyor..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-tr/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Đang kết nối..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-vi/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"連線中..."</string>"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zh-rTW/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting" msgid="2381969772953268809">"Iyaxhuma..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings.xml"
+ line="323"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"በማብራት ላይ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-am/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Aktiv edilir..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-az/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Uključuje se..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-b+sr+Latn/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Включва се..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-bg/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"កំពុងបើក..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-km/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"켜는 중..."</string>"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ko/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"ກຳລັງເປີດ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-lo/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"A ativar..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-pt-rPT/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Se activează..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ro/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Укључује се..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sr/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Inawasha..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-sw/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"กำลังเปิด..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-th/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Iyavula..."</string>"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-zu/strings.xml"
+ line="325"
+ column="97"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ನಲ್ಲಿ ಪ್ಲೇ ಆಗು..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-kn/strings.xml"
+ line="628"
+ column="94"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="quick_settings_connecting">Connecting...</string>"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values/strings.xml"
+ line="793"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace "..." with ellipsis character (…, &#8230;) ?"
+ errorLine1=" <string name="shutdown_progress" msgid="5464239146561542178">"सट डाउन गरिँदै छ..."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/values-ne/strings.xml"
+ line="878"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="IconDipSize"
+ message="The image `ic_sysbar_lights_out_dot_small.png` varies significantly in its density-independent (dip) size across the various density versions: drawable-hdpi/ic_sysbar_lights_out_dot_small.png: 5x4 dp (7x6 px), drawable-mdpi/ic_sysbar_lights_out_dot_small.png: 8x9 dp (8x9 px), drawable-xhdpi/ic_sysbar_lights_out_dot_small.png: 6x7 dp (11x13 px), drawable-xxhdpi/ic_sysbar_lights_out_dot_small.png: 4x4 dp (13x12 px)">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_lights_out_dot_small.png"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-hdpi/ic_sysbar_lights_out_dot_small.png"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_lights_out_dot_small.png"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-mdpi/ic_sysbar_lights_out_dot_small.png"/>
+ </issue>
+
+ <issue
+ id="IconDipSize"
+ message="The image `ic_sysbar_lights_out_dot_small.png` varies significantly in its density-independent (dip) size across the various density versions: drawable-sw600dp-hdpi/ic_sysbar_lights_out_dot_small.png: 6x5 dp (9x8 px), drawable-sw600dp-mdpi/ic_sysbar_lights_out_dot_small.png: 7x10 dp (7x10 px), drawable-sw600dp-xhdpi/ic_sysbar_lights_out_dot_small.png: 7x8 dp (14x15 px), drawable-sw600dp-xxhdpi/ic_sysbar_lights_out_dot_small.png: 5x5 dp (15x15 px)">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-sw600dp-xxhdpi/ic_sysbar_lights_out_dot_small.png"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_lights_out_dot_small.png"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-sw600dp-xhdpi/ic_sysbar_lights_out_dot_small.png"/>
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_lights_out_dot_small.png"/>
+ </issue>
+
+ <issue
+ id="IconDensities"
+ message="Missing the following drawables in `drawable-hdpi`: dream_preview_back_arrow.png (found in drawable-mdpi, drawable-xhdpi, drawable-xxhdpi)">
+ <location
+ file="frameworks/base/packages/SystemUI/res/drawable-hdpi"/>
+ </issue>
+
+ <issue
+ id="ButtonOrder"
+ message="Cancel button should be on the left (was "Cancel | | Confirm | "Try again"", should be "Cancel | | | Confirm | "Try again"")"
+ errorLine1=" <Button android:id="@+id/button_cancel""
+ errorLine2=" ~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/biometric_prompt_layout.xml"
+ line="156"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="TextFields"
+ message="This text field does not specify an `inputType`"
+ errorLine1=" <EditText"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml"
+ line="46"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="TextFields"
+ message="This text field does not specify an `inputType`"
+ errorLine1=" <EditText"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_broadcast_update_dialog.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`TouchHandler#onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" override fun onTouch(v: View, ev: MotionEvent): Boolean {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/ActivatableNotificationViewBinder.kt"
+ line="74"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`TouchHandler#onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View v, MotionEvent ev) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java"
+ line="71"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `CaptionsToggleImageButton` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/CaptionsToggleImageButton.java"
+ line="53"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``NotificationShadeWindowView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" getNotificationShadeWindowView().setOnTouchListener(getStatusBarWindowTouchListener());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="1158"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" return (v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java"
+ line="1477"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `ClipboardView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/tuner/ClipboardView.java"
+ line="53"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `CropView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/scroll/CropView.java"
+ line="165"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`SwipeDismissHandler#onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View view, MotionEvent event) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/DraggableConstraintLayout.java"
+ line="232"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `EmergencyButton` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java"
+ line="75"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``EmergencyButton`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mEmergencyButton.setOnTouchListener(new OnTouchListener(){"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/EmergencyCarrierArea.java"
+ line="47"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/EmergencyCarrierArea.java"
+ line="49"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `ExpandableNotificationRow` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java"
+ line="987"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" mContainer.setOnTouchListener((v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java"
+ line="2450"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `ClingWindowView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent motion) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/ImmersiveModeConfirmation.java"
+ line="479"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/Interaction.java"
+ line="29"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `KeyButtonView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java"
+ line="267"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `KeyguardPatternView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java"
+ line="241"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``LockPatternView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mLockPatternView.setOnTouchListener((v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java"
+ line="229"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" mLockPatternView.setOnTouchListener((v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java"
+ line="229"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``LockPatternView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mLockPatternView.setOnTouchListener(null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java"
+ line="258"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" private final OnTouchListener mActionButtonTouchListener = (v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java"
+ line="60"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``NumPadKey`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" button.setOnTouchListener((v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java"
+ line="97"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" button.setOnTouchListener((v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java"
+ line="97"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``NumPadKey`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" button.setOnTouchListener(null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java"
+ line="175"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `KeyguardSecurityContainer` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java"
+ line="503"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `KeyguardSecurityViewFlipper` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java"
+ line="55"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``KeyguardUserSwitcherView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mView.setOnTouchListener((v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java"
+ line="190"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" mView.setOnTouchListener((v, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java"
+ line="190"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``ListView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" listView.setOnTouchListener((v, ev) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUserSwitcherPopupMenu.java"
+ line="77"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" listView.setOnTouchListener((v, ev) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUserSwitcherPopupMenu.java"
+ line="77"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mImageView.setOnTouchListener(this::onTouch);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java"
+ line="117"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``MediaOutputSeekbar`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mSeekBar.setOnTouchListener((v, event) -> true);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java"
+ line="509"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" mSeekBar.setOnTouchListener((v, event) -> true);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java"
+ line="509"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``MediaOutputSeekbar`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mSeekBar.setOnTouchListener((v, event) -> false);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java"
+ line="515"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" mSeekBar.setOnTouchListener((v, event) -> false);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java"
+ line="515"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``FrameLayout`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mIconAreaLayout.setOnTouchListener(((iconV, event) -> false));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java"
+ line="522"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" mIconAreaLayout.setOnTouchListener(((iconV, event) -> false));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java"
+ line="522"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``FrameLayout`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mIconAreaLayout.setOnTouchListener(((iconV, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java"
+ line="528"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" mIconAreaLayout.setOnTouchListener(((iconV, event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java"
+ line="528"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `MediaScrollView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" override fun onTouchEvent(ev: MotionEvent?): Boolean {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaScrollView.kt"
+ line="106"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``NavigationBarView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mView.setOnTouchListener(this::onNavigationTouch);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java"
+ line="782"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `NavigationBarView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java"
+ line="383"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `NearestTouchFrame` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java"
+ line="207"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `NonInterceptingScrollView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/NonInterceptingScrollView.java"
+ line="46"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``FrameLayout`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" super.setOnTouchListener(touchHandler);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelView.java"
+ line="111"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`TouchHandler#onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java"
+ line="5018"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `NotificationShadeWindowView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java"
+ line="133"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `NotificationStackScrollLayout` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java"
+ line="3365"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `NumPadButton` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/NumPadButton.java"
+ line="84"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `NumPadKey` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/NumPadKey.java"
+ line="164"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `ObservableScrollView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java"
+ line="70"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `PhoneStatusBarView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java"
+ line="208"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`QSContainerImpl#performClick` should call `super#performClick`"
+ errorLine1=" public boolean performClick() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java"
+ line="106"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java"
+ line="52"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``NonInterceptingScrollView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mQSPanelContainer.setOnTouchListener(null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java"
+ line="84"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``NonInterceptingScrollView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mQSPanelContainer.setOnTouchListener(mContainerTouchHandler);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java"
+ line="97"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``NonInterceptingScrollView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mQSPanelContainer.setOnTouchListener(null);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java"
+ line="105"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java"
+ line="77"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``PagedTileLayout`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" pagedTileLayout.setOnTouchListener(mTileLayoutTouchListener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java"
+ line="143"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `QSScrollLayout` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java"
+ line="77"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `QuickStatusBarHeader` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java"
+ line="74"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `RemoteInputView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java"
+ line="409"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``SeekBar`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" bar.setOnTouchListener(SeekBarTouchListener(this, bar))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt"
+ line="348"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`SeekBarTouchListener#onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" override fun onTouch(view: View, event: MotionEvent): Boolean {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt"
+ line="456"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `SettingsButton` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java"
+ line="63"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`SimpleMirrorWindowControl#onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/SimpleMirrorWindowControl.java"
+ line="119"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `ToggleSeekBar` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java"
+ line="43"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `WalletView` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java"
+ line="138"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`onTouch` lambda should call `View#performClick` when a click is detected"
+ errorLine1=" final View.OnTouchListener filterTouchListener = (View v, MotionEvent event) -> {"
+ errorLine2=" ^">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingActivity.java"
+ line="106"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``Button`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mAlert.getButton(BUTTON_POSITIVE).setOnTouchListener(filterTouchListener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingActivity.java"
+ line="121"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mDragView.setOnTouchListener(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="1015"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mCloseView.setOnTouchListener(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="1020"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mTopLeftCornerView.setOnTouchListener(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="1021"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mTopRightCornerView.setOnTouchListener(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="1022"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mBottomLeftCornerView.setOnTouchListener(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="1023"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mBottomRightCornerView.setOnTouchListener(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="1024"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="`WindowMagnificationController#onTouch` should call `View#performClick` when a click is detected"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java"
+ line="1172"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view ``LinearLayout`` has `setOnTouchListener` called on it but does not override `performClick`"
+ errorLine1=" mSettingView.setOnTouchListener(this::onTouch);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java"
+ line="516"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml"
+ line="38"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/auth_biometric_background.xml"
+ line="26"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/bindable_status_bar_icon.xml"
+ line="25"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/biometric_prompt_layout.xml"
+ line="23"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/bluetooth_device_item.xml"
+ line="28"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/bluetooth_device_item.xml"
+ line="85"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/bluetooth_tile_dialog.xml"
+ line="170"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/broadcast_dialog.xml"
+ line="29"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/chipbar.xml"
+ line="65"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/chipbar.xml"
+ line="75"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/clipboard_overlay.xml"
+ line="27"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/clipboard_overlay.xml"
+ line="138"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/clipboard_overlay.xml"
+ line="143"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/clipboard_overlay.xml"
+ line="177"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/connected_device_signal.xml"
+ line="33"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/connected_display_chip.xml"
+ line="39"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/contrast_dialog.xml"
+ line="41"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/contrast_dialog.xml"
+ line="73"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/contrast_dialog.xml"
+ line="105"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/controls_app_item.xml"
+ line="35"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/controls_base_item.xml"
+ line="30"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/controls_base_item.xml"
+ line="115"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="40"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/fgs_manager_app_item.xml"
+ line="25"
+ column="4"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/global_actions_grid_item_lite.xml"
+ line="25"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml"
+ line="32"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/global_actions_power_item.xml"
+ line="25"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/global_actions_view.xml"
+ line="43"
+ column="8"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/hybrid_conversation_notification.xml"
+ line="30"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/immersive_mode_cling.xml"
+ line="29"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/immersive_mode_cling.xml"
+ line="36"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/immersive_mode_cling.xml"
+ line="43"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="104"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="138"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="264"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="295"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="326"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml"
+ line="369"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_list_item.xml"
+ line="36"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/internet_list_item.xml"
+ line="67"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml"
+ line="27"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1="<ImageView xmlns:android="http://schemas.android.com/apk/res/android""
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/keyboard_shortcuts_key_icon_view.xml"
+ line="18"
+ column="2"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView android:id="@+id/multi_user_avatar""
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/keyguard_status_bar.xml"
+ line="55"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/log_access_user_consent_dialog_permission.xml"
+ line="41"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/long_screenshot.xml"
+ line="74"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/long_screenshot.xml"
+ line="92"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/long_screenshot.xml"
+ line="156"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/magnifier_controllers.xml"
+ line="29"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_broadcast_area.xml"
+ line="34"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_broadcast_area.xml"
+ line="41"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_broadcast_area.xml"
+ line="80"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_broadcast_area.xml"
+ line="112"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_broadcast_area.xml"
+ line="130"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_list_item.xml"
+ line="54"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_recommendation_view.xml"
+ line="20"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="32"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="138"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageButton"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="187"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageButton"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="230"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageButton"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="273"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageButton"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="299"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageButton"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="309"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageButton"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="319"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageButton"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="329"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageButton"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_session_view.xml"
+ line="339"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/mobile_signal_group.xml"
+ line="31"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/mobile_signal_group.xml"
+ line="39"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/mobile_signal_group.xml"
+ line="48"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notif_half_shelf.xml"
+ line="53"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="69"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="77"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="85"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="232"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="283"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_conversation_info.xml"
+ line="335"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="39"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="180"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="231"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="283"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_snooze.xml"
+ line="44"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/ongoing_call_chip.xml"
+ line="39"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/overlay_action_chip.xml"
+ line="34"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="38"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_initial_layout.xml"
+ line="43"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_placeholder_layout.xml"
+ line="50"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_space_tile_view.xml"
+ line="38"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_status_scrim_layout.xml"
+ line="21"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_status_scrim_layout.xml"
+ line="32"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_status_scrim_layout.xml"
+ line="36"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_status_scrim_layout.xml"
+ line="48"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_status_scrim_layout.xml"
+ line="52"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_empty_layout.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_large_empty.xml"
+ line="33"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_large_empty.xml"
+ line="59"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_large_with_content.xml"
+ line="36"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_large_with_content.xml"
+ line="42"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_large_with_content.xml"
+ line="103"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_large_with_content.xml"
+ line="124"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_empty.xml"
+ line="35"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_empty.xml"
+ line="39"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_with_content.xml"
+ line="49"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_with_content.xml"
+ line="55"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_with_content.xml"
+ line="83"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_medium_with_content.xml"
+ line="147"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_small.xml"
+ line="34"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_small.xml"
+ line="42"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_small_horizontal.xml"
+ line="34"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_small_horizontal.xml"
+ line="42"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_suppressed_layout.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_with_suppression_detail_content_horizontal.xml"
+ line="28"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_with_suppression_detail_content_vertical.xml"
+ line="33"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_with_suppression_detail_content_vertical.xml"
+ line="53"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_work_profile_quiet_layout.xml"
+ line="25"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView android:id="@+id/work_widget_badge_icon""
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_work_profile_quiet_layout.xml"
+ line="32"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/privacy_dialog_item.xml"
+ line="30"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/privacy_dialog_item.xml"
+ line="53"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/privacy_dialog_item_v2.xml"
+ line="71"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/qs_dialog_secondary_mobile_network.xml"
+ line="26"
+ column="3"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/qs_dialog_secondary_mobile_network.xml"
+ line="56"
+ column="3"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/qs_tile_side_icon.xml"
+ line="23"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/qs_user_detail_item.xml"
+ line="55"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/quick_settings_footer_dialog_parental_controls.xml"
+ line="30"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/remote_input.xml"
+ line="46"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/remote_input.xml"
+ line="54"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="48"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="55"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="65"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="91"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="98"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="108"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="134"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="141"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml"
+ line="151"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="44"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="51"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="61"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="84"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="91"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="101"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="125"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="132"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml"
+ line="142"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="44"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="52"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="63"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="87"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="95"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="106"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="130"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="138"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml"
+ line="149"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_record_dialog.xml"
+ line="43"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_record_dialog.xml"
+ line="69"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screen_record_dialog.xml"
+ line="103"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot.xml"
+ line="31"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_shelf.xml"
+ line="83"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_shelf.xml"
+ line="102"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_shelf.xml"
+ line="113"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_static.xml"
+ line="23"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_static.xml"
+ line="95"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_static.xml"
+ line="114"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_static.xml"
+ line="125"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml"
+ line="12"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/screenshot_work_profile_first_run.xml"
+ line="36"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/seekbar_with_icon_buttons.xml"
+ line="33"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/seekbar_with_icon_buttons.xml"
+ line="60"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/sensor_use_started_title.xml"
+ line="32"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/sensor_use_started_title.xml"
+ line="39"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/shelf_action_chip.xml"
+ line="28"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar.xml"
+ line="33"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView android:id="@+id/current_user_avatar""
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar_user_chip_container.xml"
+ line="28"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar_wifi_group_inner.xml"
+ line="34"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/status_bar_wifi_group_inner.xml"
+ line="42"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/text_toast.xml"
+ line="33"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/tuner_shortcut_item.xml"
+ line="26"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/tuner_widget_settings_switch.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/udfps_enroll_view.xml"
+ line="32"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/udfps_enroll_view.xml"
+ line="38"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml"
+ line="27"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml"
+ line="23"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_ringer_drawer.xml"
+ line="65"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_ringer_drawer.xml"
+ line="83"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_ringer_drawer.xml"
+ line="101"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/volume_ringer_drawer.xml"
+ line="125"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/window_magnifier_view.xml"
+ line="116"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/window_magnifier_view.xml"
+ line="126"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" <ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/wireless_charging_layout.xml"
+ line="44"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="LabelFor"
+ message="Missing accessibility label: provide either a view with an `android:labelFor` that references this view or provide an `android:hint`"
+ errorLine1=" <EditText"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml"
+ line="46"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="LabelFor"
+ message="Missing accessibility label: provide either a view with an `android:labelFor` that references this view or provide an `android:hint`"
+ errorLine1=" <EditText"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/controls_dialog_pin.xml"
+ line="24"
+ column="4"/>
+ </issue>
+
+ <issue
+ id="LabelFor"
+ message="Missing accessibility label: provide either a view with an `android:labelFor` that references this view or provide an `android:hint`"
+ errorLine1=" <EditText"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/media_output_broadcast_update_dialog.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="SetTextI18n"
+ message="Number formatting does not take into account locale settings. Consider using `String.format` instead."
+ errorLine1=" mDigitText.setText(Integer.toString(mDigit));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/keyguard/NumPadKey.java"
+ line="115"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="SetTextI18n"
+ message="Number formatting does not take into account locale settings. Consider using `String.format` instead."
+ errorLine1=" if (row.number != null) row.number.setText(Integer.toString(vlevel));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java"
+ line="2026"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="HardcodedText"
+ message="Hardcoded string "Yes", should use `@string` resource"
+ errorLine1=" android:text="Yes""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="89"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="HardcodedText"
+ message="Hardcoded string "No", should use `@string` resource"
+ errorLine1=" android:text="No""
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/feedback_info.xml"
+ line="100"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="RelativeOverlap"
+ message="`@id/done` can overlap `@id/turn_off_notifications` if @string/inline_turn_off_notifications, @string/inline_ok_button grow due to localized text expansion"
+ errorLine1=" <TextView"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_info.xml"
+ line="342"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="RelativeOverlap"
+ message="`@id/undo` can overlap `@id/expand_button` if @string/snooze_undo grows due to localized text expansion"
+ errorLine1=" <TextView"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/notification_snooze.xml"
+ line="54"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="RelativeOverlap"
+ message="`@id/done` can overlap `@id/turn_off_notifications` if @string/inline_turn_off_notifications, @string/inline_done_button grow due to localized text expansion"
+ errorLine1=" <TextView"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/partial_conversation_info.xml"
+ line="156"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="RelativeOverlap"
+ message="`@id/punctuation3` can overlap `@id/punctuation4` if @id/punctuation4, @id/punctuation3 grow due to localized text expansion"
+ errorLine1=" <TextView"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml"
+ line="53"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="RelativeOverlap"
+ message="`@id/punctuation5` can overlap `@id/punctuation1` if @id/punctuation1, @id/punctuation5 grow due to localized text expansion"
+ errorLine1=" <TextView"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml"
+ line="81"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="RelativeOverlap"
+ message="`@id/punctuation5` can overlap `@id/punctuation2` if @id/punctuation2, @id/punctuation5 grow due to localized text expansion"
+ errorLine1=" <TextView"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml"
+ line="81"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="RelativeOverlap"
+ message="`@id/punctuation5` can overlap `@id/punctuation6` if @id/punctuation6, @id/punctuation5 grow due to localized text expansion"
+ errorLine1=" <TextView"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml"
+ line="81"
+ column="6"/>
+ </issue>
+
+</issues>
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
index ed2d20c..aa70c45 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
@@ -18,7 +18,6 @@
package com.android.keyguard
import android.content.res.Configuration
-import android.hardware.biometrics.BiometricRequestConstants
import android.media.AudioManager
import android.telephony.TelephonyManager
import android.testing.TestableLooper.RunWithLooper
@@ -41,8 +40,6 @@
import com.android.systemui.Flags as AConfigFlags
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.FaceAuthAccessibilityDelegate
-import com.android.systemui.biometrics.SideFpsController
-import com.android.systemui.biometrics.SideFpsUiRequestSource
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants
import com.android.systemui.classifier.FalsingA11yDelegate
@@ -70,7 +67,6 @@
import com.android.systemui.scene.shared.model.FakeSceneDataSource
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.fakeSceneDataSource
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.DevicePostureController
import com.android.systemui.statusbar.policy.DeviceProvisionedController
@@ -87,7 +83,6 @@
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.GlobalSettings
import com.google.common.truth.Truth
-import java.util.Optional
import junit.framework.Assert
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
@@ -143,7 +138,6 @@
@Mock private lateinit var userSwitcherController: UserSwitcherController
@Mock private lateinit var sessionTracker: SessionTracker
@Mock private lateinit var keyguardViewController: KeyguardViewController
- @Mock private lateinit var sideFpsController: SideFpsController
@Mock private lateinit var keyguardPasswordViewControllerMock: KeyguardPasswordViewController
@Mock private lateinit var falsingA11yDelegate: FalsingA11yDelegate
@Mock private lateinit var telephonyManager: TelephonyManager
@@ -214,9 +208,6 @@
mSetFlagsRule.enableFlags(
AConfigFlags.FLAG_REVAMPED_BOUNCER_MESSAGES,
)
- mSetFlagsRule.disableFlags(
- FLAG_SIDEFPS_CONTROLLER_REFACTOR,
- )
if (!SceneContainerFlag.isEnabled) {
mSetFlagsRule.disableFlags(
AConfigFlags.FLAG_KEYGUARD_WM_STATE_REFACTOR,
@@ -273,7 +264,6 @@
featureFlags,
globalSettings,
sessionTracker,
- Optional.of(sideFpsController),
falsingA11yDelegate,
telephonyManager,
viewMediatorCallback,
@@ -781,24 +771,6 @@
}
@Test
- fun sideFpsControllerShow() {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
- underTest.updateSideFpsVisibility(/* isVisible= */ true)
- verify(sideFpsController)
- .show(
- SideFpsUiRequestSource.PRIMARY_BOUNCER,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD
- )
- }
-
- @Test
- fun sideFpsControllerHide() {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
- underTest.updateSideFpsVisibility(/* isVisible= */ false)
- verify(sideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER)
- }
-
- @Test
fun setExpansion_setsAlpha() {
underTest.setExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
verify(view).alpha = 1f
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandlerTest.java
index 04c4efb..fefe5a0 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandlerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandlerTest.java
@@ -149,7 +149,6 @@
mUiEventLogger);
when(mScrimManager.getCurrentController()).thenReturn(mScrimController);
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(false);
when(mValueAnimatorCreator.create(anyFloat(), anyFloat())).thenReturn(mValueAnimator);
when(mVelocityTrackerFactory.obtain()).thenReturn(mVelocityTracker);
when(mFlingAnimationUtils.getMinVelocityPxPerSecond()).thenReturn(Float.MAX_VALUE);
@@ -193,11 +192,6 @@
2)).isTrue();
}
- private enum Direction {
- DOWN,
- UP,
- }
-
@Test
public void testSwipeUp_whenBouncerInitiallyShowing_reduceHeightWithExclusionRects() {
mTouchHandler.getTouchInitiationRegion(SCREEN_BOUNDS, mRegion,
@@ -210,7 +204,7 @@
SCREEN_HEIGHT_PX * MIN_BOUNCER_HEIGHT;
final int minAllowableBottom = SCREEN_HEIGHT_PX - Math.round(minBouncerHeight);
- expected.set(0, minAllowableBottom , SCREEN_WIDTH_PX, SCREEN_HEIGHT_PX);
+ expected.set(0, minAllowableBottom, SCREEN_WIDTH_PX, SCREEN_HEIGHT_PX);
assertThat(bounds).isEqualTo(expected);
@@ -278,69 +272,11 @@
}
/**
- * Makes sure swiping up when bouncer initially showing doesn't change the expansion amount.
- */
- @DisableFlags(Flags.FLAG_DREAM_OVERLAY_BOUNCER_SWIPE_DIRECTION_FILTERING)
- @Test
- public void testSwipeUp_whenBouncerInitiallyShowing_doesNotSetExpansion() {
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(true);
-
- mTouchHandler.onSessionStart(mTouchSession);
- ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerCaptor =
- ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class);
- verify(mTouchSession).registerGestureListener(gestureListenerCaptor.capture());
-
- final OnGestureListener gestureListener = gestureListenerCaptor.getValue();
-
- final float percent = .3f;
- final float distanceY = SCREEN_HEIGHT_PX * percent;
-
- // Swiping up near the top of the screen where the touch initiation region is.
- final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
- 0, distanceY, 0);
- final MotionEvent event2 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
- 0, 0, 0);
-
- assertThat(gestureListener.onScroll(event1, event2, 0, distanceY)).isTrue();
-
- verify(mScrimController, never()).expand(any());
- }
-
- /**
- * Makes sure swiping up when bouncer initially showing doesn't change the expansion amount.
- */
- @Test
- @EnableFlags(Flags.FLAG_DREAM_OVERLAY_BOUNCER_SWIPE_DIRECTION_FILTERING)
- public void testSwipeUp_whenBouncerInitiallyShowing_doesNotSetExpansion_directionFiltering() {
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(true);
-
- mTouchHandler.onSessionStart(mTouchSession);
- ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerCaptor =
- ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class);
- verify(mTouchSession).registerGestureListener(gestureListenerCaptor.capture());
-
- final OnGestureListener gestureListener = gestureListenerCaptor.getValue();
-
- final float percent = .3f;
- final float distanceY = SCREEN_HEIGHT_PX * percent;
-
- // Swiping up near the top of the screen where the touch initiation region is.
- final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
- 0, distanceY, 0);
- final MotionEvent event2 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
- 0, 0, 0);
-
- assertThat(gestureListener.onScroll(event1, event2, 0, distanceY)).isFalse();
-
- verify(mScrimController, never()).expand(any());
- }
-
- /**
- * Makes sure swiping down when bouncer initially hidden doesn't change the expansion amount.
+ * Makes sure swiping down doesn't change the expansion amount.
*/
@Test
@DisableFlags(Flags.FLAG_DREAM_OVERLAY_BOUNCER_SWIPE_DIRECTION_FILTERING)
- public void testSwipeDown_whenBouncerInitiallyHidden_doesNotSetExpansion() {
+ public void testSwipeDown_doesNotSetExpansion() {
mTouchHandler.onSessionStart(mTouchSession);
ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerCaptor =
ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class);
@@ -401,34 +337,8 @@
final OnGestureListener gestureListener = gestureListenerCaptor.getValue();
- verifyScroll(.3f, Direction.UP, false, gestureListener);
-
- // Ensure that subsequent gestures are treated as expanding even if the bouncer state
- // changes.
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(true);
- verifyScroll(.7f, Direction.UP, false, gestureListener);
- }
-
- /**
- * Makes sure the expansion amount is proportional to scroll.
- */
- @Test
- public void testSwipeDown_setsCorrectExpansionAmount() {
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(true);
-
- mTouchHandler.onSessionStart(mTouchSession);
- ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerCaptor =
- ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class);
- verify(mTouchSession).registerGestureListener(gestureListenerCaptor.capture());
-
- final OnGestureListener gestureListener = gestureListenerCaptor.getValue();
-
- verifyScroll(.3f, Direction.DOWN, true, gestureListener);
-
- // Ensure that subsequent gestures are treated as collapsing even if the bouncer state
- // changes.
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(false);
- verifyScroll(.7f, Direction.DOWN, true, gestureListener);
+ verifyScroll(.3f, gestureListener);
+ verifyScroll(.7f, gestureListener);
}
/**
@@ -493,25 +403,24 @@
verify(mCentralSurfaces, never()).awakenDreams();
}
- private void verifyScroll(float percent, Direction direction,
- boolean isBouncerInitiallyShowing, GestureDetector.OnGestureListener gestureListener) {
+ private void verifyScroll(float percent,
+ OnGestureListener gestureListener) {
final float distanceY = SCREEN_HEIGHT_PX * percent;
final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
- 0, direction == Direction.UP ? SCREEN_HEIGHT_PX : 0, 0);
+ 0, SCREEN_HEIGHT_PX, 0);
final MotionEvent event2 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
- 0, direction == Direction.UP ? SCREEN_HEIGHT_PX - distanceY : distanceY, 0);
+ 0, SCREEN_HEIGHT_PX - distanceY, 0);
reset(mScrimController);
assertThat(gestureListener.onScroll(event1, event2, 0,
- direction == Direction.UP ? distanceY : -distanceY))
+ distanceY))
.isTrue();
// Ensure only called once
verify(mScrimController).expand(any());
- final float expansion = isBouncerInitiallyShowing ? percent : 1 - percent;
- final float dragDownAmount = event2.getY() - event1.getY();
+ final float expansion = 1 - percent;
// Ensure correct expansion passed in.
ShadeExpansionChangeEvent event =
@@ -529,7 +438,7 @@
final float expansion = 1 - swipeUpPercentage;
// The upward velocity is ignored.
final float velocityY = -1;
- swipeToPosition(swipeUpPercentage, Direction.UP, velocityY);
+ swipeToPosition(swipeUpPercentage, velocityY);
verify(mValueAnimatorCreator).create(eq(expansion),
eq(KeyguardBouncerConstants.EXPANSION_HIDDEN));
@@ -552,7 +461,7 @@
final float expansion = 1 - swipeUpPercentage;
// The downward velocity is ignored.
final float velocityY = 1;
- swipeToPosition(swipeUpPercentage, Direction.UP, velocityY);
+ swipeToPosition(swipeUpPercentage, velocityY);
verify(mValueAnimatorCreator).create(eq(expansion),
eq(KeyguardBouncerConstants.EXPANSION_VISIBLE));
@@ -573,57 +482,6 @@
}
/**
- * Tests that ending a downward swipe above the set threshold will continue the expansion,
- * but will not trigger logging of the DREAM_SWIPED event.
- */
- @Test
- public void testSwipeDownPositionAboveThreshold_expandsBouncer_doesNotLog() {
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(true);
-
- final float swipeDownPercentage = .3f;
- // The downward velocity is ignored.
- final float velocityY = 1;
- swipeToPosition(swipeDownPercentage, Direction.DOWN, velocityY);
-
- verify(mValueAnimatorCreator).create(eq(swipeDownPercentage),
- eq(KeyguardBouncerConstants.EXPANSION_VISIBLE));
- verify(mValueAnimator, never()).addListener(any());
-
- verify(mFlingAnimationUtils).apply(eq(mValueAnimator),
- eq(SCREEN_HEIGHT_PX * swipeDownPercentage),
- eq(SCREEN_HEIGHT_PX * KeyguardBouncerConstants.EXPANSION_VISIBLE),
- eq(velocityY), eq((float) SCREEN_HEIGHT_PX));
- verify(mValueAnimator).start();
- verify(mUiEventLogger, never()).log(any());
- }
-
- /**
- * Tests that swiping down with a speed above the set threshold leads to bouncer collapsing
- * down.
- */
- @Test
- public void testSwipeDownVelocityAboveMin_collapsesBouncer() {
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(true);
- when(mFlingAnimationUtils.getMinVelocityPxPerSecond()).thenReturn((float) 0);
-
- // The ending position above the set threshold is ignored.
- final float swipeDownPercentage = .3f;
- final float velocityY = 1;
- swipeToPosition(swipeDownPercentage, Direction.DOWN, velocityY);
-
- verify(mValueAnimatorCreator).create(eq(swipeDownPercentage),
- eq(KeyguardBouncerConstants.EXPANSION_HIDDEN));
- verify(mValueAnimator, never()).addListener(any());
-
- verify(mFlingAnimationUtilsClosing).apply(eq(mValueAnimator),
- eq(SCREEN_HEIGHT_PX * swipeDownPercentage),
- eq(SCREEN_HEIGHT_PX * KeyguardBouncerConstants.EXPANSION_HIDDEN),
- eq(velocityY), eq((float) SCREEN_HEIGHT_PX));
- verify(mValueAnimator).start();
- verify(mUiEventLogger, never()).log(any());
- }
-
- /**
* Tests that swiping up with a speed above the set threshold will continue the expansion.
*/
@Test
@@ -634,7 +492,7 @@
final float swipeUpPercentage = .3f;
final float expansion = 1 - swipeUpPercentage;
final float velocityY = -1;
- swipeToPosition(swipeUpPercentage, Direction.UP, velocityY);
+ swipeToPosition(swipeUpPercentage, velocityY);
verify(mValueAnimatorCreator).create(eq(expansion),
eq(KeyguardBouncerConstants.EXPANSION_VISIBLE));
@@ -654,26 +512,6 @@
verify(mUiEventLogger).log(BouncerSwipeTouchHandler.DreamEvent.DREAM_BOUNCER_FULLY_VISIBLE);
}
- /**
- * Ensures {@link CentralSurfaces}
- */
- @Test
- public void testInformBouncerShowingOnExpand() {
- swipeToPosition(1f, Direction.UP, 0);
- }
-
- /**
- * Ensures {@link CentralSurfaces}
- */
- @Test
- public void testInformBouncerHidingOnCollapse() {
- // Must swipe up to set initial state.
- swipeToPosition(1f, Direction.UP, 0);
- Mockito.clearInvocations(mCentralSurfaces);
-
- swipeToPosition(0f, Direction.DOWN, 0);
- }
-
@Test
public void testTouchSessionOnRemovedCalledTwice() {
mTouchHandler.onSessionStart(mTouchSession);
@@ -684,7 +522,7 @@
onRemovedCallbackCaptor.getValue().onRemoved();
}
- private void swipeToPosition(float percent, Direction direction, float velocityY) {
+ private void swipeToPosition(float percent, float velocityY) {
Mockito.clearInvocations(mTouchSession);
mTouchHandler.onSessionStart(mTouchSession);
ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerCaptor =
@@ -699,12 +537,12 @@
final float distanceY = SCREEN_HEIGHT_PX * percent;
final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
- 0, direction == Direction.UP ? SCREEN_HEIGHT_PX : 0, 0);
+ 0, SCREEN_HEIGHT_PX, 0);
final MotionEvent event2 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
- 0, direction == Direction.UP ? SCREEN_HEIGHT_PX - distanceY : distanceY, 0);
+ 0, SCREEN_HEIGHT_PX - distanceY, 0);
assertThat(gestureListenerCaptor.getValue().onScroll(event1, event2, 0,
- direction == Direction.UP ? distanceY : -distanceY))
+ distanceY))
.isTrue();
final MotionEvent upEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/ShadeTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/ShadeTouchHandlerTest.java
index 27bffd0..11a4241 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/ShadeTouchHandlerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/ShadeTouchHandlerTest.java
@@ -18,8 +18,10 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
import android.view.GestureDetector;
import android.view.MotionEvent;
@@ -28,7 +30,6 @@
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.shade.ShadeViewController;
import com.android.systemui.shared.system.InputChannelCompat;
import com.android.systemui.statusbar.phone.CentralSurfaces;
@@ -36,6 +37,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -49,66 +51,89 @@
CentralSurfaces mCentralSurfaces;
@Mock
- ShadeViewController mShadeViewController;
-
- @Mock
TouchHandler.TouchSession mTouchSession;
ShadeTouchHandler mTouchHandler;
+ @Captor
+ ArgumentCaptor<GestureDetector.OnGestureListener> mGestureListenerCaptor;
+ @Captor
+ ArgumentCaptor<InputChannelCompat.InputEventListener> mInputListenerCaptor;
+
private static final int TOUCH_HEIGHT = 20;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mTouchHandler = new ShadeTouchHandler(Optional.of(mCentralSurfaces), mShadeViewController,
- TOUCH_HEIGHT);
+
+ mTouchHandler = new ShadeTouchHandler(Optional.of(mCentralSurfaces), TOUCH_HEIGHT);
+ }
+
+ // Verifies that a swipe down in the gesture region is captured by the shade touch handler.
+ @Test
+ public void testSwipeDown_captured() {
+ final boolean captured = swipe(Direction.DOWN);
+
+ assertThat(captured).isTrue();
+ }
+
+ // Verifies that a swipe in the upward direction is not catpured.
+ @Test
+ public void testSwipeUp_notCaptured() {
+ final boolean captured = swipe(Direction.UP);
+
+ // Motion events not captured as the swipe is going in the wrong direction.
+ assertThat(captured).isFalse();
+ }
+
+ // Verifies that a swipe down forwards captured touches to the shade window for handling.
+ @Test
+ public void testSwipeDown_sentToShadeWindow() {
+ swipe(Direction.DOWN);
+
+ // Both motion events are sent for the shade window to process.
+ verify(mCentralSurfaces, times(2)).handleExternalShadeWindowTouch(any());
+ }
+
+ // Verifies that a swipe down is not forwarded to the shade window.
+ @Test
+ public void testSwipeUp_touchesNotSent() {
+ swipe(Direction.UP);
+
+ // Motion events are not sent for the shade window to process as the swipe is going in the
+ // wrong direction.
+ verify(mCentralSurfaces, never()).handleExternalShadeWindowTouch(any());
}
/**
- * Verify that touches aren't handled when the bouncer is showing.
+ * Simulates a swipe in the given direction and returns true if the touch was intercepted by the
+ * touch handler's gesture listener.
+ * <p>
+ * Swipe down starts from a Y coordinate of 0 and goes downward. Swipe up starts from the edge
+ * of the gesture region, {@link #TOUCH_HEIGHT}, and goes upward to 0.
*/
- @Test
- public void testInactiveOnBouncer() {
- when(mCentralSurfaces.isBouncerShowing()).thenReturn(true);
+ private boolean swipe(Direction direction) {
+ Mockito.clearInvocations(mTouchSession);
mTouchHandler.onSessionStart(mTouchSession);
- verify(mTouchSession).pop();
+
+ verify(mTouchSession).registerGestureListener(mGestureListenerCaptor.capture());
+ verify(mTouchSession).registerInputListener(mInputListenerCaptor.capture());
+
+ final float startY = direction == Direction.UP ? TOUCH_HEIGHT : 0;
+ final float endY = direction == Direction.UP ? 0 : TOUCH_HEIGHT;
+
+ // Send touches to the input and gesture listener.
+ final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, startY, 0);
+ final MotionEvent event2 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, endY, 0);
+ mInputListenerCaptor.getValue().onInputEvent(event1);
+ mInputListenerCaptor.getValue().onInputEvent(event2);
+ final boolean captured = mGestureListenerCaptor.getValue().onScroll(event1, event2, 0,
+ startY - endY);
+
+ return captured;
}
- /**
- * Make sure {@link ShadeTouchHandler}
- */
- @Test
- public void testTouchPilferingOnScroll() {
- final MotionEvent motionEvent1 = Mockito.mock(MotionEvent.class);
- final MotionEvent motionEvent2 = Mockito.mock(MotionEvent.class);
-
- final ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerArgumentCaptor =
- ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class);
-
- mTouchHandler.onSessionStart(mTouchSession);
- verify(mTouchSession).registerGestureListener(gestureListenerArgumentCaptor.capture());
-
- assertThat(gestureListenerArgumentCaptor.getValue()
- .onScroll(motionEvent1, motionEvent2, 1, 1))
- .isTrue();
+ private enum Direction {
+ DOWN, UP,
}
-
- /**
- * Ensure touches are propagated to the {@link ShadeViewController}.
- */
- @Test
- public void testEventPropagation() {
- final MotionEvent motionEvent = Mockito.mock(MotionEvent.class);
-
- final ArgumentCaptor<InputChannelCompat.InputEventListener>
- inputEventListenerArgumentCaptor =
- ArgumentCaptor.forClass(InputChannelCompat.InputEventListener.class);
-
- mTouchHandler.onSessionStart(mTouchSession);
- verify(mTouchSession).registerInputListener(inputEventListenerArgumentCaptor.capture());
- inputEventListenerArgumentCaptor.getValue().onInputEvent(motionEvent);
- verify(mShadeViewController).handleExternalTouch(motionEvent);
- }
-
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
index 289896e01..f4ad764 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -145,8 +145,6 @@
@Mock
private UdfpsController mUdfpsController;
@Mock
- private SideFpsController mSideFpsController;
- @Mock
private DisplayManager mDisplayManager;
@Mock
private WakefulnessLifecycle mWakefulnessLifecycle;
@@ -1064,14 +1062,12 @@
TestableAuthController(Context context) {
super(context, null /* applicationCoroutineScope */,
mExecution, mCommandQueue, mActivityTaskManager, mWindowManager,
- mFingerprintManager, mFaceManager, () -> mUdfpsController,
- () -> mSideFpsController, mDisplayManager, mWakefulnessLifecycle,
- mPanelInteractionDetector, mUserManager, mLockPatternUtils, () -> mUdfpsLogger,
- () -> mLogContextInteractor,
- () -> mBiometricPromptCredentialInteractor,
- () -> mPromptSelectionInteractor, () -> mCredentialViewModel,
- () -> mPromptViewModel, mInteractionJankMonitor, mHandler, mBackgroundExecutor,
- mUdfpsUtils, mVibratorHelper);
+ mFingerprintManager, mFaceManager, () -> mUdfpsController, mDisplayManager,
+ mWakefulnessLifecycle, mPanelInteractionDetector, mUserManager,
+ mLockPatternUtils, () -> mUdfpsLogger, () -> mLogContextInteractor,
+ () -> mBiometricPromptCredentialInteractor, () -> mPromptSelectionInteractor,
+ () -> mCredentialViewModel, () -> mPromptViewModel, mInteractionJankMonitor,
+ mHandler, mBackgroundExecutor, mUdfpsUtils, mVibratorHelper);
}
@Override
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
deleted file mode 100644
index 07e9815..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
+++ /dev/null
@@ -1,898 +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.systemui.biometrics
-
-import android.animation.Animator
-import android.app.ActivityManager
-import android.app.ActivityTaskManager
-import android.content.ComponentName
-import android.graphics.Insets
-import android.graphics.Rect
-import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_KEYGUARD
-import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_SETTINGS
-import android.hardware.biometrics.BiometricRequestConstants.REASON_UNKNOWN
-import android.hardware.biometrics.SensorLocationInternal
-import android.hardware.biometrics.SensorProperties
-import android.hardware.display.DisplayManager
-import android.hardware.display.DisplayManagerGlobal
-import android.hardware.fingerprint.FingerprintManager
-import android.hardware.fingerprint.FingerprintSensorProperties
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
-import android.hardware.fingerprint.ISidefpsController
-import android.os.Handler
-import android.testing.TestableLooper
-import android.view.Display
-import android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS
-import android.view.DisplayInfo
-import android.view.LayoutInflater
-import android.view.Surface
-import android.view.View
-import android.view.ViewPropertyAnimator
-import android.view.WindowInsets
-import android.view.WindowManager
-import android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION
-import android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY
-import android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG
-import android.view.WindowMetrics
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.airbnb.lottie.LottieAnimationView
-import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.SysuiTestableContext
-import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
-import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
-import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl
-import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
-import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
-import com.android.systemui.display.data.repository.FakeDisplayRepository
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
-import com.android.systemui.plugins.statusbar.StatusBarStateController
-import com.android.systemui.res.R
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
-import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.time.FakeSystemClock
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestCoroutineScope
-import kotlinx.coroutines.test.TestScope
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.Captor
-import org.mockito.Mock
-import org.mockito.Mockito.any
-import org.mockito.Mockito.anyFloat
-import org.mockito.Mockito.anyInt
-import org.mockito.Mockito.anyLong
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.never
-import org.mockito.Mockito.reset
-import org.mockito.Mockito.times
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when` as whenEver
-import org.mockito.junit.MockitoJUnit
-
-private const val DISPLAY_ID = 2
-private const val SENSOR_ID = 1
-
-private const val REAR_DISPLAY_MODE_DEVICE_STATE = 3
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-@TestableLooper.RunWithLooper
-class SideFpsControllerTest : SysuiTestCase() {
-
- @JvmField @Rule var rule = MockitoJUnit.rule()
-
- @Mock lateinit var layoutInflater: LayoutInflater
- @Mock lateinit var fingerprintManager: FingerprintManager
- @Mock lateinit var windowManager: WindowManager
- @Mock lateinit var activityTaskManager: ActivityTaskManager
- @Mock lateinit var sideFpsView: View
- @Mock lateinit var displayManager: DisplayManager
- @Mock lateinit var handler: Handler
- @Mock lateinit var dumpManager: DumpManager
- @Mock lateinit var fpsUnlockTracker: FpsUnlockTracker
- @Captor lateinit var overlayCaptor: ArgumentCaptor<View>
- @Captor lateinit var overlayViewParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams>
-
- private lateinit var displayRepository: FakeDisplayRepository
- private lateinit var displayStateRepository: FakeDisplayStateRepository
- private lateinit var keyguardBouncerRepository: FakeKeyguardBouncerRepository
- private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor
- private lateinit var displayStateInteractor: DisplayStateInteractor
-
- private val executor = FakeExecutor(FakeSystemClock())
- private val testScope = TestScope(StandardTestDispatcher())
-
- private lateinit var overlayController: ISidefpsController
- private lateinit var sideFpsController: SideFpsController
-
- enum class DeviceConfig {
- X_ALIGNED,
- Y_ALIGNED,
- }
-
- private lateinit var deviceConfig: DeviceConfig
- private lateinit var indicatorBounds: Rect
- private lateinit var displayBounds: Rect
- private lateinit var sensorLocation: SensorLocationInternal
- private var displayWidth: Int = 0
- private var displayHeight: Int = 0
- private var boundsWidth: Int = 0
- private var boundsHeight: Int = 0
-
- @Before
- fun setup() {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
- displayRepository = FakeDisplayRepository()
- displayStateRepository = FakeDisplayStateRepository()
- keyguardBouncerRepository = FakeKeyguardBouncerRepository()
- alternateBouncerInteractor =
- AlternateBouncerInteractor(
- mock(StatusBarStateController::class.java),
- mock(KeyguardStateController::class.java),
- keyguardBouncerRepository,
- FakeFingerprintPropertyRepository(),
- FakeBiometricSettingsRepository(),
- FakeSystemClock(),
- mock(KeyguardUpdateMonitor::class.java),
- { mock(DeviceEntryFingerprintAuthInteractor::class.java) },
- { mock(KeyguardInteractor::class.java) },
- { mock(KeyguardTransitionInteractor::class.java) },
- testScope.backgroundScope,
- )
- displayStateInteractor =
- DisplayStateInteractorImpl(
- testScope.backgroundScope,
- context,
- executor,
- displayStateRepository,
- displayRepository,
- )
-
- context.addMockSystemService(DisplayManager::class.java, displayManager)
- context.addMockSystemService(WindowManager::class.java, windowManager)
-
- whenEver(layoutInflater.inflate(R.layout.sidefps_view, null, false)).thenReturn(sideFpsView)
- whenEver(sideFpsView.requireViewById<LottieAnimationView>(eq(R.id.sidefps_animation)))
- .thenReturn(mock(LottieAnimationView::class.java))
- with(mock(ViewPropertyAnimator::class.java)) {
- whenEver(sideFpsView.animate()).thenReturn(this)
- whenEver(alpha(anyFloat())).thenReturn(this)
- whenEver(setStartDelay(anyLong())).thenReturn(this)
- whenEver(setDuration(anyLong())).thenReturn(this)
- whenEver(setListener(any())).thenAnswer {
- (it.arguments[0] as Animator.AnimatorListener).onAnimationEnd(
- mock(Animator::class.java)
- )
- this
- }
- }
- }
-
- private fun testWithDisplay(
- deviceConfig: DeviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation: Boolean = false,
- initInfo: DisplayInfo.() -> Unit = {},
- windowInsets: WindowInsets = insetsForSmallNavbar(),
- inRearDisplayMode: Boolean = false,
- block: () -> Unit
- ) {
- this.deviceConfig = deviceConfig
-
- when (deviceConfig) {
- DeviceConfig.X_ALIGNED -> {
- displayWidth = 3000
- displayHeight = 1500
- sensorLocation = SensorLocationInternal("", 2500, 0, 0)
- boundsWidth = 200
- boundsHeight = 100
- }
- DeviceConfig.Y_ALIGNED -> {
- displayWidth = 2500
- displayHeight = 2000
- sensorLocation = SensorLocationInternal("", 0, 300, 0)
- boundsWidth = 100
- boundsHeight = 200
- }
- }
-
- indicatorBounds = Rect(0, 0, boundsWidth, boundsHeight)
- displayBounds = Rect(0, 0, displayWidth, displayHeight)
- var locations = listOf(sensorLocation)
-
- whenEver(fingerprintManager.sensorPropertiesInternal)
- .thenReturn(
- listOf(
- FingerprintSensorPropertiesInternal(
- SENSOR_ID,
- SensorProperties.STRENGTH_STRONG,
- 5 /* maxEnrollmentsPerUser */,
- listOf() /* componentInfo */,
- FingerprintSensorProperties.TYPE_POWER_BUTTON,
- true /* halControlsIllumination */,
- true /* resetLockoutRequiresHardwareAuthToken */,
- locations
- )
- )
- )
-
- val displayInfo = DisplayInfo()
- displayInfo.initInfo()
-
- val dmGlobal = mock(DisplayManagerGlobal::class.java)
- val display = Display(dmGlobal, DISPLAY_ID, displayInfo, DEFAULT_DISPLAY_ADJUSTMENTS)
-
- whenEver(dmGlobal.getDisplayInfo(eq(DISPLAY_ID))).thenReturn(displayInfo)
- whenEver(windowManager.defaultDisplay).thenReturn(display)
- whenEver(windowManager.maximumWindowMetrics)
- .thenReturn(WindowMetrics(displayBounds, WindowInsets.CONSUMED))
- whenEver(windowManager.currentWindowMetrics)
- .thenReturn(WindowMetrics(displayBounds, windowInsets))
-
- val sideFpsControllerContext = context.createDisplayContext(display) as SysuiTestableContext
- sideFpsControllerContext.orCreateTestableResources.addOverride(
- com.android.internal.R.bool.config_reverseDefaultRotation,
- isReverseDefaultRotation
- )
-
- val rearDisplayDeviceStates =
- if (inRearDisplayMode) intArrayOf(REAR_DISPLAY_MODE_DEVICE_STATE) else intArrayOf()
- sideFpsControllerContext.orCreateTestableResources.addOverride(
- com.android.internal.R.array.config_rearDisplayDeviceStates,
- rearDisplayDeviceStates
- )
-
- sideFpsController =
- SideFpsController(
- sideFpsControllerContext,
- layoutInflater,
- fingerprintManager,
- windowManager,
- activityTaskManager,
- displayManager,
- displayStateInteractor,
- executor,
- handler,
- alternateBouncerInteractor,
- TestCoroutineScope(),
- dumpManager,
- fpsUnlockTracker
- )
- displayStateRepository.setIsInRearDisplayMode(inRearDisplayMode)
-
- overlayController =
- ArgumentCaptor.forClass(ISidefpsController::class.java)
- .apply { verify(fingerprintManager).setSidefpsController(capture()) }
- .value
-
- block()
- }
-
- @Test
- fun testSubscribesToOrientationChangesWhenShowingOverlay() = testWithDisplay {
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(displayManager).registerDisplayListener(any(), eq(handler), anyLong())
-
- overlayController.hide(SENSOR_ID)
- executor.runAllReady()
- verify(displayManager).unregisterDisplayListener(any())
- }
-
- @Test
- fun testShowOverlayReasonWhenDisplayChanged() = testWithDisplay {
- sideFpsController.show(SideFpsUiRequestSource.AUTO_SHOW, REASON_AUTH_KEYGUARD)
- executor.runAllReady()
- sideFpsController.orientationListener.onDisplayChanged(1 /* displayId */)
- executor.runAllReady()
-
- assertThat(sideFpsController.orientationReasonListener.reason)
- .isEqualTo(REASON_AUTH_KEYGUARD)
- }
-
- @Test
- fun testShowsAndHides() = testWithDisplay {
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager).addView(overlayCaptor.capture(), any())
-
- reset(windowManager)
- overlayController.hide(SENSOR_ID)
- executor.runAllReady()
-
- verify(windowManager, never()).addView(any(), any())
- verify(windowManager).removeView(eq(overlayCaptor.value))
- }
-
- @Test
- fun testShowsOnce() = testWithDisplay {
- repeat(5) {
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
- }
-
- verify(windowManager).addView(any(), any())
- verify(windowManager, never()).removeView(any())
- }
-
- @Test
- fun testHidesOnce() = testWithDisplay {
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- repeat(5) {
- overlayController.hide(SENSOR_ID)
- executor.runAllReady()
- }
-
- verify(windowManager).addView(any(), any())
- verify(windowManager).removeView(any())
- }
-
- @Test fun testIgnoredForKeyguard() = testWithDisplay { testIgnoredFor(REASON_AUTH_KEYGUARD) }
-
- @Test
- fun testShowsForMostSettings() = testWithDisplay {
- whenEver(activityTaskManager.getTasks(anyInt())).thenReturn(listOf(fpEnrollTask()))
- testIgnoredFor(REASON_AUTH_SETTINGS, ignored = false)
- }
-
- @Test
- fun testIgnoredForVerySpecificSettings() = testWithDisplay {
- whenEver(activityTaskManager.getTasks(anyInt())).thenReturn(listOf(fpSettingsTask()))
- testIgnoredFor(REASON_AUTH_SETTINGS)
- }
-
- private fun testIgnoredFor(reason: Int, ignored: Boolean = true) {
- overlayController.show(SENSOR_ID, reason)
- executor.runAllReady()
-
- verify(windowManager, if (ignored) never() else times(1)).addView(any(), any())
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForXAlignedSensor_0() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_0 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForXAlignedSensor_90() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_90 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForXAlignedSensor_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_180 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarCollapsedDownForXAlignedSensor_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_180 },
- windowInsets = insetsForSmallNavbar()
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun hidesSfpsIndicatorWhenOccludingTaskbarForXAlignedSensor_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_180 },
- windowInsets = insetsForLargeNavbar()
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = false)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForXAlignedSensor_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_270 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForXAlignedSensor_InReverseDefaultRotation_0() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_0 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForXAlignedSensor_InReverseDefaultRotation_90() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_90 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarCollapsedDownForXAlignedSensor_InReverseDefaultRotation_90() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_90 },
- windowInsets = insetsForSmallNavbar()
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun hidesSfpsIndicatorWhenOccludingTaskbarForXAlignedSensor_InReverseDefaultRotation_90() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_90 },
- windowInsets = insetsForLargeNavbar()
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = false)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForXAlignedSensor_InReverseDefaultRotation_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_180 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForXAlignedSensor_InReverseDefaultRotation_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_270 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForYAlignedSensor_0() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_0 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForYAlignedSensor_90() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_90 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForYAlignedSensor_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_180 },
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForYAlignedSensor_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_270 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarCollapsedDownForYAlignedSensor_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_270 },
- windowInsets = insetsForSmallNavbar()
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun hidesSfpsIndicatorWhenOccludingTaskbarForYAlignedSensor_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_270 },
- windowInsets = insetsForLargeNavbar()
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = false)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForYAlignedSensor_InReverseDefaultRotation_0() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_0 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForYAlignedSensor_InReverseDefaultRotation_90() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_90 },
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForYAlignedSensor_InReverseDefaultRotation_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_180 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarCollapsedDownForYAlignedSensor_InReverseDefaultRotation_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_180 },
- windowInsets = insetsForSmallNavbar()
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun hidesSfpsIndicatorWhenOccludingTaskbarForYAlignedSensor_InReverseDefaultRotation_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_180 },
- windowInsets = insetsForLargeNavbar()
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = false)
- }
-
- @Test
- fun showsSfpsIndicatorWithTaskbarForYAlignedSensor_InReverseDefaultRotation_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_270 }
- ) {
- verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true)
- }
-
- @Test
- fun verifiesSfpsIndicatorNotAddedInRearDisplayMode_0() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_0 },
- inRearDisplayMode = true,
- ) {
- verifySfpsIndicator_notAdded_InRearDisplayMode()
- }
-
- @Test
- fun verifiesSfpsIndicatorNotAddedInRearDisplayMode_90() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_90 },
- inRearDisplayMode = true,
- ) {
- verifySfpsIndicator_notAdded_InRearDisplayMode()
- }
-
- @Test
- fun verifiesSfpsIndicatorNotAddedInRearDisplayMode_180() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_180 },
- inRearDisplayMode = true,
- ) {
- verifySfpsIndicator_notAdded_InRearDisplayMode()
- }
-
- @Test
- fun verifiesSfpsIndicatorNotAddedInRearDisplayMode_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_270 },
- inRearDisplayMode = true,
- ) {
- verifySfpsIndicator_notAdded_InRearDisplayMode()
- }
-
- private fun verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible: Boolean) {
- sideFpsController.overlayOffsets = sensorLocation
- }
-
- private fun verifySfpsIndicator_notAdded_InRearDisplayMode() {
- sideFpsController.overlayOffsets = sensorLocation
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager, never()).addView(any(), any())
- }
-
- fun alternateBouncerVisibility_showAndHideSideFpsUI() = testWithDisplay {
- // WHEN alternate bouncer is visible
- keyguardBouncerRepository.setAlternateVisible(true)
- executor.runAllReady()
-
- // THEN side fps shows UI
- verify(windowManager).addView(any(), any())
- verify(windowManager, never()).removeView(any())
-
- // WHEN alternate bouncer is no longer visible
- keyguardBouncerRepository.setAlternateVisible(false)
- executor.runAllReady()
-
- // THEN side fps UI is hidden
- verify(windowManager).removeView(any())
- }
-
- /**
- * {@link SideFpsController#updateOverlayParams} calculates indicator placement for ROTATION_0,
- * and uses RotateUtils.rotateBounds to map to the correct indicator location given the device
- * rotation. Assuming RotationUtils.rotateBounds works correctly, tests for indicator placement
- * in other rotations have been omitted.
- */
- @Test
- fun verifiesIndicatorPlacementForXAlignedSensor_0() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_0 }
- ) {
- sideFpsController.overlayOffsets = sensorLocation
-
- sideFpsController.updateOverlayParams(windowManager.defaultDisplay, indicatorBounds)
-
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager).updateViewLayout(any(), overlayViewParamsCaptor.capture())
- assertThat(overlayViewParamsCaptor.value.x).isEqualTo(sensorLocation.sensorLocationX)
- assertThat(overlayViewParamsCaptor.value.y).isEqualTo(0)
- }
-
- /**
- * {@link SideFpsController#updateOverlayParams} calculates indicator placement for ROTATION_270
- * in reverse default rotation. It then uses RotateUtils.rotateBounds to map to the correct
- * indicator location given the device rotation. Assuming RotationUtils.rotateBounds works
- * correctly, tests for indicator placement in other rotations have been omitted.
- */
- @Test
- fun verifiesIndicatorPlacementForXAlignedSensor_InReverseDefaultRotation_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.X_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_270 }
- ) {
- sideFpsController.overlayOffsets = sensorLocation
-
- sideFpsController.updateOverlayParams(windowManager.defaultDisplay, indicatorBounds)
-
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager).updateViewLayout(any(), overlayViewParamsCaptor.capture())
- assertThat(overlayViewParamsCaptor.value.x).isEqualTo(sensorLocation.sensorLocationX)
- assertThat(overlayViewParamsCaptor.value.y).isEqualTo(0)
- }
-
- /**
- * {@link SideFpsController#updateOverlayParams} calculates indicator placement for ROTATION_0,
- * and uses RotateUtils.rotateBounds to map to the correct indicator location given the device
- * rotation. Assuming RotationUtils.rotateBounds works correctly, tests for indicator placement
- * in other rotations have been omitted.
- */
- @Test
- fun verifiesIndicatorPlacementForYAlignedSensor_0() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = false,
- { rotation = Surface.ROTATION_0 }
- ) {
- sideFpsController.overlayOffsets = sensorLocation
-
- sideFpsController.updateOverlayParams(windowManager.defaultDisplay, indicatorBounds)
-
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager).updateViewLayout(any(), overlayViewParamsCaptor.capture())
- assertThat(overlayViewParamsCaptor.value.x).isEqualTo(displayWidth - boundsWidth)
- assertThat(overlayViewParamsCaptor.value.y).isEqualTo(sensorLocation.sensorLocationY)
- }
-
- /**
- * {@link SideFpsController#updateOverlayParams} calculates indicator placement for ROTATION_270
- * in reverse default rotation. It then uses RotateUtils.rotateBounds to map to the correct
- * indicator location given the device rotation. Assuming RotationUtils.rotateBounds works
- * correctly, tests for indicator placement in other rotations have been omitted.
- */
- @Test
- fun verifiesIndicatorPlacementForYAlignedSensor_InReverseDefaultRotation_270() =
- testWithDisplay(
- deviceConfig = DeviceConfig.Y_ALIGNED,
- isReverseDefaultRotation = true,
- { rotation = Surface.ROTATION_270 }
- ) {
- sideFpsController.overlayOffsets = sensorLocation
-
- sideFpsController.updateOverlayParams(windowManager.defaultDisplay, indicatorBounds)
-
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager).updateViewLayout(any(), overlayViewParamsCaptor.capture())
- assertThat(overlayViewParamsCaptor.value.x).isEqualTo(displayWidth - boundsWidth)
- assertThat(overlayViewParamsCaptor.value.y).isEqualTo(sensorLocation.sensorLocationY)
- }
-
- @Test
- fun hasSideFpsSensor_withSensorProps_returnsTrue() = testWithDisplay {
- // By default all those tests assume the side fps sensor is available.
- assertThat(fingerprintManager.hasSideFpsSensor()).isTrue()
- }
-
- @Test
- fun hasSideFpsSensor_withoutSensorProps_returnsFalse() {
- whenEver(fingerprintManager.sensorPropertiesInternal).thenReturn(null)
-
- assertThat(fingerprintManager.hasSideFpsSensor()).isFalse()
- }
-
- @Test
- fun testLayoutParams_isKeyguardDialogType() =
- testWithDisplay(deviceConfig = DeviceConfig.Y_ALIGNED) {
- sideFpsController.overlayOffsets = sensorLocation
- sideFpsController.updateOverlayParams(windowManager.defaultDisplay, indicatorBounds)
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager).updateViewLayout(any(), overlayViewParamsCaptor.capture())
-
- val lpType = overlayViewParamsCaptor.value.type
-
- assertThat((lpType and TYPE_KEYGUARD_DIALOG) != 0).isTrue()
- }
-
- @Test
- fun testLayoutParams_hasNoMoveAnimationWindowFlag() =
- testWithDisplay(deviceConfig = DeviceConfig.Y_ALIGNED) {
- sideFpsController.overlayOffsets = sensorLocation
- sideFpsController.updateOverlayParams(windowManager.defaultDisplay, indicatorBounds)
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager).updateViewLayout(any(), overlayViewParamsCaptor.capture())
-
- val lpFlags = overlayViewParamsCaptor.value.privateFlags
-
- assertThat((lpFlags and PRIVATE_FLAG_NO_MOVE_ANIMATION) != 0).isTrue()
- }
-
- @Test
- fun testLayoutParams_hasTrustedOverlayWindowFlag() =
- testWithDisplay(deviceConfig = DeviceConfig.Y_ALIGNED) {
- sideFpsController.overlayOffsets = sensorLocation
- sideFpsController.updateOverlayParams(windowManager.defaultDisplay, indicatorBounds)
- overlayController.show(SENSOR_ID, REASON_UNKNOWN)
- executor.runAllReady()
-
- verify(windowManager).updateViewLayout(any(), overlayViewParamsCaptor.capture())
-
- val lpFlags = overlayViewParamsCaptor.value.privateFlags
-
- assertThat((lpFlags and PRIVATE_FLAG_TRUSTED_OVERLAY) != 0).isTrue()
- }
-
- @Test
- fun primaryBouncerRequestAnimatesAlphaIn() = testWithDisplay {
- sideFpsController.show(SideFpsUiRequestSource.PRIMARY_BOUNCER, REASON_AUTH_KEYGUARD)
- executor.runAllReady()
- verify(sideFpsView).animate()
- }
-
- @Test
- fun alternateBouncerRequestsDoesNotAnimateAlphaIn() = testWithDisplay {
- sideFpsController.show(SideFpsUiRequestSource.ALTERNATE_BOUNCER, REASON_AUTH_KEYGUARD)
- executor.runAllReady()
- verify(sideFpsView, never()).animate()
- }
-
- @Test
- fun autoShowRequestsDoesNotAnimateAlphaIn() = testWithDisplay {
- sideFpsController.show(SideFpsUiRequestSource.AUTO_SHOW, REASON_AUTH_KEYGUARD)
- executor.runAllReady()
- verify(sideFpsView, never()).animate()
- }
-}
-
-private fun insetsForSmallNavbar() = insetsWithBottom(60)
-
-private fun insetsForLargeNavbar() = insetsWithBottom(100)
-
-private fun insetsWithBottom(bottom: Int) =
- WindowInsets.Builder()
- .setInsets(WindowInsets.Type.navigationBars(), Insets.of(0, 0, 0, bottom))
- .build()
-
-private fun fpEnrollTask() = settingsTask(".biometrics.fingerprint.FingerprintEnrollEnrolling")
-
-private fun fpSettingsTask() = settingsTask(".biometrics.fingerprint.FingerprintSettings")
-
-private fun settingsTask(cls: String) =
- ActivityManager.RunningTaskInfo().apply {
- topActivity = ComponentName.createRelative("com.android.settings", cls)
- }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractorTest.kt
index c878e0b..004b1b4 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractorTest.kt
@@ -23,6 +23,7 @@
import com.android.internal.widget.LockPatternUtils
import com.android.keyguard.KeyguardSecurityModel
import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN
+import com.android.keyguard.KeyguardSecurityModel.SecurityMode.Pattern
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
@@ -88,7 +89,9 @@
overrideResource(kg_trust_agent_disabled, "Trust agent is unavailable")
}
- suspend fun TestScope.init() {
+ suspend fun TestScope.init(
+ fingerprintAuthCurrentlyAllowed: Boolean = true,
+ ) {
kosmos.fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
mSetFlagsRule.enableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES)
underTest =
@@ -107,7 +110,9 @@
faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository,
securityModel = securityModel
)
- biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true)
+ biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(
+ fingerprintAuthCurrentlyAllowed
+ )
kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
kosmos.fakeFingerprintPropertyRepository.supportsSideFps()
kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(true)
@@ -115,6 +120,29 @@
}
@Test
+ fun initialMessage_pin() =
+ testScope.runTest {
+ init(fingerprintAuthCurrentlyAllowed = false)
+ val bouncerMessage by collectLastValue(underTest.bouncerMessage)
+ kosmos.fakeKeyguardBouncerRepository.setLastShownSecurityMode(
+ KeyguardSecurityModel.SecurityMode.PIN
+ )
+ assertThat(bouncerMessage).isNotNull()
+ assertThat(primaryResMessage(bouncerMessage)).isEqualTo("Enter PIN")
+ }
+
+ @Test
+ fun onPrimaryAuthMethodChangeFromPinToPattern_initialMessageUpdates() =
+ testScope.runTest {
+ init(fingerprintAuthCurrentlyAllowed = false)
+ val bouncerMessage by collectLastValue(underTest.bouncerMessage)
+ whenever(securityModel.getSecurityMode(PRIMARY_USER_ID)).thenReturn(Pattern)
+ kosmos.fakeKeyguardBouncerRepository.setLastShownSecurityMode(Pattern)
+ assertThat(bouncerMessage).isNotNull()
+ assertThat(primaryResMessage(bouncerMessage)).isEqualTo("Draw pattern")
+ }
+
+ @Test
fun onIncorrectSecurityInput_providesTheAppropriateValueForBouncerMessage() =
testScope.runTest {
init()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorTest.kt
index 63f6c20..546a6b7 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorTest.kt
@@ -36,8 +36,6 @@
import com.android.systemui.keyguard.DismissCallbackRegistry
import com.android.systemui.keyguard.data.repository.FakeTrustRepository
import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.res.R
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.mockito.any
@@ -343,90 +341,6 @@
assertThat(underTest.willDismissWithAction()).isFalse()
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun testSideFpsVisibility() {
- updateSideFpsVisibilityParameters(
- isVisible = true,
- sfpsEnabled = true,
- fpsDetectionRunning = true,
- isUnlockingWithFpAllowed = true,
- isAnimatingAway = false
- )
- underTest.updateSideFpsVisibility()
- verify(repository).setSideFpsShowing(true)
- }
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun testSideFpsVisibility_notVisible() {
- updateSideFpsVisibilityParameters(
- isVisible = false,
- sfpsEnabled = true,
- fpsDetectionRunning = true,
- isUnlockingWithFpAllowed = true,
- isAnimatingAway = false
- )
- underTest.updateSideFpsVisibility()
- verify(repository).setSideFpsShowing(false)
- }
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun testSideFpsVisibility_sfpsNotEnabled() {
- updateSideFpsVisibilityParameters(
- isVisible = true,
- sfpsEnabled = false,
- fpsDetectionRunning = true,
- isUnlockingWithFpAllowed = true,
- isAnimatingAway = false
- )
- underTest.updateSideFpsVisibility()
- verify(repository).setSideFpsShowing(false)
- }
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun testSideFpsVisibility_fpsDetectionNotRunning() {
- updateSideFpsVisibilityParameters(
- isVisible = true,
- sfpsEnabled = true,
- fpsDetectionRunning = false,
- isUnlockingWithFpAllowed = true,
- isAnimatingAway = false
- )
- underTest.updateSideFpsVisibility()
- verify(repository).setSideFpsShowing(false)
- }
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun testSideFpsVisibility_UnlockingWithFpNotAllowed() {
- updateSideFpsVisibilityParameters(
- isVisible = true,
- sfpsEnabled = true,
- fpsDetectionRunning = true,
- isUnlockingWithFpAllowed = false,
- isAnimatingAway = false
- )
- underTest.updateSideFpsVisibility()
- verify(repository).setSideFpsShowing(false)
- }
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun testSideFpsVisibility_AnimatingAway() {
- updateSideFpsVisibilityParameters(
- isVisible = true,
- sfpsEnabled = true,
- fpsDetectionRunning = true,
- isUnlockingWithFpAllowed = true,
- isAnimatingAway = true
- )
- underTest.updateSideFpsVisibility()
- verify(repository).setSideFpsShowing(false)
- }
-
@Test
fun delayBouncerWhenFaceAuthPossible() {
mainHandler.setMode(FakeHandler.Mode.QUEUEING)
@@ -491,22 +405,4 @@
verify(repository).setPrimaryShowingSoon(false)
}
}
-
- private fun updateSideFpsVisibilityParameters(
- isVisible: Boolean,
- sfpsEnabled: Boolean,
- fpsDetectionRunning: Boolean,
- isUnlockingWithFpAllowed: Boolean,
- isAnimatingAway: Boolean
- ) {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
- whenever(repository.primaryBouncerShow.value).thenReturn(isVisible)
- resources.addOverride(R.bool.config_show_sidefps_hint_on_bouncer, sfpsEnabled)
- whenever(keyguardUpdateMonitor.isFingerprintDetectionRunning)
- .thenReturn(fpsDetectionRunning)
- whenever(keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed)
- .thenReturn(isUnlockingWithFpAllowed)
- whenever(repository.primaryBouncerStartingDisappearAnimation.value)
- .thenReturn(if (isAnimatingAway) Runnable {} else null)
- }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt
index cddbd1f..1a43501 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt
@@ -33,7 +33,6 @@
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
import com.android.systemui.keyguard.DismissCallbackRegistry
import com.android.systemui.keyguard.data.repository.TrustRepository
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.utils.os.FakeHandler
@@ -66,9 +65,7 @@
@Mock private lateinit var faceAuthInteractor: DeviceEntryFaceAuthInteractor
lateinit var bouncerInteractor: PrimaryBouncerInteractor
- private val mainHandler by lazy {
- FakeHandler(Looper.getMainLooper())
- }
+ private val mainHandler by lazy { FakeHandler(Looper.getMainLooper()) }
val repository = FakeKeyguardBouncerRepository()
lateinit var underTest: KeyguardBouncerViewModel
@@ -108,46 +105,6 @@
job.cancel()
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun shouldUpdateSideFps_show() = runTest {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
- var count = 0
- val job = underTest.shouldUpdateSideFps.onEach { count++ }.launchIn(this)
- repository.setPrimaryShow(true)
- // Run the tasks that are pending at this point of virtual time.
- runCurrent()
- assertThat(count).isEqualTo(1)
- job.cancel()
- }
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun shouldUpdateSideFps_hide() = runTest {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
- repository.setPrimaryShow(true)
- var count = 0
- val job = underTest.shouldUpdateSideFps.onEach { count++ }.launchIn(this)
- repository.setPrimaryShow(false)
- // Run the tasks that are pending at this point of virtual time.
- runCurrent()
- assertThat(count).isEqualTo(1)
- job.cancel()
- }
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Test
- fun sideFpsShowing() = runTest {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
- var sideFpsIsShowing = false
- val job = underTest.sideFpsShowing.onEach { sideFpsIsShowing = it }.launchIn(this)
- repository.setSideFpsShowing(true)
- // Run the tasks that are pending at this point of virtual time.
- runCurrent()
- assertThat(sideFpsIsShowing).isEqualTo(true)
- job.cancel()
- }
-
@Test
fun isShowing() = runTest {
var isShowing: Boolean? = null
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalBackupRestoreStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalBackupRestoreStartableTest.kt
new file mode 100644
index 0000000..722eb2b
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalBackupRestoreStartableTest.kt
@@ -0,0 +1,152 @@
+/*
+ * 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.communal
+
+import android.appwidget.AppWidgetManager
+import android.content.Context
+import android.content.Intent
+import android.content.mockedContext
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.broadcast.FakeBroadcastDispatcher
+import com.android.systemui.broadcast.broadcastDispatcher
+import com.android.systemui.communal.domain.interactor.CommunalInteractor
+import com.android.systemui.communal.widgets.CommunalWidgetModule
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.log.logcatLogBuffer
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.kotlinArgumentCaptor
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class CommunalBackupRestoreStartableTest : SysuiTestCase() {
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+
+ @Mock private lateinit var communalInteractor: CommunalInteractor
+
+ private val mapCaptor = kotlinArgumentCaptor<Map<Int, Int>>()
+
+ private lateinit var context: Context
+ private lateinit var broadcastDispatcher: FakeBroadcastDispatcher
+ private lateinit var underTest: CommunalBackupRestoreStartable
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+
+ context = kosmos.mockedContext
+ broadcastDispatcher = kosmos.broadcastDispatcher
+
+ underTest =
+ CommunalBackupRestoreStartable(
+ broadcastDispatcher,
+ communalInteractor,
+ logcatLogBuffer("CommunalBackupRestoreStartable"),
+ )
+ }
+
+ @Test
+ fun testRestoreWidgetsUponHostRestored() =
+ testScope.runTest {
+ underTest.start()
+
+ // Verify restore widgets not called
+ verify(communalInteractor, never()).restoreWidgets(any())
+
+ // Trigger app widget host restored
+ val intent =
+ Intent().apply {
+ action = AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED
+ putExtra(
+ AppWidgetManager.EXTRA_HOST_ID,
+ CommunalWidgetModule.APP_WIDGET_HOST_ID
+ )
+ putExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS, intArrayOf(1, 2, 3))
+ putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(7, 8, 9))
+ }
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(context, intent)
+
+ // Verify restore widgets called
+ verify(communalInteractor).restoreWidgets(mapCaptor.capture())
+ val oldToNewWidgetIdMap = mapCaptor.value
+ assertThat(oldToNewWidgetIdMap)
+ .containsExactlyEntriesIn(
+ mapOf(
+ Pair(1, 7),
+ Pair(2, 8),
+ Pair(3, 9),
+ )
+ )
+ }
+
+ @Test
+ fun testDoNotRestoreWidgetsIfNotForCommunalWidgetHost() =
+ testScope.runTest {
+ underTest.start()
+
+ // Trigger app widget host restored, but for another host
+ val hostId = CommunalWidgetModule.APP_WIDGET_HOST_ID + 1
+ val intent =
+ Intent().apply {
+ action = AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED
+ putExtra(AppWidgetManager.EXTRA_HOST_ID, hostId)
+ putExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS, intArrayOf(1, 2, 3))
+ putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(7, 8, 9))
+ }
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(context, intent)
+
+ // Verify restore widgets not called
+ verify(communalInteractor, never()).restoreWidgets(any())
+ }
+
+ @Test
+ fun testAbortRestoreWidgetsIfOldToNewIdsMappingInvalid() =
+ testScope.runTest {
+ underTest.start()
+
+ // Trigger app widget host restored, but new ids list is one too many for old ids
+ val oldIds = intArrayOf(1, 2, 3)
+ val newIds = intArrayOf(6, 7, 8, 9)
+ val intent =
+ Intent().apply {
+ action = AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED
+ putExtra(
+ AppWidgetManager.EXTRA_HOST_ID,
+ CommunalWidgetModule.APP_WIDGET_HOST_ID
+ )
+ putExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS, oldIds)
+ putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, newIds)
+ }
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(context, intent)
+
+ // Verify restore widgets aborted
+ verify(communalInteractor).abortRestoreWidgets()
+ verify(communalInteractor, never()).restoreWidgets(any())
+ }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
index 76f15d2..b4b812d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
@@ -32,7 +32,9 @@
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
+import com.android.systemui.statusbar.notificationShadeWindowController
import com.android.systemui.testKosmos
import com.android.systemui.util.settings.fakeSettings
import com.google.common.truth.Truth.assertThat
@@ -68,8 +70,10 @@
keyguardTransitionInteractor = keyguardTransitionInteractor,
keyguardInteractor = keyguardInteractor,
systemSettings = fakeSettings,
+ notificationShadeWindowController = notificationShadeWindowController,
applicationScope = applicationCoroutineScope,
bgScope = applicationCoroutineScope,
+ mainDispatcher = testDispatcher,
)
.apply { start() }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
index a4c7abd..fe4d32d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
@@ -16,18 +16,23 @@
package com.android.systemui.communal.data.repository
+import android.app.backup.BackupManager
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProviderInfo
import android.appwidget.AppWidgetProviderInfo.WIDGET_FEATURE_CONFIGURATION_OPTIONAL
import android.appwidget.AppWidgetProviderInfo.WIDGET_FEATURE_RECONFIGURABLE
import android.content.ComponentName
+import android.content.applicationContext
import android.os.UserHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.communal.data.backup.CommunalBackupUtils
import com.android.systemui.communal.data.db.CommunalItemRank
import com.android.systemui.communal.data.db.CommunalWidgetDao
import com.android.systemui.communal.data.db.CommunalWidgetItem
+import com.android.systemui.communal.nano.CommunalHubState
+import com.android.systemui.communal.proto.toByteArray
import com.android.systemui.communal.shared.model.CommunalWidgetContentModel
import com.android.systemui.communal.widgets.CommunalAppWidgetHost
import com.android.systemui.communal.widgets.CommunalWidgetHost
@@ -42,6 +47,7 @@
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.mockito.withArgCaptor
import com.google.common.truth.Truth.assertThat
import java.util.Optional
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -68,7 +74,9 @@
@Mock private lateinit var providerInfoA: AppWidgetProviderInfo
@Mock private lateinit var communalWidgetHost: CommunalWidgetHost
@Mock private lateinit var communalWidgetDao: CommunalWidgetDao
+ @Mock private lateinit var backupManager: BackupManager
+ private lateinit var backupUtils: CommunalBackupUtils
private lateinit var logBuffer: LogBuffer
private lateinit var fakeWidgets: MutableStateFlow<Map<CommunalItemRank, CommunalWidgetItem>>
@@ -89,6 +97,7 @@
MockitoAnnotations.initMocks(this)
fakeWidgets = MutableStateFlow(emptyMap())
logBuffer = logcatLogBuffer(name = "CommunalWidgetRepoImplTest")
+ backupUtils = CommunalBackupUtils(kosmos.applicationContext)
setAppWidgetIds(emptyList())
@@ -106,6 +115,8 @@
communalWidgetHost,
communalWidgetDao,
logBuffer,
+ backupManager,
+ backupUtils,
)
}
@@ -129,6 +140,9 @@
priority = communalItemRankEntry.rank,
)
)
+
+ // Verify backup not requested
+ verify(backupManager, never()).dataChanged()
}
@Test
@@ -152,6 +166,9 @@
verify(communalWidgetHost).allocateIdAndBindWidget(provider, user)
verify(communalWidgetDao).addWidget(id, provider, priority)
+
+ // Verify backup requested
+ verify(backupManager).dataChanged()
}
@Test
@@ -176,6 +193,9 @@
verify(communalWidgetHost).allocateIdAndBindWidget(provider, user)
verify(communalWidgetDao, never()).addWidget(id, provider, priority)
verify(appWidgetHost).deleteAppWidgetId(id)
+
+ // Verify backup not requested
+ verify(backupManager, never()).dataChanged()
}
@Test
@@ -202,6 +222,9 @@
verify(communalWidgetHost).allocateIdAndBindWidget(provider, user)
verify(communalWidgetDao, never()).addWidget(id, provider, priority)
verify(appWidgetHost).deleteAppWidgetId(id)
+
+ // Verify backup not requested
+ verify(backupManager, never()).dataChanged()
}
@Test
@@ -225,10 +248,13 @@
verify(communalWidgetHost).allocateIdAndBindWidget(provider, user)
verify(communalWidgetDao).addWidget(id, provider, priority)
+
+ // Verify backup requested
+ verify(backupManager).dataChanged()
}
@Test
- fun deleteWidget_deletefromDbTrue_alsoDeleteFromHost() =
+ fun deleteWidget_deleteFromDbTrue_alsoDeleteFromHost() =
testScope.runTest {
val id = 1
whenever(communalWidgetDao.deleteWidgetById(eq(id))).thenReturn(true)
@@ -237,10 +263,13 @@
verify(communalWidgetDao).deleteWidgetById(id)
verify(appWidgetHost).deleteAppWidgetId(id)
+
+ // Verify backup requested
+ verify(backupManager).dataChanged()
}
@Test
- fun deleteWidget_deletefromDbFalse_doesNotDeleteFromHost() =
+ fun deleteWidget_deleteFromDbFalse_doesNotDeleteFromHost() =
testScope.runTest {
val id = 1
whenever(communalWidgetDao.deleteWidgetById(eq(id))).thenReturn(false)
@@ -249,6 +278,9 @@
verify(communalWidgetDao).deleteWidgetById(id)
verify(appWidgetHost, never()).deleteAppWidgetId(id)
+
+ // Verify backup not requested
+ verify(backupManager, never()).dataChanged()
}
@Test
@@ -259,6 +291,147 @@
runCurrent()
verify(communalWidgetDao).updateWidgetOrder(widgetIdToPriorityMap)
+
+ // Verify backup requested
+ verify(backupManager).dataChanged()
+ }
+
+ @Test
+ fun restoreWidgets_deleteStateFileIfRestoreFails() =
+ testScope.runTest {
+ // Write a state file that is invalid, and verify it is written
+ backupUtils.writeBytesToDisk(byteArrayOf(1, 2, 3, 4, 5, 6))
+ assertThat(backupUtils.fileExists()).isTrue()
+
+ // Try to restore widgets
+ underTest.restoreWidgets(emptyMap())
+ runCurrent()
+
+ // The restore should fail, and verify that the file is deleted
+ assertThat(backupUtils.fileExists()).isFalse()
+ }
+
+ @Test
+ fun restoreWidgets_deleteStateFileAfterWidgetsRestored() =
+ testScope.runTest {
+ // Write a state file, and verify it is written
+ backupUtils.writeBytesToDisk(fakeState.toByteArray())
+ assertThat(backupUtils.fileExists()).isTrue()
+
+ // Set up app widget host with widget ids
+ setAppWidgetIds(listOf(11, 12))
+
+ // Restore widgets
+ underTest.restoreWidgets(mapOf(Pair(1, 11), Pair(2, 12)))
+ runCurrent()
+
+ // Verify state restored
+ verify(communalWidgetDao).restoreCommunalHubState(any())
+
+ // Verify state file deleted
+ assertThat(backupUtils.fileExists()).isFalse()
+ }
+
+ @Test
+ fun restoreWidgets_restoredWidgetsNotRegisteredWithHostAreSkipped() =
+ testScope.runTest {
+ // Write fake state to file
+ backupUtils.writeBytesToDisk(fakeState.toByteArray())
+
+ // Set up app widget host with widget ids. Widget 12 (previously 2) is absent.
+ setAppWidgetIds(listOf(11))
+
+ // Restore widgets.
+ underTest.restoreWidgets(mapOf(Pair(1, 11), Pair(2, 12)))
+ runCurrent()
+
+ // Verify state restored, and widget 2 skipped
+ val restoredState =
+ withArgCaptor<CommunalHubState> {
+ verify(communalWidgetDao).restoreCommunalHubState(capture())
+ }
+ val restoredWidgets = restoredState.widgets.toList()
+ assertThat(restoredWidgets).hasSize(1)
+
+ val restoredWidget = restoredWidgets.first()
+ val expectedWidget = fakeState.widgets.first()
+
+ // Verify widget id is updated, and the rest remain the same as expected
+ assertThat(restoredWidget.widgetId).isEqualTo(11)
+ assertThat(restoredWidget.componentName).isEqualTo(expectedWidget.componentName)
+ assertThat(restoredWidget.rank).isEqualTo(expectedWidget.rank)
+ }
+
+ @Test
+ fun restoreWidgets_registeredWidgetsNotRestoredAreRemoved() =
+ testScope.runTest {
+ // Write fake state to file
+ backupUtils.writeBytesToDisk(fakeState.toByteArray())
+
+ // Set up app widget host with widget ids. Widget 13 will not be restored.
+ setAppWidgetIds(listOf(11, 12, 13))
+
+ // Restore widgets.
+ underTest.restoreWidgets(mapOf(Pair(1, 11), Pair(2, 12)))
+ runCurrent()
+
+ // Verify widget 1 and 2 are restored, and are now 11 and 12.
+ val restoredState =
+ withArgCaptor<CommunalHubState> {
+ verify(communalWidgetDao).restoreCommunalHubState(capture())
+ }
+ val restoredWidgets = restoredState.widgets.toList()
+ assertThat(restoredWidgets).hasSize(2)
+
+ val restoredWidget1 = restoredWidgets[0]
+ val expectedWidget1 = fakeState.widgets[0]
+ assertThat(restoredWidget1.widgetId).isEqualTo(11)
+ assertThat(restoredWidget1.componentName).isEqualTo(expectedWidget1.componentName)
+ assertThat(restoredWidget1.rank).isEqualTo(expectedWidget1.rank)
+
+ val restoredWidget2 = restoredWidgets[1]
+ val expectedWidget2 = fakeState.widgets[1]
+ assertThat(restoredWidget2.widgetId).isEqualTo(12)
+ assertThat(restoredWidget2.componentName).isEqualTo(expectedWidget2.componentName)
+ assertThat(restoredWidget2.rank).isEqualTo(expectedWidget2.rank)
+
+ // Verify widget 13 removed since it is not restored
+ verify(appWidgetHost).deleteAppWidgetId(13)
+ }
+
+ @Test
+ fun restoreWidgets_onlySomeWidgetsGotNewIds() =
+ testScope.runTest {
+ // Write fake state to file
+ backupUtils.writeBytesToDisk(fakeState.toByteArray())
+
+ // Set up app widget host with widget ids. Widget 2 gets a new id: 12, but widget 1 does
+ // not.
+ setAppWidgetIds(listOf(1, 12))
+
+ // Restore widgets.
+ underTest.restoreWidgets(mapOf(Pair(2, 12)))
+ runCurrent()
+
+ // Verify widget 1 and 2 are restored, and are now 1 and 12.
+ val restoredState =
+ withArgCaptor<CommunalHubState> {
+ verify(communalWidgetDao).restoreCommunalHubState(capture())
+ }
+ val restoredWidgets = restoredState.widgets.toList()
+ assertThat(restoredWidgets).hasSize(2)
+
+ val restoredWidget1 = restoredWidgets[0]
+ val expectedWidget1 = fakeState.widgets[0]
+ assertThat(restoredWidget1.widgetId).isEqualTo(1)
+ assertThat(restoredWidget1.componentName).isEqualTo(expectedWidget1.componentName)
+ assertThat(restoredWidget1.rank).isEqualTo(expectedWidget1.rank)
+
+ val restoredWidget2 = restoredWidgets[1]
+ val expectedWidget2 = fakeState.widgets[1]
+ assertThat(restoredWidget2.widgetId).isEqualTo(12)
+ assertThat(restoredWidget2.componentName).isEqualTo(expectedWidget2.componentName)
+ assertThat(restoredWidget2.rank).isEqualTo(expectedWidget2.rank)
}
private fun installedProviders(providers: List<AppWidgetProviderInfo>) {
@@ -278,5 +451,22 @@
widgetFeatures =
WIDGET_FEATURE_CONFIGURATION_OPTIONAL or WIDGET_FEATURE_RECONFIGURABLE
}
+ val fakeState =
+ CommunalHubState().apply {
+ widgets =
+ listOf(
+ CommunalHubState.CommunalWidgetItem().apply {
+ widgetId = 1
+ componentName = "pk_name/fake_widget_1"
+ rank = 1
+ },
+ CommunalHubState.CommunalWidgetItem().apply {
+ widgetId = 2
+ componentName = "pk_name/fake_widget_2"
+ rank = 2
+ },
+ )
+ .toTypedArray()
+ }
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
index af48802..84c250c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
@@ -16,6 +16,7 @@
package com.android.systemui.deviceentry.domain.interactor
+import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.SceneKey
@@ -71,6 +72,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
@EnableSceneContainer
+@TestableLooper.RunWithLooper
class DeviceEntryInteractorTest : SysuiTestCase() {
private val kosmos = testKosmos()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/ui/binder/LiftToRunFaceAuthBinderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/ui/binder/LiftToRunFaceAuthBinderTest.kt
index e9e85c9..11cade2 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/ui/binder/LiftToRunFaceAuthBinderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/ui/binder/LiftToRunFaceAuthBinderTest.kt
@@ -66,7 +66,7 @@
@Captor private lateinit var triggerEventListenerCaptor: ArgumentCaptor<TriggerEventListener>
@Mock private lateinit var mockSensor: Sensor
- private val underTest = kosmos.liftToRunFaceAuthBinder
+ private val underTest by lazy { kosmos.liftToRunFaceAuthBinder }
@Before
fun setup() {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
index 41bc1dc..e2e5169 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
@@ -16,6 +16,8 @@
package com.android.systemui.dreams;
+import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
+
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
@@ -28,6 +30,7 @@
import android.content.res.Resources;
import android.graphics.Region;
import android.os.Handler;
+import android.testing.TestableLooper.RunWithLooper;
import android.view.AttachedSurfaceControl;
import android.view.ViewGroup;
import android.view.ViewRootImpl;
@@ -43,6 +46,7 @@
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerCallbackInteractor;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerCallbackInteractor.PrimaryBouncerExpansionCallback;
import com.android.systemui.complication.ComplicationHostViewController;
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.statusbar.BlurUtils;
import org.junit.Before;
@@ -52,8 +56,11 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import kotlinx.coroutines.CoroutineDispatcher;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
+@RunWithLooper(setAsMainLooper = true)
public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
private static final int MAX_BURN_IN_OFFSET = 20;
private static final long BURN_IN_PROTECTION_UPDATE_INTERVAL = 10;
@@ -87,6 +94,9 @@
Handler mHandler;
@Mock
+ CoroutineDispatcher mDispatcher;
+
+ @Mock
BlurUtils mBlurUtils;
@Mock
@@ -103,6 +113,8 @@
@Mock
DreamOverlayStateController mStateController;
+ @Mock
+ KeyguardTransitionInteractor mKeyguardTransitionInteractor;
DreamOverlayContainerViewController mController;
@@ -115,6 +127,7 @@
when(mDreamOverlayContainerView.getViewRootImpl()).thenReturn(mViewRoot);
when(mDreamOverlayContainerView.getRootSurfaceControl())
.thenReturn(mAttachedSurfaceControl);
+ when(mKeyguardTransitionInteractor.isFinishedInStateWhere(any())).thenReturn(emptyFlow());
mController = new DreamOverlayContainerViewController(
mDreamOverlayContainerView,
@@ -124,6 +137,7 @@
mLowLightTransitionCoordinator,
mBlurUtils,
mHandler,
+ mDispatcher,
mResources,
MAX_BURN_IN_OFFSET,
BURN_IN_PROTECTION_UPDATE_INTERVAL,
@@ -131,7 +145,8 @@
mPrimaryBouncerCallbackInteractor,
mAnimationsController,
mStateController,
- mBouncerlessScrimController);
+ mBouncerlessScrimController,
+ mKeyguardTransitionInteractor);
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
index b18a8ec..bdb0c9a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt
@@ -17,35 +17,52 @@
import android.content.ComponentName
import android.content.Intent
-import android.os.RemoteException
import android.service.dreams.IDreamOverlay
import android.service.dreams.IDreamOverlayCallback
import android.service.dreams.IDreamOverlayClient
import android.service.dreams.IDreamOverlayClientCallback
+import android.testing.TestableLooper
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.view.WindowManagerImpl
import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.compose.animation.scene.ObservableTransitionState
import com.android.internal.logging.UiEventLogger
import com.android.keyguard.KeyguardUpdateMonitor
+import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.SysuiTestCase
import com.android.systemui.ambient.touch.TouchMonitor
import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent
+import com.android.systemui.ambient.touch.scrim.ScrimController
+import com.android.systemui.ambient.touch.scrim.ScrimManager
+import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
+import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
+import com.android.systemui.communal.data.repository.FakeCommunalRepository
+import com.android.systemui.communal.data.repository.fakeCommunalRepository
+import com.android.systemui.communal.domain.interactor.communalInteractor
+import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.complication.ComplicationHostViewController
import com.android.systemui.complication.ComplicationLayoutEngine
import com.android.systemui.complication.dagger.ComplicationComponent
import com.android.systemui.dreams.complication.HideComplicationTouchHandler
import com.android.systemui.dreams.dagger.DreamOverlayComponent
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.android.systemui.touch.TouchInsetManager
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
-import com.google.common.truth.Truth
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.test.runCurrent
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -53,20 +70,24 @@
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito
+import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
-import org.mockito.invocation.InvocationOnMock
+@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
@RunWith(AndroidJUnit4::class)
class DreamOverlayServiceTest : SysuiTestCase() {
private val mFakeSystemClock = FakeSystemClock()
private val mMainExecutor = FakeExecutor(mFakeSystemClock)
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
@Mock lateinit var mLifecycleOwner: DreamOverlayLifecycleOwner
- @Mock lateinit var mLifecycleRegistry: LifecycleRegistry
+ private lateinit var lifecycleRegistry: FakeLifecycleRegistry
- lateinit var mWindowParams: WindowManager.LayoutParams
+ private lateinit var mWindowParams: WindowManager.LayoutParams
@Mock lateinit var mDreamOverlayCallback: IDreamOverlayCallback
@@ -114,18 +135,33 @@
@Mock lateinit var mUiEventLogger: UiEventLogger
+ @Mock lateinit var mScrimManager: ScrimManager
+
+ @Mock lateinit var mScrimController: ScrimController
+
+ @Mock lateinit var mSystemDialogsCloser: SystemDialogsCloser
+
@Mock lateinit var mDreamOverlayCallbackController: DreamOverlayCallbackController
+ private lateinit var bouncerRepository: FakeKeyguardBouncerRepository
+ private lateinit var communalRepository: FakeCommunalRepository
+
@Captor var mViewCaptor: ArgumentCaptor<View>? = null
- var mService: DreamOverlayService? = null
+ private lateinit var mService: DreamOverlayService
+
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
+
+ lifecycleRegistry = FakeLifecycleRegistry(mLifecycleOwner)
+ bouncerRepository = kosmos.fakeKeyguardBouncerRepository
+ communalRepository = kosmos.fakeCommunalRepository
+
whenever(mDreamOverlayComponent.getDreamOverlayContainerViewController())
.thenReturn(mDreamOverlayContainerViewController)
whenever(mComplicationComponent.getComplicationHostViewController())
.thenReturn(mComplicationHostViewController)
- whenever(mLifecycleOwner.registry).thenReturn(mLifecycleRegistry)
+ whenever(mLifecycleOwner.registry).thenReturn(lifecycleRegistry)
whenever(mComplicationComponentFactory.create(any(), any(), any(), any()))
.thenReturn(mComplicationComponent)
whenever(mComplicationComponent.getVisibilityController())
@@ -141,6 +177,7 @@
whenever(mAmbientTouchComponent.getTouchMonitor()).thenReturn(mTouchMonitor)
whenever(mDreamOverlayContainerViewController.containerView)
.thenReturn(mDreamOverlayContainerView)
+ whenever(mScrimManager.getCurrentController()).thenReturn(mScrimController)
mWindowParams = WindowManager.LayoutParams()
mService =
DreamOverlayService(
@@ -154,24 +191,30 @@
mAmbientTouchComponentFactory,
mStateController,
mKeyguardUpdateMonitor,
+ mScrimManager,
+ kosmos.communalInteractor,
+ mSystemDialogsCloser,
mUiEventLogger,
mTouchInsetManager,
LOW_LIGHT_COMPONENT,
HOME_CONTROL_PANEL_DREAM_COMPONENT,
mDreamOverlayCallbackController,
+ kosmos.keyguardInteractor,
WINDOW_NAME
)
}
- @get:Throws(RemoteException::class)
- val client: IDreamOverlayClient
+ private val client: IDreamOverlayClient
get() {
- val proxy = mService!!.onBind(Intent())
+ mService.onCreate()
+ TestableLooper.get(this).processAllMessages()
+
+ val proxy = mService.onBind(Intent())
val overlay = IDreamOverlay.Stub.asInterface(proxy)
val callback = Mockito.mock(IDreamOverlayClientCallback::class.java)
overlay.getClient(callback)
val clientCaptor = ArgumentCaptor.forClass(IDreamOverlayClient::class.java)
- Mockito.verify(callback).onDreamOverlayClient(clientCaptor.capture())
+ verify(callback).onDreamOverlayClient(clientCaptor.capture())
return clientCaptor.value
}
@@ -187,9 +230,8 @@
false /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Mockito.verify(mUiEventLogger)
- .log(DreamOverlayService.DreamOverlayEvent.DREAM_OVERLAY_ENTER_START)
- Mockito.verify(mUiEventLogger)
+ verify(mUiEventLogger).log(DreamOverlayService.DreamOverlayEvent.DREAM_OVERLAY_ENTER_START)
+ verify(mUiEventLogger)
.log(DreamOverlayService.DreamOverlayEvent.DREAM_OVERLAY_COMPLETE_START)
}
@@ -205,7 +247,7 @@
false /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Mockito.verify(mWindowManager).addView(any(), any())
+ verify(mWindowManager).addView(any(), any())
}
// Validates that {@link DreamOverlayService} properly handles the case where the dream's
@@ -224,14 +266,14 @@
false /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Mockito.verify(mWindowManager).addView(any(), any())
- Mockito.verify(mStateController).setOverlayActive(false)
- Mockito.verify(mStateController).setLowLightActive(false)
- Mockito.verify(mStateController).setEntryAnimationsFinished(false)
- Mockito.verify(mStateController, Mockito.never()).setOverlayActive(true)
- Mockito.verify(mUiEventLogger, Mockito.never())
+ verify(mWindowManager).addView(any(), any())
+ verify(mStateController).setOverlayActive(false)
+ verify(mStateController).setLowLightActive(false)
+ verify(mStateController).setEntryAnimationsFinished(false)
+ verify(mStateController, Mockito.never()).setOverlayActive(true)
+ verify(mUiEventLogger, Mockito.never())
.log(DreamOverlayService.DreamOverlayEvent.DREAM_OVERLAY_COMPLETE_START)
- Mockito.verify(mDreamOverlayCallbackController, Mockito.never()).onStartDream()
+ verify(mDreamOverlayCallbackController, Mockito.never()).onStartDream()
}
@Test
@@ -246,7 +288,7 @@
false /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Mockito.verify(mDreamOverlayContainerViewController).init()
+ verify(mDreamOverlayContainerViewController).init()
}
@Test
@@ -264,7 +306,7 @@
false /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Mockito.verify(mDreamOverlayContainerViewParent).removeView(mDreamOverlayContainerView)
+ verify(mDreamOverlayContainerViewParent).removeView(mDreamOverlayContainerView)
}
@Test
@@ -279,7 +321,7 @@
true /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Truth.assertThat(mService!!.shouldShowComplications()).isTrue()
+ assertThat(mService.shouldShowComplications()).isTrue()
}
@Test
@@ -294,8 +336,8 @@
false /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Truth.assertThat(mService!!.dreamComponent).isEqualTo(LOW_LIGHT_COMPONENT)
- Mockito.verify(mStateController).setLowLightActive(true)
+ assertThat(mService.dreamComponent).isEqualTo(LOW_LIGHT_COMPONENT)
+ verify(mStateController).setLowLightActive(true)
}
@Test
@@ -310,8 +352,8 @@
false /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Truth.assertThat(mService!!.dreamComponent).isEqualTo(HOME_CONTROL_PANEL_DREAM_COMPONENT)
- Mockito.verify(mStateController).setHomeControlPanelActive(true)
+ assertThat(mService.dreamComponent).isEqualTo(HOME_CONTROL_PANEL_DREAM_COMPONENT)
+ verify(mStateController).setHomeControlPanelActive(true)
}
@Test
@@ -328,19 +370,19 @@
mMainExecutor.runAllReady()
// Verify view added.
- Mockito.verify(mWindowManager).addView(mViewCaptor!!.capture(), any())
+ verify(mWindowManager).addView(mViewCaptor!!.capture(), any())
// Service destroyed.
- mService!!.onEndDream()
+ mService.onEndDream()
mMainExecutor.runAllReady()
// Verify view removed.
- Mockito.verify(mWindowManager).removeView(mViewCaptor!!.value)
+ verify(mWindowManager).removeView(mViewCaptor!!.value)
// Verify state correctly set.
- Mockito.verify(mStateController).setOverlayActive(false)
- Mockito.verify(mStateController).setLowLightActive(false)
- Mockito.verify(mStateController).setEntryAnimationsFinished(false)
+ verify(mStateController).setOverlayActive(false)
+ verify(mStateController).setLowLightActive(false)
+ verify(mStateController).setEntryAnimationsFinished(false)
}
@Test
@@ -373,7 +415,7 @@
// Schedule the endDream call in the middle of the startDream implementation, as any
// ordering is possible.
- Mockito.doAnswer { invocation: InvocationOnMock? ->
+ Mockito.doAnswer {
client.endDream()
null
}
@@ -409,37 +451,37 @@
mMainExecutor.runAllReady()
// Verify view added.
- Mockito.verify(mWindowManager).addView(mViewCaptor!!.capture(), any())
+ verify(mWindowManager).addView(mViewCaptor!!.capture(), any())
// Service destroyed.
- mService!!.onDestroy()
+ mService.onDestroy()
mMainExecutor.runAllReady()
// Verify view removed.
- Mockito.verify(mWindowManager).removeView(mViewCaptor!!.value)
+ verify(mWindowManager).removeView(mViewCaptor!!.value)
// Verify state correctly set.
- Mockito.verify(mKeyguardUpdateMonitor).removeCallback(any())
- Mockito.verify(mLifecycleRegistry).currentState = Lifecycle.State.DESTROYED
- Mockito.verify(mStateController).setOverlayActive(false)
- Mockito.verify(mStateController).setLowLightActive(false)
- Mockito.verify(mStateController).setEntryAnimationsFinished(false)
+ verify(mKeyguardUpdateMonitor).removeCallback(any())
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.DESTROYED)
+ verify(mStateController).setOverlayActive(false)
+ verify(mStateController).setLowLightActive(false)
+ verify(mStateController).setEntryAnimationsFinished(false)
}
@Test
fun testDoNotRemoveViewOnDestroyIfOverlayNotStarted() {
// Service destroyed without ever starting dream.
- mService!!.onDestroy()
+ mService.onDestroy()
mMainExecutor.runAllReady()
// Verify no view is removed.
- Mockito.verify(mWindowManager, Mockito.never()).removeView(any())
+ verify(mWindowManager, Mockito.never()).removeView(any())
// Verify state still correctly set.
- Mockito.verify(mKeyguardUpdateMonitor).removeCallback(any())
- Mockito.verify(mLifecycleRegistry).currentState = Lifecycle.State.DESTROYED
- Mockito.verify(mStateController).setOverlayActive(false)
- Mockito.verify(mStateController).setLowLightActive(false)
+ verify(mKeyguardUpdateMonitor).removeCallback(any())
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.DESTROYED)
+ verify(mStateController).setOverlayActive(false)
+ verify(mStateController).setLowLightActive(false)
}
@Test
@@ -447,7 +489,7 @@
val client = client
// Destroy the service.
- mService!!.onDestroy()
+ mService.onDestroy()
mMainExecutor.runAllReady()
// Inform the overlay service of dream starting.
@@ -458,15 +500,15 @@
false /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- Mockito.verify(mWindowManager, Mockito.never()).addView(any(), any())
+ verify(mWindowManager, Mockito.never()).addView(any(), any())
}
@Test
fun testNeverRemoveDecorViewIfNotAdded() {
// Service destroyed before dream started.
- mService!!.onDestroy()
+ mService.onDestroy()
mMainExecutor.runAllReady()
- Mockito.verify(mWindowManager, Mockito.never()).removeView(any())
+ verify(mWindowManager, Mockito.never()).removeView(any())
}
@Test
@@ -483,11 +525,11 @@
mMainExecutor.runAllReady()
// Verify that a new window is added.
- Mockito.verify(mWindowManager).addView(mViewCaptor!!.capture(), any())
+ verify(mWindowManager).addView(mViewCaptor!!.capture(), any())
val windowDecorView = mViewCaptor!!.value
// Assert that the overlay is not showing complications.
- Truth.assertThat(mService!!.shouldShowComplications()).isFalse()
+ assertThat(mService.shouldShowComplications()).isFalse()
Mockito.clearInvocations(mDreamOverlayComponent)
Mockito.clearInvocations(mAmbientTouchComponent)
Mockito.clearInvocations(mWindowManager)
@@ -504,16 +546,16 @@
mMainExecutor.runAllReady()
// Assert that the overlay is showing complications.
- Truth.assertThat(mService!!.shouldShowComplications()).isTrue()
+ assertThat(mService.shouldShowComplications()).isTrue()
// Verify that the old overlay window has been removed, and a new one created.
- Mockito.verify(mWindowManager).removeView(windowDecorView)
- Mockito.verify(mWindowManager).addView(any(), any())
+ verify(mWindowManager).removeView(windowDecorView)
+ verify(mWindowManager).addView(any(), any())
// Verify that new instances of overlay container view controller and overlay touch monitor
// are created.
- Mockito.verify(mDreamOverlayComponent).getDreamOverlayContainerViewController()
- Mockito.verify(mAmbientTouchComponent).getTouchMonitor()
+ verify(mDreamOverlayComponent).getDreamOverlayContainerViewController()
+ verify(mAmbientTouchComponent).getTouchMonitor()
}
@Test
@@ -528,15 +570,15 @@
true /*shouldShowComplication*/
)
mMainExecutor.runAllReady()
- mService!!.onWakeUp()
- Mockito.verify(mDreamOverlayContainerViewController).wakeUp()
- Mockito.verify(mDreamOverlayCallbackController).onWakeUp()
+ mService.onWakeUp()
+ verify(mDreamOverlayContainerViewController).wakeUp()
+ verify(mDreamOverlayCallbackController).onWakeUp()
}
@Test
fun testWakeUpBeforeStartDoesNothing() {
- mService!!.onWakeUp()
- Mockito.verify(mDreamOverlayContainerViewController, Mockito.never()).wakeUp()
+ mService.onWakeUp()
+ verify(mDreamOverlayContainerViewController, Mockito.never()).wakeUp()
}
@Test
@@ -554,8 +596,8 @@
val paramsCaptor = ArgumentCaptor.forClass(WindowManager.LayoutParams::class.java)
// Verify that a new window is added.
- Mockito.verify(mWindowManager).addView(any(), paramsCaptor.capture())
- Truth.assertThat(
+ verify(mWindowManager).addView(any(), paramsCaptor.capture())
+ assertThat(
paramsCaptor.value.privateFlags and
WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS ==
WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS
@@ -563,6 +605,254 @@
.isTrue()
}
+ // Tests that the bouncer closes when DreamOverlayService is told that the dream is coming to
+ // the front.
+ @Test
+ fun testBouncerRetractedWhenDreamComesToFront() {
+ val client = client
+
+ // Inform the overlay service of dream starting.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ true /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+
+ whenever(mDreamOverlayContainerViewController.isBouncerShowing()).thenReturn(true)
+ mService!!.onComeToFront()
+ verify(mScrimController).expand(any())
+ }
+
+ // Tests that glanceable hub is hidden when DreamOverlayService is told that the dream is
+ // coming to the front.
+ @Test
+ fun testGlanceableHubHiddenWhenDreamComesToFront() {
+ val client = client
+
+ // Inform the overlay service of dream starting.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ true /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+
+ mService!!.onComeToFront()
+ assertThat(communalRepository.currentScene.value).isEqualTo(CommunalScenes.Blank)
+ }
+
+ // Tests that system dialogs (e.g. notification shade) closes when DreamOverlayService is told
+ // that the dream is coming to the front.
+ @Test
+ fun testSystemDialogsClosedWhenDreamComesToFront() {
+ val client = client
+
+ // Inform the overlay service of dream starting.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ true /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+
+ mService!!.onComeToFront()
+ verify(mSystemDialogsCloser).closeSystemDialogs()
+ }
+
+ @Test
+ fun testLifecycle_createdAfterConstruction() {
+ mMainExecutor.runAllReady()
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.CREATED)
+ }
+
+ @Test
+ fun testLifecycle_resumedAfterDreamStarts() {
+ val client = client
+
+ // Inform the overlay service of dream starting. Do not show dream complications.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ false /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+ assertThat(lifecycleRegistry.mLifecycles)
+ .containsExactly(
+ Lifecycle.State.CREATED,
+ Lifecycle.State.STARTED,
+ Lifecycle.State.RESUMED
+ )
+ }
+
+ @Test
+ fun testLifecycle_destroyedAfterOnDestroy() {
+ val client = client
+
+ // Inform the overlay service of dream starting. Do not show dream complications.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ false /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+ mService.onDestroy()
+ mMainExecutor.runAllReady()
+ assertThat(lifecycleRegistry.mLifecycles)
+ .containsExactly(
+ Lifecycle.State.CREATED,
+ Lifecycle.State.STARTED,
+ Lifecycle.State.RESUMED,
+ Lifecycle.State.DESTROYED
+ )
+ }
+
+ @Test
+ fun testNotificationShadeShown_setsLifecycleState() {
+ val client = client
+
+ // Inform the overlay service of dream starting. Do not show dream complications.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ false /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
+ val callbackCaptor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java)
+ verify(mKeyguardUpdateMonitor).registerCallback(callbackCaptor.capture())
+
+ // Notification shade opens.
+ callbackCaptor.value.onShadeExpandedChanged(true)
+ mMainExecutor.runAllReady()
+
+ // Lifecycle state goes from resumed back to started when the notification shade shows.
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.STARTED)
+
+ // Notification shade closes.
+ callbackCaptor.value.onShadeExpandedChanged(false)
+ mMainExecutor.runAllReady()
+
+ // Lifecycle state goes back to RESUMED.
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
+ }
+
+ @Test
+ fun testBouncerShown_setsLifecycleState() {
+ val client = client
+
+ // Inform the overlay service of dream starting. Do not show dream complications.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ false /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
+
+ // Bouncer shows.
+ bouncerRepository.setPrimaryShow(true)
+ testScope.runCurrent()
+ mMainExecutor.runAllReady()
+
+ // Lifecycle state goes from resumed back to started when the notification shade shows.
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.STARTED)
+
+ // Bouncer closes.
+ bouncerRepository.setPrimaryShow(false)
+ testScope.runCurrent()
+ mMainExecutor.runAllReady()
+
+ // Lifecycle state goes back to RESUMED.
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
+ }
+
+ @Test
+ fun testCommunalVisible_setsLifecycleState() {
+ val client = client
+
+ // Inform the overlay service of dream starting. Do not show dream complications.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ false /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
+ val transitionState: MutableStateFlow<ObservableTransitionState> =
+ MutableStateFlow(ObservableTransitionState.Idle(CommunalScenes.Blank))
+ communalRepository.setTransitionState(transitionState)
+
+ // Communal becomes visible.
+ transitionState.value = ObservableTransitionState.Idle(CommunalScenes.Communal)
+ testScope.runCurrent()
+ mMainExecutor.runAllReady()
+
+ // Lifecycle state goes from resumed back to started when the notification shade shows.
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.STARTED)
+
+ // Communal closes.
+ transitionState.value = ObservableTransitionState.Idle(CommunalScenes.Blank)
+ testScope.runCurrent()
+ mMainExecutor.runAllReady()
+
+ // Lifecycle state goes back to RESUMED.
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
+ }
+
+ // Verifies the dream's lifecycle
+ @Test
+ fun testLifecycleStarted_whenAnyOcclusion() {
+ val client = client
+
+ // Inform the overlay service of dream starting. Do not show dream complications.
+ client.startDream(
+ mWindowParams,
+ mDreamOverlayCallback,
+ DREAM_COMPONENT,
+ false /*shouldShowComplication*/
+ )
+ mMainExecutor.runAllReady()
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
+ val transitionState: MutableStateFlow<ObservableTransitionState> =
+ MutableStateFlow(ObservableTransitionState.Idle(CommunalScenes.Blank))
+ communalRepository.setTransitionState(transitionState)
+
+ // Communal becomes visible.
+ transitionState.value = ObservableTransitionState.Idle(CommunalScenes.Communal)
+ testScope.runCurrent()
+ mMainExecutor.runAllReady()
+
+ // Lifecycle state goes from resumed back to started when the notification shade shows.
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.STARTED)
+
+ // Communal closes.
+ transitionState.value = ObservableTransitionState.Idle(CommunalScenes.Blank)
+ testScope.runCurrent()
+ mMainExecutor.runAllReady()
+
+ // Lifecycle state goes back to RESUMED.
+ assertThat(lifecycleRegistry.currentState).isEqualTo(Lifecycle.State.RESUMED)
+ }
+
+ internal class FakeLifecycleRegistry(provider: LifecycleOwner) : LifecycleRegistry(provider) {
+ val mLifecycles: MutableList<State> = ArrayList()
+
+ override var currentState: State
+ get() = mLifecycles[mLifecycles.size - 1]
+ set(state) {
+ mLifecycles.add(state)
+ }
+ }
+
companion object {
private val LOW_LIGHT_COMPONENT = ComponentName("package", "lowlight")
private val HOME_CONTROL_PANEL_DREAM_COMPONENT =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/CommunalTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/CommunalTouchHandlerTest.java
index 29fbee0..e3c6dee 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/CommunalTouchHandlerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/CommunalTouchHandlerTest.java
@@ -108,7 +108,7 @@
mTouchHandler.onSessionStart(mTouchSession);
verify(mTouchSession).registerInputListener(inputEventListenerArgumentCaptor.capture());
inputEventListenerArgumentCaptor.getValue().onInputEvent(motionEvent);
- verify(mCentralSurfaces).handleDreamTouch(motionEvent);
+ verify(mCentralSurfaces).handleExternalShadeWindowTouch(motionEvent);
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekableSliderHapticPluginTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt
similarity index 96%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekableSliderHapticPluginTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt
index 805b4a8..855b6d0 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekableSliderHapticPluginTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt
@@ -44,14 +44,14 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
@OptIn(ExperimentalCoroutinesApi::class)
-class SeekableSliderHapticPluginTest : SysuiTestCase() {
+class SeekbarHapticPluginTest : SysuiTestCase() {
private val kosmos = Kosmos()
@Rule @JvmField val mMockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock private lateinit var vibratorHelper: VibratorHelper
private val seekBar = SeekBar(mContext)
- private lateinit var plugin: SeekableSliderHapticPlugin
+ private lateinit var plugin: SeekbarHapticPlugin
@Before
fun setup() {
@@ -142,7 +142,7 @@
private fun createPlugin() {
plugin =
- SeekableSliderHapticPlugin(
+ SeekbarHapticPlugin(
vibratorHelper,
kosmos.fakeSystemClock,
)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateProducerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateProducerTest.kt
new file mode 100644
index 0000000..88189db
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateProducerTest.kt
@@ -0,0 +1,134 @@
+/*
+ * 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.haptics.slider
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import junit.framework.Assert.assertEquals
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class SliderStateProducerTest : SysuiTestCase() {
+
+ private val eventProducer = SliderStateProducer()
+ private val eventFlow = eventProducer.produceEvents()
+
+ @Test
+ fun onStartTrackingTouch_noProgress_trackingTouchEventProduced() = runTest {
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onStartTracking(/*fromUser =*/ true)
+
+ assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0F), latest)
+ }
+
+ @Test
+ fun onStopTrackingTouch_noProgress_StoppedTrackingTouchEventProduced() = runTest {
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onStopTracking(/*fromUser =*/ true)
+
+ assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0F), latest)
+ }
+
+ @Test
+ fun onStartTrackingProgram_noProgress_trackingTouchEventProduced() = runTest {
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onStartTracking(/*fromUser =*/ false)
+
+ assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, 0F), latest)
+ }
+
+ @Test
+ fun onStopTrackingProgram_noProgress_StoppedTrackingTouchEventProduced() = runTest {
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onStopTracking(/*fromUser =*/ false)
+
+ assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, 0F), latest)
+ }
+
+ @Test
+ fun onProgressChangeByUser_changeByUserEventProduced() = runTest {
+ val progress = 0.5f
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onProgressChanged(/*fromUser =*/ true, progress)
+
+ assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress), latest)
+ }
+
+ @Test
+ fun onProgressChangeByProgram_changeByProgramEventProduced() = runTest {
+ val progress = 0.5f
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onProgressChanged(/*fromUser =*/ false, progress)
+
+ assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress), latest)
+ }
+
+ @Test
+ fun onStartTrackingTouch_afterProgress_trackingTouchEventProduced() = runTest {
+ val progress = 0.5f
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onProgressChanged(/*fromUser =*/ true, progress)
+ eventProducer.onStartTracking(/*fromUser =*/ true)
+
+ assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress), latest)
+ }
+
+ @Test
+ fun onStopTrackingTouch_afterProgress_stopTrackingTouchEventProduced() = runTest {
+ val progress = 0.5f
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onProgressChanged(/*fromUser =*/ true, progress)
+ eventProducer.onStopTracking(/*fromUser =*/ true)
+
+ assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, progress), latest)
+ }
+
+ @Test
+ fun onStartTrackingProgram_afterProgress_trackingProgramEventProduced() = runTest {
+ val progress = 0.5f
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onProgressChanged(/*fromUser =*/ false, progress)
+ eventProducer.onStartTracking(/*fromUser =*/ false)
+
+ assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress), latest)
+ }
+
+ @Test
+ fun onStopTrackingProgram_afterProgress_stopTrackingProgramEventProduced() = runTest {
+ val progress = 0.5f
+ val latest by collectLastValue(eventFlow)
+
+ eventProducer.onProgressChanged(/*fromUser =*/ false, progress)
+ eventProducer.onStopTracking(/*fromUser =*/ false)
+
+ assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress), latest)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
similarity index 97%
rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
index 52bdf0e..cfc6b33 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
@@ -46,11 +46,12 @@
import com.android.systemui.power.shared.model.WakeSleepReason
import com.android.systemui.power.shared.model.WakefulnessState
import com.android.systemui.testKosmos
-import kotlin.test.Test
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
+import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.mockito.Mockito.reset
@@ -124,6 +125,8 @@
)
kosmos.fakeKeyguardRepository.setKeyguardOccluded(true)
kosmos.fakeKeyguardBouncerRepository.setAlternateVisible(true)
+ runCurrent()
+
transitionRepository.sendTransitionSteps(
from = KeyguardState.OCCLUDED,
to = KeyguardState.ALTERNATE_BOUNCER,
@@ -132,8 +135,7 @@
reset(transitionRepository)
kosmos.fakeKeyguardBouncerRepository.setAlternateVisible(false)
- runCurrent()
- testScope.testScheduler.advanceTimeBy(200) // advance past delay
+ advanceTimeBy(200) // advance past delay
assertThat(transitionRepository)
.startedTransition(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
index 31337a6..e270d9e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
@@ -28,6 +28,7 @@
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
import com.android.systemui.keyguard.domain.interactor.burnInInteractor
import com.android.systemui.keyguard.shared.model.BurnInModel
+import com.android.systemui.keyguard.shared.model.ClockSize
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
@@ -59,6 +60,7 @@
private val kosmos = testKosmos()
private val testScope = kosmos.testScope
private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ private val keyguardClockRepository = kosmos.fakeKeyguardClockRepository
private lateinit var underTest: AodBurnInViewModel
private var burnInParameters = BurnInParameters()
@@ -67,6 +69,7 @@
@Before
fun setUp() {
mSetFlagsRule.disableFlags(AConfigFlags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT)
+ mSetFlagsRule.disableFlags(AConfigFlags.FLAG_COMPOSE_LOCKSCREEN)
MockitoAnnotations.initMocks(this)
whenever(burnInInteractor.burnIn(anyInt(), anyInt())).thenReturn(burnInFlow)
@@ -298,4 +301,80 @@
assertThat(movement?.scale).isEqualTo(0.5f)
assertThat(movement?.scaleClockOnly).isEqualTo(false)
}
+
+ @Test
+ fun translationAndScale_composeFlagOn_weatherLargeClock() =
+ testBurnInViewModelWhenComposeFlagOn(
+ isSmallClock = false,
+ isWeatherClock = true,
+ expectedScaleOnly = false
+ )
+
+ @Test
+ fun translationAndScale_composeFlagOn_weatherSmallClock() =
+ testBurnInViewModelWhenComposeFlagOn(
+ isSmallClock = true,
+ isWeatherClock = true,
+ expectedScaleOnly = true
+ )
+
+ @Test
+ fun translationAndScale_composeFlagOn_nonWeatherLargeClock() =
+ testBurnInViewModelWhenComposeFlagOn(
+ isSmallClock = false,
+ isWeatherClock = false,
+ expectedScaleOnly = true
+ )
+
+ @Test
+ fun translationAndScale_composeFlagOn_nonWeatherSmallClock() =
+ testBurnInViewModelWhenComposeFlagOn(
+ isSmallClock = true,
+ isWeatherClock = false,
+ expectedScaleOnly = true
+ )
+
+ private fun testBurnInViewModelWhenComposeFlagOn(
+ isSmallClock: Boolean,
+ isWeatherClock: Boolean,
+ expectedScaleOnly: Boolean
+ ) =
+ testScope.runTest {
+ mSetFlagsRule.enableFlags(AConfigFlags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT)
+ mSetFlagsRule.enableFlags(AConfigFlags.FLAG_COMPOSE_LOCKSCREEN)
+ if (isSmallClock) {
+ keyguardClockRepository.setClockSize(ClockSize.SMALL)
+ // we need the following step to update stateFlow value
+ kosmos.testScope.collectLastValue(kosmos.keyguardClockViewModel.clockSize)
+ }
+
+ whenever(clockController.config.useAlternateSmartspaceAODTransition)
+ .thenReturn(if (isWeatherClock) true else false)
+
+ val movement by collectLastValue(underTest.movement(burnInParameters))
+
+ // Set to dozing (on AOD)
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.LOCKSCREEN,
+ to = KeyguardState.AOD,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ ),
+ validateStep = false,
+ )
+
+ // Trigger a change to the burn-in model
+ burnInFlow.value =
+ BurnInModel(
+ translationX = 20,
+ translationY = 30,
+ scale = 0.5f,
+ )
+
+ assertThat(movement?.translationX).isEqualTo(20)
+ assertThat(movement?.translationY).isEqualTo(30)
+ assertThat(movement?.scale).isEqualTo(0.5f)
+ assertThat(movement?.scaleClockOnly).isEqualTo(expectedScaleOnly)
+ }
}
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 e39511f..1e5f314 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
@@ -267,6 +267,35 @@
.inOrder()
}
+ @Test
+ fun loadMediaFromRec() =
+ testScope.runTest {
+ val isMediaFromRec by collectLastValue(underTest.isMediaFromRec)
+ val instanceId1 = InstanceId.fakeInstanceId(123)
+ val instanceId2 = InstanceId.fakeInstanceId(456)
+ val data =
+ MediaData(
+ active = true,
+ instanceId = instanceId1,
+ packageName = PACKAGE_NAME,
+ isPlaying = true
+ )
+ val newData = MediaData(active = true, instanceId = instanceId2)
+
+ assertThat(isMediaFromRec).isFalse()
+
+ underTest.setMediaFromRecPackageName(PACKAGE_NAME)
+ underTest.addSelectedUserMediaEntry(data)
+ underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId1))
+
+ assertThat(isMediaFromRec).isTrue()
+
+ underTest.addSelectedUserMediaEntry(newData)
+ underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId2))
+
+ assertThat(isMediaFromRec).isFalse()
+ }
+
private fun createMediaData(
app: String,
playing: Boolean,
@@ -288,5 +317,6 @@
private const val REMOTE = MediaData.PLAYBACK_CAST_LOCAL
private const val KEY = "KEY"
private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
+ private const val PACKAGE_NAME = "com.android.example"
}
}
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 a2991fd..e44affc7 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
@@ -20,6 +20,7 @@
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.flags.Flags
@@ -29,7 +30,9 @@
import com.android.systemui.media.controls.data.repository.MediaFilterRepository
import com.android.systemui.media.controls.data.repository.mediaFilterRepository
import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor
+import com.android.systemui.media.controls.domain.pipeline.interactor.MediaRecommendationsInteractor
import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor
+import com.android.systemui.media.controls.domain.pipeline.interactor.mediaRecommendationsInteractor
import com.android.systemui.media.controls.shared.model.MediaCommonModel
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.controls.shared.model.MediaDataLoadingModel
@@ -50,6 +53,8 @@
private val testScope = kosmos.testScope
private val mediaFilterRepository: MediaFilterRepository = kosmos.mediaFilterRepository
+ private val mediaRecommendationsInteractor: MediaRecommendationsInteractor =
+ kosmos.mediaRecommendationsInteractor
private val underTest: MediaCarouselInteractor = kosmos.mediaCarouselInteractor
@@ -226,7 +231,29 @@
fun hasActiveMediaOrRecommendation_nothingSet_returnsFalse() =
testScope.runTest { assertThat(underTest.hasActiveMediaOrRecommendation.value).isFalse() }
+ @Test
+ fun loadMediaFromRec() =
+ testScope.runTest {
+ val isMediaFromRec by collectLastValue(underTest.isMediaFromRec)
+ val instanceId = InstanceId.fakeInstanceId(123)
+ val data = MediaData(active = true, instanceId = instanceId, packageName = PACKAGE_NAME)
+
+ assertThat(isMediaFromRec).isFalse()
+
+ mediaRecommendationsInteractor.switchToMediaControl(PACKAGE_NAME)
+ mediaFilterRepository.addSelectedUserMediaEntry(data)
+ mediaFilterRepository.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId))
+
+ assertThat(isMediaFromRec).isFalse()
+
+ mediaFilterRepository.addSelectedUserMediaEntry(data.copy(isPlaying = true))
+ mediaFilterRepository.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId))
+
+ assertThat(isMediaFromRec).isTrue()
+ }
+
companion object {
private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
+ private const val PACKAGE_NAME = "com.android.example"
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelTest.kt
index 4b5fecd..d1e475f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelTest.kt
@@ -31,9 +31,11 @@
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.mediaCarouselInteractor
+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.MediaData
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
+import com.android.systemui.statusbar.notification.collection.provider.visualStabilityProvider
import com.android.systemui.statusbar.notificationLockscreenUserManager
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
@@ -119,7 +121,35 @@
assertThat(recsCard.key).isEqualTo(KEY_MEDIA_SMARTSPACE)
}
- private fun loadMediaControl(key: String, instanceId: InstanceId) {
+ @Test
+ fun recommendationClicked_switchToPlayer() =
+ testScope.runTest {
+ val sortedMedia by collectLastValue(underTest.mediaItems)
+ kosmos.visualStabilityProvider.isReorderingAllowed = false
+ kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
+ val instanceId = InstanceId.fakeInstanceId(123)
+
+ loadMediaRecommendations()
+ kosmos.mediaRecommendationsInteractor.switchToMediaControl(PACKAGE_NAME)
+
+ var recsCard = sortedMedia?.get(0) as MediaCommonViewModel.MediaRecommendations
+ assertThat(sortedMedia).hasSize(1)
+ assertThat(recsCard.key).isEqualTo(KEY_MEDIA_SMARTSPACE)
+
+ loadMediaControl(KEY, instanceId, false)
+
+ recsCard = sortedMedia?.get(0) as MediaCommonViewModel.MediaRecommendations
+ assertThat(sortedMedia).hasSize(1)
+ assertThat(recsCard.key).isEqualTo(KEY_MEDIA_SMARTSPACE)
+
+ loadMediaControl(KEY, instanceId, true)
+
+ val mediaControl = sortedMedia?.get(0) as MediaCommonViewModel.MediaControl
+ assertThat(sortedMedia).hasSize(2)
+ assertThat(mediaControl.instanceId).isEqualTo(instanceId)
+ }
+
+ private fun loadMediaControl(key: String, instanceId: InstanceId, isPlaying: Boolean = true) {
whenever(notificationLockscreenUserManager.isCurrentProfile(USER_ID)).thenReturn(true)
whenever(notificationLockscreenUserManager.isProfileAvailable(USER_ID)).thenReturn(true)
val mediaData =
@@ -127,7 +157,8 @@
userId = USER_ID,
packageName = PACKAGE_NAME,
notificationKey = key,
- instanceId = instanceId
+ instanceId = instanceId,
+ isPlaying = isPlaying,
)
mediaDataFilter.onMediaDataLoaded(key, key, mediaData)
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 6fa2273..2586ad541 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
@@ -25,10 +25,12 @@
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.SceneKey
+import com.android.internal.logging.uiEventLoggerFake
import com.android.systemui.SysuiTestCase
import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.bouncer.domain.interactor.bouncerInteractor
+import com.android.systemui.bouncer.shared.logging.BouncerUiEvent
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.falsingCollector
import com.android.systemui.classifier.falsingManager
@@ -39,6 +41,7 @@
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.fakeTrustRepository
import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
import com.android.systemui.model.sysUiState
@@ -97,6 +100,8 @@
private val windowController = kosmos.notificationShadeWindowController
private val centralSurfaces = kosmos.centralSurfaces
private val powerInteractor = kosmos.powerInteractor
+ private val fakeTrustRepository = kosmos.fakeTrustRepository
+ private val uiEventLoggerFake = kosmos.uiEventLoggerFake
private lateinit var underTest: SceneContainerStartable
@@ -1233,6 +1238,25 @@
assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
}
+ @Test
+ fun switchToGone_extendUnlock() =
+ testScope.runTest {
+ val currentScene by collectLastValue(sceneInteractor.currentScene)
+ prepareState(
+ initialSceneKey = Scenes.Bouncer,
+ authenticationMethod = AuthenticationMethodModel.Pin,
+ )
+ assertThat(currentScene).isEqualTo(Scenes.Bouncer)
+
+ underTest.start()
+ fakeTrustRepository.setCurrentUserTrusted(true)
+
+ assertThat(currentScene).isEqualTo(Scenes.Gone)
+ assertThat(uiEventLoggerFake[0].eventId)
+ .isEqualTo(BouncerUiEvent.BOUNCER_DISMISS_EXTENDED_ACCESS.id)
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+ }
+
private fun TestScope.emulateSceneTransition(
transitionStateFlow: MutableStateFlow<ObservableTransitionState>,
toScene: SceneKey,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagParameterizationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagParameterizationTest.kt
index db31ad5..4d69f0d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagParameterizationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagParameterizationTest.kt
@@ -24,6 +24,7 @@
import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
import com.android.systemui.SysuiTestCase
import com.android.systemui.flags.andSceneContainer
+import com.android.systemui.flags.parameterizeSceneContainerFlag
import com.google.common.truth.Truth
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,6 +42,14 @@
}
@Test
+ fun parameterizeSceneContainer() {
+ val result = parameterizeSceneContainerFlag()
+ Truth.assertThat(result).hasSize(2)
+ Truth.assertThat(result[0].mOverrides[FLAG_SCENE_CONTAINER]).isFalse()
+ Truth.assertThat(result[1].mOverrides[FLAG_SCENE_CONTAINER]).isTrue()
+ }
+
+ @Test
fun oneUnrelatedAndSceneContainer() {
val unrelatedFlag = FLAG_EXAMPLE_FLAG
val result = FlagsParameterization.allCombinationsOf(unrelatedFlag).andSceneContainer()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
similarity index 77%
rename from packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
index b89ccef..a8da116 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
@@ -29,7 +29,6 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
@@ -37,12 +36,10 @@
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
-import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
-
import android.app.IActivityManager;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
-import android.testing.AndroidTestingRunner;
+import android.platform.test.flag.junit.FlagsParameterization;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
import android.view.WindowManager;
@@ -50,51 +47,26 @@
import androidx.test.filters.SmallTest;
import com.android.internal.colorextraction.ColorExtractor;
-import com.android.keyguard.KeyguardSecurityModel;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.biometrics.AuthController;
-import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository;
import com.android.systemui.colorextraction.SysuiColorExtractor;
-import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository;
-import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor;
import com.android.systemui.communal.domain.interactor.CommunalInteractor;
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor;
import com.android.systemui.dump.DumpManager;
-import com.android.systemui.flags.FakeFeatureFlagsClassic;
+import com.android.systemui.flags.SceneContainerFlagParameterizationKt;
import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.keyguard.data.repository.FakeCommandQueue;
-import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
-import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor;
-import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor;
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.kosmos.KosmosJavaAdapter;
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.FakeWindowRootViewComponent;
-import com.android.systemui.scene.data.repository.SceneContainerRepository;
-import com.android.systemui.scene.domain.interactor.SceneInteractor;
-import com.android.systemui.scene.shared.logger.SceneLogger;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.shade.data.repository.FakeShadeRepository;
-import com.android.systemui.shade.domain.interactor.ShadeInteractor;
-import com.android.systemui.shade.domain.interactor.ShadeInteractorImpl;
-import com.android.systemui.shade.domain.interactor.ShadeInteractorLegacyImpl;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
-import com.android.systemui.statusbar.disableflags.data.repository.FakeDisableFlagsRepository;
-import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController;
-import com.android.systemui.statusbar.policy.data.repository.FakeUserSetupRepository;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
-import com.android.systemui.user.domain.interactor.UserSwitcherInteractor;
import com.google.common.util.concurrent.MoreExecutors;
@@ -110,13 +82,13 @@
import java.util.List;
import java.util.concurrent.Executor;
-import kotlinx.coroutines.test.TestScope;
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
+import platform.test.runner.parameterized.Parameters;
-@RunWith(AndroidTestingRunner.class)
+@RunWith(ParameterizedAndroidJunit4.class)
@RunWithLooper(setAsMainLooper = true)
@SmallTest
public class NotificationShadeWindowControllerImplTest extends SysuiTestCase {
-
@Mock private WindowManager mWindowManager;
@Mock private DozeParameters mDozeParameters;
@Spy private final NotificationShadeWindowView mNotificationShadeWindowView = spy(
@@ -128,29 +100,31 @@
@Mock private SysuiColorExtractor mColorExtractor;
@Mock private ColorExtractor.GradientColors mGradientColors;
@Mock private DumpManager mDumpManager;
- @Mock private KeyguardSecurityModel mKeyguardSecurityModel;
@Mock private KeyguardStateController mKeyguardStateController;
@Mock private AuthController mAuthController;
@Mock private ShadeWindowLogger mShadeWindowLogger;
@Mock private SelectedUserInteractor mSelectedUserInteractor;
@Mock private UserTracker mUserTracker;
- @Mock private LargeScreenHeaderHelper mLargeScreenHeaderHelper;
@Captor private ArgumentCaptor<WindowManager.LayoutParams> mLayoutParameters;
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListener;
private final Executor mMainExecutor = MoreExecutors.directExecutor();
private final Executor mBackgroundExecutor = MoreExecutors.directExecutor();
private final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this);
- private final TestScope mTestScope = mKosmos.getTestScope();
- private ShadeInteractor mShadeInteractor;
private NotificationShadeWindowControllerImpl mNotificationShadeWindowController;
private float mPreferredRefreshRate = -1;
- private FromLockscreenTransitionInteractor mFromLockscreenTransitionInteractor;
- private FromPrimaryBouncerTransitionInteractor mFromPrimaryBouncerTransitionInteractor;
- private ScreenOffAnimationController mScreenOffAnimationController;
private SysuiStatusBarStateController mStatusBarStateController;
+ @Parameters(name = "{0}")
+ public static List<FlagsParameterization> getParams() {
+ return SceneContainerFlagParameterizationKt.parameterizeSceneContainerFlag();
+ }
+
+ public NotificationShadeWindowControllerImplTest(FlagsParameterization flags) {
+ mSetFlagsRule.setFlagsParameterization(flags);
+ }
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -164,71 +138,7 @@
when(mDozeParameters.getAlwaysOn()).thenReturn(true);
when(mColorExtractor.getNeutralColors()).thenReturn(mGradientColors);
- FakeKeyguardRepository keyguardRepository = new FakeKeyguardRepository();
- FakeFeatureFlagsClassic featureFlags = new FakeFeatureFlagsClassic();
- FakeShadeRepository shadeRepository = new FakeShadeRepository();
-
- mScreenOffAnimationController = mKosmos.getScreenOffAnimationController();
mStatusBarStateController = spy(mKosmos.getStatusBarStateController());
- PowerInteractor powerInteractor = mKosmos.getPowerInteractor();
-
- SceneInteractor sceneInteractor = new SceneInteractor(
- mTestScope.getBackgroundScope(),
- new SceneContainerRepository(
- mTestScope.getBackgroundScope(),
- mKosmos.getFakeSceneContainerConfig(),
- mKosmos.getSceneDataSource()),
- mock(SceneLogger.class),
- mKosmos.getDeviceUnlockedInteractor());
-
- FakeConfigurationRepository configurationRepository = new FakeConfigurationRepository();
- KeyguardTransitionInteractor keyguardTransitionInteractor =
- mKosmos.getKeyguardTransitionInteractor();
- KeyguardInteractor keyguardInteractor = new KeyguardInteractor(
- keyguardRepository,
- new FakeCommandQueue(),
- powerInteractor,
- new FakeKeyguardBouncerRepository(),
- new ConfigurationInteractor(configurationRepository),
- shadeRepository,
- keyguardTransitionInteractor,
- () -> sceneInteractor,
- () -> mKosmos.getFromGoneTransitionInteractor(),
- () -> mKosmos.getSharedNotificationContainerInteractor(),
- mTestScope);
- CommunalInteractor communalInteractor = mKosmos.getCommunalInteractor();
-
- mFromLockscreenTransitionInteractor = mKosmos.getFromLockscreenTransitionInteractor();
- mFromPrimaryBouncerTransitionInteractor =
- mKosmos.getFromPrimaryBouncerTransitionInteractor();
-
- DeviceEntryUdfpsInteractor deviceEntryUdfpsInteractor =
- mock(DeviceEntryUdfpsInteractor.class);
- when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(MutableStateFlow(false));
-
- mShadeInteractor = new ShadeInteractorImpl(
- mTestScope.getBackgroundScope(),
- mKosmos.getDeviceProvisioningInteractor(),
- new FakeDisableFlagsRepository(),
- mock(DozeParameters.class),
- keyguardRepository,
- keyguardTransitionInteractor,
- powerInteractor,
- new FakeUserSetupRepository(),
- mock(UserSwitcherInteractor.class),
- new ShadeInteractorLegacyImpl(
- mTestScope.getBackgroundScope(),
- keyguardRepository,
- new SharedNotificationContainerInteractor(
- configurationRepository,
- mContext,
- new ResourcesSplitShadeStateController(),
- keyguardInteractor,
- deviceEntryUdfpsInteractor,
- () -> mLargeScreenHeaderHelper),
- shadeRepository
- )
- );
mNotificationShadeWindowController = new NotificationShadeWindowControllerImpl(
mContext,
@@ -245,13 +155,13 @@
mColorExtractor,
mDumpManager,
mKeyguardStateController,
- mScreenOffAnimationController,
+ mKosmos.getScreenOffAnimationController(),
mAuthController,
- () -> mShadeInteractor,
+ mKosmos::getShadeInteractor,
mShadeWindowLogger,
() -> mSelectedUserInteractor,
mUserTracker,
- () -> communalInteractor) {
+ mKosmos::getCommunalInteractor) {
@Override
protected boolean isDebuggable() {
return false;
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImplTest.kt
index 96b2b7a..aa0ca18 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImplTest.kt
@@ -24,7 +24,7 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.flags.andSceneContainer
+import com.android.systemui.flags.parameterizeSceneContainerFlag
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.DozeStateModel
@@ -80,7 +80,7 @@
@JvmStatic
@Parameters(name = "{0}")
fun getParams(): List<FlagsParameterization> {
- return FlagsParameterization.allCombinationsOf().andSceneContainer()
+ return parameterizeSceneContainerFlag()
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
index 2ab934c..07c4b00 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
@@ -16,7 +16,7 @@
package com.android.systemui.shade.domain.startable
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.SceneKey
@@ -25,9 +25,8 @@
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
-import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.flags.parameterizeSceneContainerFlag
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
@@ -50,24 +49,42 @@
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
+import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
-@RunWith(AndroidJUnit4::class)
-class ShadeStartableTest : SysuiTestCase() {
+@RunWith(ParameterizedAndroidJunit4::class)
+class ShadeStartableTest(flags: FlagsParameterization?) : SysuiTestCase() {
private val kosmos = testKosmos()
private val testScope = kosmos.testScope
- private val shadeInteractor = kosmos.shadeInteractor
- private val sceneInteractor = kosmos.sceneInteractor
- private val shadeExpansionStateManager = kosmos.shadeExpansionStateManager
- private val deviceEntryRepository = kosmos.fakeDeviceEntryRepository
- private val deviceUnlockedInteractor = kosmos.deviceUnlockedInteractor
- private val fakeConfigurationRepository = kosmos.fakeConfigurationRepository
- private val fakeSceneDataSource = kosmos.fakeSceneDataSource
+ private val shadeInteractor by lazy { kosmos.shadeInteractor }
+ private val sceneInteractor by lazy { kosmos.sceneInteractor }
+ private val shadeExpansionStateManager by lazy { kosmos.shadeExpansionStateManager }
+ private val fakeConfigurationRepository by lazy { kosmos.fakeConfigurationRepository }
+ private val fakeSceneDataSource by lazy { kosmos.fakeSceneDataSource }
- private val underTest = kosmos.shadeStartable
+ private lateinit var underTest: ShadeStartable
+
+ companion object {
+ @JvmStatic
+ @Parameters(name = "{0}")
+ fun getParams(): List<FlagsParameterization> {
+ return parameterizeSceneContainerFlag()
+ }
+ }
+
+ init {
+ mSetFlagsRule.setFlagsParameterization(flags!!)
+ }
+
+ @Before
+ fun setup() {
+ underTest = kosmos.shadeStartable
+ }
@Test
fun hydrateShadeMode() =
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 2397de6..5312ad8 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
@@ -28,6 +28,7 @@
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
@@ -65,6 +66,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
+@EnableSceneContainer
class ShadeSceneViewModelTest : SysuiTestCase() {
private val kosmos = testKosmos()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
similarity index 69%
rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
index be5af88..d353a62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 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,60 +19,32 @@
package com.android.systemui.statusbar
import android.animation.ObjectAnimator
-import android.testing.AndroidTestingRunner
+import android.platform.test.flag.junit.FlagsParameterization
import android.testing.TestableLooper
import androidx.test.filters.SmallTest
import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.systemui.SysuiTestCase
import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
-import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
-import com.android.systemui.classifier.FalsingCollectorFake
-import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
-import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
-import com.android.systemui.flags.FakeFeatureFlagsClassic
+import com.android.systemui.flags.parameterizeSceneContainerFlag
import com.android.systemui.jank.interactionJankMonitor
-import com.android.systemui.keyguard.data.repository.FakeCommandQueue
-import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor
-import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
-import com.android.systemui.keyguard.domain.interactor.fromGoneTransitionInteractor
-import com.android.systemui.keyguard.domain.interactor.fromLockscreenTransitionInteractor
-import com.android.systemui.keyguard.domain.interactor.fromPrimaryBouncerTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
-import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.statusbar.StatusBarStateController
-import com.android.systemui.power.data.repository.FakePowerRepository
-import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.shade.LargeScreenHeaderHelper
-import com.android.systemui.shade.data.repository.FakeShadeRepository
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.shade.domain.interactor.ShadeInteractorImpl
-import com.android.systemui.shade.domain.interactor.ShadeInteractorLegacyImpl
-import com.android.systemui.statusbar.disableflags.data.repository.FakeDisableFlagsRepository
-import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor
-import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor
-import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
-import com.android.systemui.statusbar.policy.data.repository.FakeUserSetupRepository
-import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisioningInteractor
+import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.testKosmos
import com.android.systemui.util.kotlin.JavaAdapter
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals
@@ -87,26 +59,34 @@
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
-import org.mockito.Mockito.`when` as whenever
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
@SmallTest
-@RunWith(AndroidTestingRunner::class)
+@RunWith(ParameterizedAndroidJunit4::class)
@TestableLooper.RunWithLooper
-class StatusBarStateControllerImplTest : SysuiTestCase() {
+class StatusBarStateControllerImplTest(flags: FlagsParameterization?) : SysuiTestCase() {
private val kosmos = testKosmos()
private val testScope = kosmos.testScope
- private lateinit var shadeInteractor: ShadeInteractor
- private lateinit var fromLockscreenTransitionInteractor: FromLockscreenTransitionInteractor
- private lateinit var fromPrimaryBouncerTransitionInteractor:
- FromPrimaryBouncerTransitionInteractor
+
private val mockDarkAnimator = mock<ObjectAnimator>()
- private val deviceEntryUdfpsInteractor = mock<DeviceEntryUdfpsInteractor>()
- private val largeScreenHeaderHelper = mock<LargeScreenHeaderHelper>()
private lateinit var underTest: StatusBarStateControllerImpl
private lateinit var uiEventLogger: UiEventLoggerFake
+ companion object {
+ @JvmStatic
+ @Parameters(name = "{0}")
+ fun getParams(): List<FlagsParameterization> {
+ return parameterizeSceneContainerFlag()
+ }
+ }
+
+ init {
+ mSetFlagsRule.setFlagsParameterization(flags!!)
+ }
+
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
@@ -116,9 +96,9 @@
object :
StatusBarStateControllerImpl(
uiEventLogger,
- kosmos.interactionJankMonitor,
+ { kosmos.interactionJankMonitor },
JavaAdapter(testScope.backgroundScope),
- { shadeInteractor },
+ { kosmos.shadeInteractor },
{ kosmos.deviceUnlockedInteractor },
{ kosmos.sceneInteractor },
{ kosmos.keyguardClockInteractor },
@@ -127,59 +107,6 @@
return mockDarkAnimator
}
}
-
- val powerInteractor =
- PowerInteractor(FakePowerRepository(), FalsingCollectorFake(), mock(), underTest)
- val keyguardRepository = FakeKeyguardRepository()
- val keyguardTransitionRepository = FakeKeyguardTransitionRepository()
- val featureFlags = FakeFeatureFlagsClassic()
- val shadeRepository = FakeShadeRepository()
- val configurationRepository = FakeConfigurationRepository()
- val keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
- fromLockscreenTransitionInteractor = kosmos.fromLockscreenTransitionInteractor
- fromPrimaryBouncerTransitionInteractor = kosmos.fromPrimaryBouncerTransitionInteractor
-
- val keyguardInteractor =
- KeyguardInteractor(
- keyguardRepository,
- FakeCommandQueue(),
- powerInteractor,
- FakeKeyguardBouncerRepository(),
- ConfigurationInteractor(configurationRepository),
- shadeRepository,
- keyguardTransitionInteractor,
- { kosmos.sceneInteractor },
- { kosmos.fromGoneTransitionInteractor },
- { kosmos.sharedNotificationContainerInteractor },
- testScope,
- )
-
- whenever(deviceEntryUdfpsInteractor.isUdfpsSupported).thenReturn(MutableStateFlow(false))
- shadeInteractor =
- ShadeInteractorImpl(
- testScope.backgroundScope,
- kosmos.deviceProvisioningInteractor,
- FakeDisableFlagsRepository(),
- mock(),
- keyguardRepository,
- keyguardTransitionInteractor,
- powerInteractor,
- FakeUserSetupRepository(),
- mock(),
- ShadeInteractorLegacyImpl(
- testScope.backgroundScope,
- keyguardRepository,
- SharedNotificationContainerInteractor(
- configurationRepository,
- mContext,
- ResourcesSplitShadeStateController(),
- keyguardInteractor,
- deviceEntryUdfpsInteractor,
- largeScreenHeaderHelperLazy = { largeScreenHeaderHelper }
- ),
- shadeRepository,
- )
- )
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt
index 29f286f..8ce5037 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt
@@ -30,7 +30,7 @@
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.settings.FakeGlobalSettings
import com.android.systemui.util.time.FakeSystemClock
-import com.google.common.truth.Truth
+import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -132,7 +132,7 @@
mAvalancheController.update(headsUpEntry, runnableMock!!, "testLabel")
// Entry is showing now
- Truth.assertThat(mAvalancheController.headsUpEntryShowing).isEqualTo(headsUpEntry)
+ assertThat(mAvalancheController.headsUpEntryShowing).isEqualTo(headsUpEntry)
}
@Test
@@ -147,14 +147,14 @@
// Entry has one Runnable
val runnableList: List<Runnable?>? = mAvalancheController.nextMap[headsUpEntry]
- Truth.assertThat(runnableList).isNotNull()
- Truth.assertThat(runnableList!!.size).isEqualTo(1)
+ assertThat(runnableList).isNotNull()
+ assertThat(runnableList!!.size).isEqualTo(1)
// Update
mAvalancheController.update(headsUpEntry, runnableMock, "testLabel")
// Entry has two Runnables
- Truth.assertThat(runnableList.size).isEqualTo(2)
+ assertThat(runnableList.size).isEqualTo(2)
}
@Test
@@ -172,7 +172,7 @@
mAvalancheController.update(headsUpEntry, runnableMock!!, "testLabel")
// Entry is next
- Truth.assertThat(mAvalancheController.nextMap.containsKey(headsUpEntry)).isTrue()
+ assertThat(mAvalancheController.nextMap.containsKey(headsUpEntry)).isTrue()
}
@Test
@@ -185,7 +185,7 @@
mAvalancheController.delete(headsUpEntry, runnableMock, "testLabel")
// Entry was removed from next
- Truth.assertThat(mAvalancheController.nextMap.containsKey(headsUpEntry)).isFalse()
+ assertThat(mAvalancheController.nextMap.containsKey(headsUpEntry)).isFalse()
// Runnable was not run
Mockito.verify(runnableMock, Mockito.times(0)).run()
@@ -201,7 +201,7 @@
mAvalancheController.delete(headsUpEntry, runnableMock!!, "testLabel")
// Entry was removed from dropSet
- Truth.assertThat(mAvalancheController.debugDropSet.contains(headsUpEntry)).isFalse()
+ assertThat(mAvalancheController.debugDropSet.contains(headsUpEntry)).isFalse()
}
@Test
@@ -244,7 +244,56 @@
mAvalancheController.delete(showingEntry, runnableMock, "testLabel")
// Next entry is shown
- Truth.assertThat(mAvalancheController.headsUpEntryShowing).isEqualTo(nextEntry)
+ assertThat(mAvalancheController.headsUpEntryShowing).isEqualTo(nextEntry)
+ }
+
+
+ @Test
+ fun testDelete_showingEntryKeyBecomesPreviousHunKey() {
+ mAvalancheController.previousHunKey = ""
+
+ // Entry is showing
+ val showingEntry = createHeadsUpEntry(id = 0)
+ mAvalancheController.headsUpEntryShowing = showingEntry
+
+ // There's another entry waiting to show next
+ val nextEntry = createHeadsUpEntry(id = 1)
+ mAvalancheController.addToNext(nextEntry, runnableMock!!)
+
+ // Delete
+ mAvalancheController.delete(showingEntry, runnableMock, "testLabel")
+
+ // Next entry is shown
+ assertThat(mAvalancheController.previousHunKey).isEqualTo(showingEntry.mEntry!!.key)
+ }
+
+ @Test
+ fun testGetDurationMs_untrackedEntryEmptyAvalanche_useAutoDismissTime() {
+ val givenEntry = createHeadsUpEntry(id = 0)
+
+ // Nothing is showing
+ mAvalancheController.headsUpEntryShowing = null
+
+ // Nothing is next
+ mAvalancheController.clearNext()
+
+ val durationMs = mAvalancheController.getDurationMs(givenEntry, autoDismissMs = 5000)
+ assertThat(durationMs).isEqualTo(5000)
+ }
+
+ @Test
+ fun testGetDurationMs_untrackedEntryNonEmptyAvalanche_useAutoDismissTime() {
+ val givenEntry = createHeadsUpEntry(id = 0)
+
+ // Given entry not tracked
+ mAvalancheController.headsUpEntryShowing = createHeadsUpEntry(id = 1)
+
+ mAvalancheController.clearNext()
+ val nextEntry = createHeadsUpEntry(id = 2)
+ mAvalancheController.addToNext(nextEntry, runnableMock!!)
+
+ val durationMs = mAvalancheController.getDurationMs(givenEntry, autoDismissMs = 5000)
+ assertThat(durationMs).isEqualTo(5000)
}
@Test
@@ -257,11 +306,11 @@
mAvalancheController.clearNext()
val durationMs = mAvalancheController.getDurationMs(showingEntry, autoDismissMs = 5000)
- Truth.assertThat(durationMs).isEqualTo(5000)
+ assertThat(durationMs).isEqualTo(5000)
}
@Test
- fun testGetDurationMs_nextEntryLowerPriority_500() {
+ fun testGetDurationMs_nextEntryLowerPriority_5000() {
// Entry is showing
val showingEntry = createFsiHeadsUpEntry(id = 1)
mAvalancheController.headsUpEntryShowing = showingEntry
@@ -271,10 +320,10 @@
mAvalancheController.addToNext(nextEntry, runnableMock!!)
// Next entry has lower priority
- Truth.assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(1)
+ assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(1)
val durationMs = mAvalancheController.getDurationMs(showingEntry, autoDismissMs = 5000)
- Truth.assertThat(durationMs).isEqualTo(5000)
+ assertThat(durationMs).isEqualTo(5000)
}
@Test
@@ -288,10 +337,10 @@
mAvalancheController.addToNext(nextEntry, runnableMock!!)
// Same priority
- Truth.assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(0)
+ assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(0)
val durationMs = mAvalancheController.getDurationMs(showingEntry, autoDismissMs = 5000)
- Truth.assertThat(durationMs).isEqualTo(1000)
+ assertThat(durationMs).isEqualTo(1000)
}
@Test
@@ -305,9 +354,9 @@
mAvalancheController.addToNext(nextEntry, runnableMock!!)
// Next entry has higher priority
- Truth.assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(-1)
+ assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(-1)
val durationMs = mAvalancheController.getDurationMs(showingEntry, autoDismissMs = 5000)
- Truth.assertThat(durationMs).isEqualTo(500)
+ assertThat(durationMs).isEqualTo(500)
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorTest.kt
new file mode 100644
index 0000000..632196c
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorTest.kt
@@ -0,0 +1,251 @@
+/*
+ * 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.volume.domain.interactor
+
+import android.bluetooth.BluetoothDevice
+import android.graphics.drawable.TestStubDrawable
+import android.media.AudioDeviceInfo
+import android.media.AudioDevicePort
+import android.media.AudioManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.settingslib.R
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.media.BluetoothMediaDevice
+import com.android.settingslib.media.MediaDevice
+import com.android.settingslib.media.PhoneMediaDevice
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.bluetooth.bluetoothAdapter
+import com.android.systemui.bluetooth.cachedBluetoothDeviceManager
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.volume.data.repository.audioRepository
+import com.android.systemui.volume.domain.model.AudioOutputDevice
+import com.android.systemui.volume.localMediaController
+import com.android.systemui.volume.localMediaRepository
+import com.android.systemui.volume.mediaControllerRepository
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class AudioOutputInteractorTest : SysuiTestCase() {
+
+ private val kosmos = testKosmos()
+
+ lateinit var underTest: AudioOutputInteractor
+
+ @Before
+ fun setUp() {
+ with(kosmos) {
+ underTest = audioOutputInteractor
+
+ with(context.orCreateTestableResources) {
+ addOverride(R.drawable.ic_headphone, testIcon)
+ addOverride(R.drawable.ic_smartphone, testIcon)
+ addOverride(R.drawable.ic_media_speaker_device, testIcon)
+
+ addOverride(com.android.internal.R.drawable.ic_bt_hearing_aid, testIcon)
+ }
+ }
+ }
+
+ @Test
+ fun inCall_builtIn_returnsCommunicationDevice() {
+ with(kosmos) {
+ testScope.runTest {
+ with(audioRepository) {
+ setMode(AudioManager.MODE_IN_CALL)
+ setCommunicationDevice(builtInDevice)
+ }
+
+ val device by collectLastValue(underTest.currentAudioDevice)
+
+ runCurrent()
+
+ assertThat(device).isInstanceOf(AudioOutputDevice.BuiltIn::class.java)
+ assertThat(device!!.icon).isEqualTo(testIcon)
+ assertThat(device!!.name).isEqualTo("built_in")
+ }
+ }
+ }
+
+ @Test
+ fun inCall_wired_returnsCommunicationDevice() {
+ with(kosmos) {
+ testScope.runTest {
+ with(audioRepository) {
+ setMode(AudioManager.MODE_IN_CALL)
+ setCommunicationDevice(wiredDevice)
+ }
+
+ val device by collectLastValue(underTest.currentAudioDevice)
+
+ runCurrent()
+
+ assertThat(device).isInstanceOf(AudioOutputDevice.Wired::class.java)
+ assertThat(device!!.icon).isEqualTo(testIcon)
+ assertThat(device!!.name).isEqualTo("wired")
+ }
+ }
+ }
+
+ @Test
+ fun inCall_bluetooth_returnsCommunicationDevice() {
+ with(kosmos) {
+ testScope.runTest {
+ with(audioRepository) {
+ setMode(AudioManager.MODE_IN_CALL)
+ setCommunicationDevice(btDevice)
+ }
+ val bluetoothDevice: BluetoothDevice = mock {
+ whenever(address).thenReturn(btDevice.address)
+ }
+ val cachedBluetoothDevice: CachedBluetoothDevice = mock {
+ whenever(address).thenReturn(btDevice.address)
+ whenever(name).thenReturn(btDevice.productName.toString())
+ whenever(isHearingAidDevice).thenReturn(true)
+ }
+ whenever(bluetoothAdapter.getRemoteDevice(eq(btDevice.address)))
+ .thenReturn(bluetoothDevice)
+ whenever(cachedBluetoothDeviceManager.findDevice(any()))
+ .thenReturn(cachedBluetoothDevice)
+
+ val device by collectLastValue(underTest.currentAudioDevice)
+
+ runCurrent()
+
+ assertThat(device).isInstanceOf(AudioOutputDevice.Bluetooth::class.java)
+ assertThat(device!!.icon).isEqualTo(testIcon)
+ assertThat(device!!.name).isEqualTo("bt")
+ }
+ }
+ }
+
+ @Test
+ fun notInCall_builtIn_returnsMediaDevice() {
+ with(kosmos) {
+ testScope.runTest {
+ audioRepository.setMode(AudioManager.MODE_NORMAL)
+ mediaControllerRepository.setActiveSessions(listOf(localMediaController))
+ localMediaRepository.updateCurrentConnectedDevice(builtInMediaDevice)
+
+ val device by collectLastValue(underTest.currentAudioDevice)
+
+ runCurrent()
+
+ assertThat(device).isInstanceOf(AudioOutputDevice.BuiltIn::class.java)
+ assertThat(device!!.icon).isEqualTo(testIcon)
+ assertThat(device!!.name).isEqualTo("built_in_media")
+ }
+ }
+ }
+
+ @Test
+ fun notInCall_wired_returnsMediaDevice() {
+ with(kosmos) {
+ testScope.runTest {
+ audioRepository.setMode(AudioManager.MODE_NORMAL)
+ mediaControllerRepository.setActiveSessions(listOf(localMediaController))
+ localMediaRepository.updateCurrentConnectedDevice(wiredMediaDevice)
+
+ val device by collectLastValue(underTest.currentAudioDevice)
+
+ runCurrent()
+
+ assertThat(device).isInstanceOf(AudioOutputDevice.Wired::class.java)
+ assertThat(device!!.icon).isEqualTo(testIcon)
+ assertThat(device!!.name).isEqualTo("wired_media")
+ }
+ }
+ }
+
+ @Test
+ fun notInCall_bluetooth_returnsMediaDevice() {
+ with(kosmos) {
+ testScope.runTest {
+ audioRepository.setMode(AudioManager.MODE_NORMAL)
+ mediaControllerRepository.setActiveSessions(listOf(localMediaController))
+ localMediaRepository.updateCurrentConnectedDevice(bluetoothMediaDevice)
+
+ val device by collectLastValue(underTest.currentAudioDevice)
+
+ runCurrent()
+
+ assertThat(device).isInstanceOf(AudioOutputDevice.Bluetooth::class.java)
+ assertThat(device!!.icon).isEqualTo(testIcon)
+ assertThat(device!!.name).isEqualTo("bt_media")
+ }
+ }
+ }
+
+ private companion object {
+ val testIcon = TestStubDrawable()
+ val builtInDevice =
+ AudioDeviceInfo(
+ AudioDevicePort.createForTesting(
+ AudioDeviceInfo.TYPE_BUILTIN_SPEAKER,
+ "built_in",
+ ""
+ )
+ )
+ val wiredDevice =
+ AudioDeviceInfo(
+ AudioDevicePort.createForTesting(AudioDeviceInfo.TYPE_WIRED_HEADPHONES, "wired", "")
+ )
+ val btDevice =
+ AudioDeviceInfo(
+ AudioDevicePort.createForTesting(
+ AudioDeviceInfo.TYPE_BLE_HEADSET,
+ "bt",
+ "test_address"
+ )
+ )
+ val builtInMediaDevice: MediaDevice =
+ mock<PhoneMediaDevice> {
+ whenever(name).thenReturn("built_in_media")
+ whenever(icon).thenReturn(testIcon)
+ }
+ val wiredMediaDevice: MediaDevice =
+ mock<PhoneMediaDevice> {
+ whenever(deviceType)
+ .thenReturn(MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE)
+ whenever(name).thenReturn("wired_media")
+ whenever(icon).thenReturn(testIcon)
+ }
+ val bluetoothMediaDevice: MediaDevice =
+ mock<BluetoothMediaDevice> {
+ whenever(name).thenReturn("bt_media")
+ whenever(icon).thenReturn(testIcon)
+ val cachedBluetoothDevice: CachedBluetoothDevice = mock {
+ whenever(isHearingAidDevice).thenReturn(true)
+ }
+ whenever(cachedDevice).thenReturn(cachedBluetoothDevice)
+ }
+ }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt
index fa79e7f..675136c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt
@@ -31,7 +31,7 @@
import com.android.systemui.statusbar.notification.domain.interactor.notificationsSoundPolicyInteractor
import com.android.systemui.statusbar.notification.domain.interactor.notificationsSoundPolicyRepository
import com.android.systemui.testKosmos
-import com.android.systemui.volume.audioRepository
+import com.android.systemui.volume.data.repository.audioRepository
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartableTest.kt
index 8bb3672..89acbc8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartableTest.kt
@@ -25,8 +25,8 @@
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
-import com.android.systemui.volume.audioModeInteractor
-import com.android.systemui.volume.audioRepository
+import com.android.systemui.volume.data.repository.audioRepository
+import com.android.systemui.volume.domain.interactor.audioModeInteractor
import com.android.systemui.volume.panel.ui.VolumePanelUiEvent
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -56,7 +56,7 @@
AudioModeLoggerStartable(
applicationCoroutineScope,
uiEventLogger,
- audioModeInteractor
+ audioModeInteractor,
)
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt
index da0a229..96b4dae 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt
@@ -24,8 +24,8 @@
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
-import com.android.systemui.volume.audioModeInteractor
-import com.android.systemui.volume.audioRepository
+import com.android.systemui.volume.data.repository.audioRepository
+import com.android.systemui.volume.domain.interactor.audioModeInteractor
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 27856d6..65440e8 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -126,8 +126,8 @@
<string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"आफ्नो डिभाइस अनलक गरी जारी राख्नुहोस्"</string>
<string name="kg_prompt_unattended_update_pin" msgid="5979434876768801873">"पछि अपडेट इन्स्टल गर्न PIN हाल्नुहोस्"</string>
<string name="kg_prompt_unattended_update_password" msgid="8805664437604967210">"पछि अपडेट इन्स्टल गर्न पासवर्ड हाल्नुहोस्"</string>
- <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"पछि अपडेट इन्स्टल गर्न प्याटर्न बनाउनुहोस्"</string>
+ <string name="kg_prompt_unattended_update_pattern" msgid="8580479377489546091">"पछि अपडेट इन्स्टल गर्न प्याटर्न कोर्नुहोस्"</string>
<string name="kg_prompt_after_update_pin" msgid="7051709651908643013">"डिभाइस अपडेट गरिएको छ। जारी राख्न PIN हाल्नुहोस्।"</string>
<string name="kg_prompt_after_update_password" msgid="153703052501352094">"डिभाइस अपडेट गरिएको छ। जारी राख्न पासवर्ड हाल्नुहोस्।"</string>
- <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"डिभाइस अपडेट गरिएको छ। जारी राख्न प्याटर्न बनाउनुहोस्।"</string>
+ <string name="kg_prompt_after_update_pattern" msgid="1484084551298241992">"डिभाइस अपडेट गरिएको छ। जारी राख्न प्याटर्न कोर्नुहोस्।"</string>
</resources>
diff --git a/packages/SystemUI/res/anim/shortcut_helper_close_anim.xml b/packages/SystemUI/res/anim/shortcut_helper_close_anim.xml
new file mode 100644
index 0000000..47fd78a
--- /dev/null
+++ b/packages/SystemUI/res/anim/shortcut_helper_close_anim.xml
@@ -0,0 +1,26 @@
+<?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.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/accelerate_interpolator"
+ android:zAdjustment="top">
+
+ <translate
+ android:fromYDelta="0"
+ android:toYDelta="100%"
+ android:duration="@android:integer/config_shortAnimTime" />
+</set>
diff --git a/packages/SystemUI/res/anim/shortcut_helper_launch_anim.xml b/packages/SystemUI/res/anim/shortcut_helper_launch_anim.xml
new file mode 100644
index 0000000..77edf58
--- /dev/null
+++ b/packages/SystemUI/res/anim/shortcut_helper_launch_anim.xml
@@ -0,0 +1,27 @@
+<?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.
+ -->
+
+<!-- Animation for when a dock window at the bottom of the screen is entering. -->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/accelerate_decelerate_interpolator"
+ android:zAdjustment="top">
+
+ <translate android:fromYDelta="100%"
+ android:toYDelta="0"
+ android:startOffset="@android:integer/config_shortAnimTime"
+ android:duration="@android:integer/config_mediumAnimTime"/>
+</set>
diff --git a/packages/SystemUI/res/layout/activity_keyboard_shortcut_helper.xml b/packages/SystemUI/res/layout/activity_keyboard_shortcut_helper.xml
new file mode 100644
index 0000000..292e496
--- /dev/null
+++ b/packages/SystemUI/res/layout/activity_keyboard_shortcut_helper.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/shortcut_helper_sheet_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:id="@+id/shortcut_helper_sheet"
+ style="@style/Widget.Material3.BottomSheet"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
+
+ <!-- Drag handle for accessibility -->
+ <com.google.android.material.bottomsheet.BottomSheetDragHandleView
+ android:id="@+id/drag_handle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:textAppearance="?textAppearanceDisplayLarge"
+ android:background="?colorTertiaryContainer"
+ android:text="Shortcut Helper Content" />
+ </LinearLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/packages/SystemUI/res/layout/combined_qs_header.xml b/packages/SystemUI/res/layout/combined_qs_header.xml
index beb481a..b9ef88e 100644
--- a/packages/SystemUI/res/layout/combined_qs_header.xml
+++ b/packages/SystemUI/res/layout/combined_qs_header.xml
@@ -129,7 +129,7 @@
android:id="@+id/hover_system_icons_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:layout_gravity="right|center_vertical"
+ android:layout_gravity="end|center_vertical"
android:gravity="center_vertical"
android:paddingStart="@dimen/hover_system_icons_container_padding_start"
android:paddingEnd="@dimen/hover_system_icons_container_padding_end"
diff --git a/packages/SystemUI/res/layout/screenshot_shelf.xml b/packages/SystemUI/res/layout/screenshot_shelf.xml
index 6a5b999f..26d3f43 100644
--- a/packages/SystemUI/res/layout/screenshot_shelf.xml
+++ b/packages/SystemUI/res/layout/screenshot_shelf.xml
@@ -147,4 +147,11 @@
<include layout="@layout/screenshot_work_profile_first_run" />
<include layout="@layout/screenshot_detection_notice" />
</FrameLayout>
+ <ImageView
+ android:id="@+id/screenshot_flash"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ android:elevation="12dp"
+ android:src="@android:color/white"/>
</com.android.systemui.screenshot.ui.ScreenshotShelfView>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 6f5984e..63c6132 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -235,7 +235,7 @@
<string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Kennisgewingskerm."</string>
<string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Vinnige instellings."</string>
<string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Kitsinstellings en kennisgewingskerm."</string>
- <string name="accessibility_desc_lock_screen" msgid="409034672704273634">"Sluit skerm"</string>
+ <string name="accessibility_desc_lock_screen" msgid="409034672704273634">"Sluitskerm"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Werksluitskerm"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Maak toe"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"volkome stilte"</string>
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Hervat werkapps?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Hervat"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Maak legstukke op sluitskerm toe"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Legstukke op sluitskerm"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Wissel gebruiker"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"aftrekkieslys"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index b890a1b..1c80547 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"የሥራ መተግበሪያዎች ከቆሙበት ይቀጥሉ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ከቆመበት ቀጥል"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ምግብሮችን በማያ ገጽ ቁልፍ ላይ ዝጋ"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ምግብሮች በማያ ገጽ ቁልፍ ላይ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ተጠቃሚ ቀይር"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ወደታች ተጎታች ምናሌ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 8762619..c92a32b 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"أتريد إعادة تفعيل تطبيقات العمل؟"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"إعادة التفعيل"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"إغلاق التطبيقات المصغّرة على شاشة القفل"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"التطبيقات المصغّرة على شاشة القفل"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"تبديل المستخدم"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"القائمة المنسدلة"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 03dddf0..f1291a0 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"কাম সম্পৰ্কীয় এপ্ আনপজ কৰিবনে?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"আনপজ কৰক"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"লক স্ক্ৰীনত ৱিজেট বন্ধ কৰক"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"লক স্ক্ৰীনত ৱিজেট"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ব্যৱহাৰকাৰী সলনি কৰক"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"পুল-ডাউনৰ মেনু"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index b2e8aef..b12d822 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"İş tətbiqi üzrə pauza bitsin?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Pauzanı bitirin"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Kilid ekranında vidcetləri bağlayın"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Kilid ekranındakı vidcetlər"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"aşağı çəkilən menyu"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 9d58a61..221d16c 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Uključiti poslovne aplikacije?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Ponovo aktiviraj"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Zatvorite vidžete na zaključanom ekranu"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Vidžeti na zaključanom ekranu"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zameni korisnika"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući meni"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 378d7e3..d1c4a98 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Паглядзець усе"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Выкарыстоўваць Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Падключана"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Абагульванне аўдыя"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Захавана"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"адключыць"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"актываваць"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Аўтаматычнае ўключэнне заўтра"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Bluetooth выкарыстоўваецца такімі функцыямі і сэрвісамі, як Хуткае абагульванне і Знайсці прыладу"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth уключыцца заўтра раніцай"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Абагульванне аўдыя"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Ідзе абагульванне аўдыя"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Уключыць працоўныя праграмы?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Уключыць"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Закрыць віджэты на экране блакіроўкі"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Віджэты на экране блакіроўкі"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Перайсці да іншага карыстальніка"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"высоўнае меню"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index d4ffad3..62d3fed 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Преглед на всички"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Използване на Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Установена е връзка"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Споделяне на звука"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Запазено"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"прекратяване на връзката"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"активиране"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Автоматично включване отново утре"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Функции като „Бързо споделяне“ и „Намиране на устройството ми“ използват Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth ще се включи утре сутрин"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Споделяне на звука"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Звукът се споделя"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Отмяна на паузата за служ. прил.?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Отмяна на паузата"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Затваряне на приспособленията на заключения екран"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Приспособления на заключения екран"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Превключване между потребителите"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"падащо меню"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 7c2a9fc..81e3fc4 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"সব দেখুন"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ব্লুটুথ ব্যবহার করুন"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"কানেক্ট করা আছে"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"অডিও শেয়ারিং"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"সেভ করা আছে"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ডিসকানেক্ট করুন"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"চালু করুন"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"আগামীকাল অটোমেটিক আবার চালু হবে"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"দ্রুত শেয়ার ও Find My Device-এর মতো ফিচার ব্লুটুথ ব্যবহার করে"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"ব্লুটুথ আগামীকাল সকালে চালু হয়ে যাবে"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"অডিও শেয়ারিং"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"অডিও শেয়ার করা হচ্ছে"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"অফিসের অ্যাপ আনপজ করতে চান?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"আনপজ করুন"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"লক স্ক্রিনে উইজেট বন্ধ করুন"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"লক স্ক্রিনে উইজেট"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ব্যবহারকারী পাল্টে দিন"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"পুলডাউন মেনু"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index a7f87e4..7d66851 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Prikaži sve"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Koristi Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Povezano"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Dijeljenje zvuka"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Sačuvano"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekid veze"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiviranje"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatski uključi ponovo sutra"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funkcije kao što su Quick Share i Pronađi moj uređaj koriste Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth će se uključiti sutra ujutro"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Dijeljenje zvuka"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Dijeljenje zvuka"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> baterije"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Zvuk"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Slušalice"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Pokrenuti poslovne aplikacije?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Ponovo pokreni"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Zatvaranje vidžeta na zaključanom ekranu"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Vidžeti na zaključanom ekranu"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zamijeni korisnika"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući meni"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index fde008e..87af353 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Reactivar les apps de treball?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Reactiva"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Tanca els widgets a la pantalla de bloqueig"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets a la pantalla de bloqueig"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Canvia d\'usuari"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú desplegable"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index b659109..102768f 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Zrušit pozastavení pracovních aplikací?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Zrušit pozastavení"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Zavřít widgety na obrazovce uzamčení"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgety na obrazovce uzamčení"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Přepnout uživatele"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rozbalovací nabídka"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 685a044..d3138ab 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Se alt"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Brug Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Der er oprettet forbindelse"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Lyddeling"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Gemt"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"afbryd forbindelse"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivér"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Aktivér automatisk igen i morgen"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funktioner som f.eks. Quick Share og Find min enhed anvender Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth aktiveres i morgen tidlig"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Lyddeling"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Deler lyd"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batteri"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Lyd"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Vil du genoptage arbejdsapps?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Genoptag"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Luk widgets på låseskærmen"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets på låseskærmen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skift bruger"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullemenu"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index a520cc8..03d04a6 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Alle anzeigen"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth verwenden"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Verbunden"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Audiofreigabe"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Gespeichert"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"Verknüpfung aufheben"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivieren"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Morgen automatisch wieder aktivieren"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funktionen wie „Quick Share“ und „Mein Gerät finden“ verwenden Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth wird morgen früh aktiviert"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Audiofreigabe"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Audioinhalte werden freigegeben"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Geschäftliche Apps nicht mehr pausieren?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Nicht mehr pausieren"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Widgets auf dem Sperrbildschirm schließen"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets auf dem Sperrbildschirm"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Nutzer wechseln"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Pull-down-Menü"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index be273e5..89092ad 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Αναίρ. παύσης εφαρμ. εργασιών;"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Αναίρεση παύσης"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Κλείσιμο γραφικών στοιχείων στην οθόνη κλειδώματος"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Γραφικά στοιχεία στην οθόνη κλειδώματος"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Εναλλαγή χρήστη"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"αναπτυσσόμενο μενού"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 0cc3ffe..459de64 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Close widgets on lock screen"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets on lock screen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 4290264..4879850 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -371,8 +371,7 @@
<string name="quick_settings_hearing_devices_dialog_title" msgid="9004774017688484981">"Hearing devices"</string>
<string name="quick_settings_pair_hearing_devices" msgid="5987105102207447322">"Pair new device"</string>
<string name="accessibility_hearing_device_pair_new_device" msgid="8440082580186130090">"Click to pair new device"</string>
- <!-- no translation found for hearing_devices_presets_error (350363093458408536) -->
- <skip />
+ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Couldn\'t update preset"</string>
<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>
@@ -458,6 +457,7 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Close widgets on lock screen"</string>
+ <string name="accessibility_action_label_edit_widgets" msgid="3821868581348322346">"Customize widgets"</string>
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets on lock screen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 0cc3ffe..459de64 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Close widgets on lock screen"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets on lock screen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 0cc3ffe..459de64 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Close widgets on lock screen"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets on lock screen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index bd578d7..a2340bd 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -371,8 +371,7 @@
<string name="quick_settings_hearing_devices_dialog_title" msgid="9004774017688484981">"Hearing devices"</string>
<string name="quick_settings_pair_hearing_devices" msgid="5987105102207447322">"Pair new device"</string>
<string name="accessibility_hearing_device_pair_new_device" msgid="8440082580186130090">"Click to pair new device"</string>
- <!-- no translation found for hearing_devices_presets_error (350363093458408536) -->
- <skip />
+ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Couldn\'t update preset"</string>
<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>
@@ -458,6 +457,7 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Close widgets on lock screen"</string>
+ <string name="accessibility_action_label_edit_widgets" msgid="3821868581348322346">"Customize widgets"</string>
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets on lock screen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index c98dd54..202bd93 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -270,20 +270,15 @@
<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>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Uso compartido de audio"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Guardado"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activar"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Volver a activar automáticamente mañana"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Las funciones como Quick Share y Encontrar mi dispositivo usan Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"El Bluetooth se activará mañana a la mañana"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Uso compartido de audio"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Compartiendo audio"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auriculares"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"¿Reanudar apps de trabajo?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Reanudar"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Cerrar widgets en la pantalla de bloqueo"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets en la pantalla de bloqueo"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú expandible"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 58e18d0..88fab2d 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -270,20 +270,15 @@
<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>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Compartir audio"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Guardado"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activar"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Volver a activar automáticamente mañana"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Las funciones como Quick Share y Encontrar mi dispositivo usan Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"El Bluetooth se activará mañana por la mañana"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Compartir audio"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Compartiendo audio"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auriculares"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"¿Reactivar apps de trabajo?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Reactivar"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Cerrar widgets en la pantalla de bloqueo"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets en la pantalla de bloqueo"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar de usuario"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú desplegable"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 1613e79..1b4cea7 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Kuva kõik"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Kasuta Bluetoothi"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Ühendatud"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Heli jagamine"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Salvestatud"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"katkesta ühendus"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiveeri"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Lülita automaatselt homme uuesti sisse"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funktsioonid, nagu Kiirjagamine ja Leia mu seade, kasutavad Bluetoothi"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth lülitub sisse homme hommikul"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Heli jagamine"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Heli jagamine"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> akut"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Heli"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Peakomplekt"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Kas lõpetada töörakenduste peatamine?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Lõpeta peatamine"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Lukustuskuva vidinate sulgemine"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Lukustuskuva vidinad"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kasutaja vahetamine"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rippmenüü"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 358c152..b69ef30 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Ikusi guztiak"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Erabili Bluetootha"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Konektatuta"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Audioa partekatzea"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Gordeta"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"deskonektatu"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktibatu"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Aktibatu automatikoki berriro bihar"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Quick Share, Bilatu nire gailua eta beste eginbide batzuek Bluetootha erabiltzen dute"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bihar goizean aktibatuko da Bluetootha"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Audioa partekatzea"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Audioa partekatzen"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audioa"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Entzungailua"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Laneko aplikazioak berraktibatu?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Berraktibatu"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Itxi pantaila blokeatuko widgetak"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Pantaila blokeatuko widgetak"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Aldatu erabiltzailea"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"zabaldu menua"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 0e4b34fc..94fb12f 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"مکث برنامههای کاری لغو شود؟"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"لغو مکث"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"بستن ابزارکها در صفحه قفل"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ابزارکها در صفحه قفل"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"تغییر کاربر"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"منوی پایینپر"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index e6c92c5..a7754b0 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Näytä kaikki"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Käytä Bluetoothia"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Yhdistetty"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Audionjako"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Tallennettu"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"katkaise yhteys"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivoi"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Laita automaattisesti päälle taas huomenna"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Quick Share, Paikanna laite ja tietyt muut ominaisuudet käyttävät Bluetoothia"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth menee päälle huomisaamuna"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Audionjako"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Audiota jaetaan"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Ääni"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Laita työsovellukset päälle?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Laita päälle"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Sulje widgetit lukitusnäytöllä"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgetit lukitusnäytöllä"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Vaihda käyttäjää"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"alasvetovalikko"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 93d4828..5bacaaa 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -297,7 +297,7 @@
<string name="quick_settings_user_title" msgid="8673045967216204537">"Utilisateur"</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">"Réseaux accessibles"</string>
+ <string name="quick_settings_networks_available" msgid="1875138606855420438">"Réseaux disponibles"</string>
<string name="quick_settings_networks_unavailable" msgid="1167847013337940082">"Aucun réseau accessible"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Aucun réseau Wi-Fi à proximité"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Activation en cours…"</string>
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pros?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Réactiver"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Fermer les widgets sur l\'écran de verrouillage"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets sur l\'écran de verrouillage"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu déroulant"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index cf47742..a4a039f1 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pro ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Réactiver"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Fermer les widgets sur l\'écran de verrouillage"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets sur l\'écran de verrouillage"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu déroulant"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index a47a7ed..e2b1e53 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Ver todo"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Estableceuse a conexión"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Audio compartido"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Gardouse"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activar"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Volver activar automaticamente mañá"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"As funcións como Quick Share e Localizar o meu dispositivo utilizan o Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"O Bluetooth activarase mañá á mañá"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Audio compartido"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Compartindo audio"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auriculares"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Reactivar apps do traballo?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Reactivar"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Ocultar os widgets na pantalla de bloqueo"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets na pantalla de bloqueo"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú despregable"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index b446543..2883cc5 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"તમામ જુઓ"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"બ્લૂટૂથનો ઉપયોગ કરો"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"કનેક્ટેડ છે"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"ઑડિયો શેરિંગ"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"સાચવેલું"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ડિસ્કનેક્ટ કરો"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"સક્રિય કરો"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"આવતીકાલે ફરીથી ઑટોમૅટિક રીતે ચાલુ કરો"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"ક્વિક શેર અને Find My Device જેવી સુવિધાઓ બ્લૂટૂથનો ઉપયોગ કરે છે"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"બ્લૂટૂથ આવતીકાલે સવારે ચાલુ થશે"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"ઑડિયો શેરિંગ"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"ઑડિયો શેર કરી રહ્યાં છીએ"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"ઑફિસની થોભાવેલી ઍપ ચાલુ કરીએ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ફરી ચાલુ કરો"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"લૉક સ્ક્રીન પર વિજેટ બંધ કરો"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"લૉક સ્ક્રીન પર વિજેટ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"વપરાશકર્તા સ્વિચ કરો"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"પુલડાઉન મેનૂ"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 8fad88d..f30957d 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"सभी देखें"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ब्लूटूथ इस्तेमाल करें"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"कनेक्ट है"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"ऑडियो शेयर करने की सुविधा"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"सेव किया गया"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"डिसकनेक्ट करें"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"चालू करें"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"कल फिर से अपने-आप चालू हो जाएगा"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"क्विक शेयर और Find My Device जैसी सुविधाएं, ब्लूटूथ का इस्तेमाल करती हैं"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"ब्लूटूथ कल सुबह चालू होगा"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"ऑडियो शेयर करने की सुविधा"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"ऑडियो शेयर किया जा रहा है"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"वर्क ऐप्लिकेशन चालू करने हैं?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"चालू करें"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"लॉक स्क्रीन पर विजेट बंद करें"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"लॉक स्क्रीन पर विजेट"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"उपयोगकर्ता बदलें"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"पुलडाउन मेन्यू"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 4f95ae5..bada67e 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Pogledajte sve"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Koristi Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Povezano"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Zajedničko slušanje"</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>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiviraj"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatski ponovo uključi sutra"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Značajke kao što su brzo dijeljenje i Pronađi moj uređaj koriste Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth će se uključiti sutra ujutro"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Zajedničko slušanje"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Zajedničko slušanje"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> baterije"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Slušalice"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Pokrenuti poslovne aplikacije?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Ponovno pokreni"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Zatvaranje widgeta na zaključanom zaslonu"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgeti na zaključanom zaslonu"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Promjena korisnika"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući izbornik"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 381d84c..d216fa4 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Feloldja a munkahelyi appokat?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Szüneteltetés feloldása"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"A lezárási képernyőn lévő modulok bezárása"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Modulok a lezárási képernyőn"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Felhasználóváltás"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"lehúzható menü"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index c699317..034ac1a 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Տեսնել բոլորը"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Միացնել Bluetooth-ը"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Միացված է"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Աուդիոյի փոխանցում"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Պահված է"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"անջատել"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ակտիվացնել"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Վաղը նորից ավտոմատ միացնել"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Bluetooth-ն օգտագործում են, օրինակ, Quick Share և «Գտնել իմ սարքը» գործառույթները"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth-ը կմիանա վաղն առավոտյան"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Աուդիոյի փոխանցում"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Աուդիոն փոխանցվում է"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Վերսկսե՞լ աշխ. հավելվածները"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Վերսկսել"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Փակել վիջեթները կողպէկրանին"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Վիջեթներ կողպէկրանին"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Անջատել օգտվողին"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"իջնող ընտրացանկ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index e5eb0df..d428ef8 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Batalkan jeda aplikasi kerja?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Batalkan jeda"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Tutup widget di layar kunci"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widget di layar kunci"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Beralih pengguna"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pulldown"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index d2122e8..4b97299 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Ljúka hléi vinnuforrita?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Ljúka hléi"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Loka græjum á lásskjá"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Græjur á lásskjá"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skipta um notanda"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Fellivalmynd"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index ed13347..30bdfae 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Riattivare le app di lavoro?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Riattiva"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Chiudi widget su schermata di blocco"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widget su schermata di blocco"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambio utente"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu a discesa"</string>
@@ -748,7 +750,7 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifiche"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Scorciatoie da tastiera"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambia layout della tastiera"</string>
- <string name="keyboard_shortcut_join" msgid="3578314570034512676">"oppure"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"o"</string>
<string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Cancella la query di ricerca"</string>
<string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Scorciatoie da tastiera"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Cerca scorciatoie"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 90e790f..bc1d91f 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"להפעיל את האפליקציות לעבודה?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ביטול ההשהיה"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"סגירת ווידג\'טים במסך הנעילה"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ווידג\'טים במסך הנעילה"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"החלפת משתמש"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"תפריט במשיכה למטה"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 19d6e88..b587f40 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"仕事用アプリの停止解除"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"停止解除"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ロック画面のウィジェットを閉じる"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ロック画面のウィジェット"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ユーザーを切り替える"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"プルダウン メニュー"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 5fa6516..ff11d85 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"კვლავ გააქტიურდეს სამსახურის აპები?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"გააქტიურება"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ჩაკეტილ ეკრანზე ვიჯეტების დახურვა"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ვიჯეტები ჩაკეტილ ეკრანზე"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"მომხმარებლის გადართვა"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ჩამოშლადი მენიუ"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 5814a8d..995a796 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Барлығын көру"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth-ты пайдалану"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Қосылды"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Аудио бөлісу"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Сақталды"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ажырату"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"іске қосу"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Ертең автоматты түрде қосылсын"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Quick Share және Find My Device сияқты функциялар Bluetooth-ты пайдаланады."</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth ертең таңертең қосылады."</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Аудио бөлісу"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Аудио бөлісу әрекеті орындалып жатыр."</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">"Aудио"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Гарнитура"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Жұмыс қолданбаларын қайта қосасыз ба?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Қайта қосу"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Құлыптаулы экранда виджеттерді жабу"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Құлыптаулы экрандағы виджеттер"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Пайдаланушыны ауыстыру"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ашылмалы мәзір"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index a74dc9c..adcd3d6 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"ឈប់ផ្អាកកម្មវិធីការងារឬ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ឈប់ផ្អាក"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"បិទធាតុក្រាហ្វិកនៅលើអេក្រង់ចាក់សោ"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ធាតុក្រាហ្វិកនៅលើអេក្រង់ចាក់សោ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ប្ដូរអ្នកប្រើ"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ម៉ឺនុយទាញចុះ"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index e914d1c..ca22ba1 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"ಕೆಲಸದ ಆ್ಯಪ್ ವಿರಾಮ ರದ್ದುಮಾಡಬೇಕೇ"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ವಿಜೆಟ್ಗಳನ್ನು ಮುಚ್ಚಿರಿ"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ವಿಜೆಟ್ಗಳು"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ಬಳಕೆದಾರರನ್ನು ಬದಲಿಸಿ"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ಪುಲ್ಡೌನ್ ಮೆನು"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 316d0ea..4e7c4d0 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"모두 보기"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"블루투스 사용"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"연결됨"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"오디오 공유"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"저장됨"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"연결 해제"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"실행"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"내일 다시 자동으로 사용 설정"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Quick Share, 내 기기 찾기 등의 기능에서 블루투스를 사용합니다."</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"블루투스가 내일 아침에 켜집니다."</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"오디오 공유"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"오디오 공유 중"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"직장 앱 일시중지를 해제하시겠습니까?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"일시중지 해제"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"잠금 화면에서 위젯 닫기"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"잠금 화면의 위젯"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"사용자 전환"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"풀다운 메뉴"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 78231a7..1d005fb 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Баарын көрүү"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Иштетүү"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Туташты"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Чогуу угуу"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Сакталды"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ажыратуу"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"иштетүү"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Эртең автоматтык түрдө кайра күйгүзүү"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Тез бөлүшүү жана Түзмөгүм кайда? сыяктуу функциялар Bluetooth\'ту колдонушат"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth эртең таңда күйөт"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Чогуу угуу"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Чогуу угулууда"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Жумуш колдонмолорун иштетесизби?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Иштетүү"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Виджеттерди кулпуланган экранда жабуу"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Кулпуланган экрандагы виджеттер"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Колдонуучуну которуу"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ылдый түшүүчү меню"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index e646c57..f95bb8e 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"ຍົກເລີກການຢຸດຊົ່ວຄາວແອັບບ່ອນເຮັດວຽກບໍ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ຍົກເລີກການຢຸດຊົ່ວຄາວ"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ປິດວິດເຈັດຢູ່ໜ້າຈໍລັອກ"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ວິດເຈັດຢູ່ໜ້າຈໍລັອກ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ສະຫຼັບຜູ້ໃຊ້"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ເມນູແບບດຶງລົງ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 9221a36..040294f 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Atš. darbo progr. pristabd.?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Atšaukti pristabdymą"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Uždaryti valdiklius užrakinimo ekrane"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Valdikliai užrakinimo ekrane"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Perjungti naudotoją"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"išplečiamasis meniu"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 0590349..da58f33 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Vai aktivizēt darba lietotnes?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Aktivizēt"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Aizvērt logrīkus bloķēšanas ekrānā"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Logrīki bloķēšanas ekrānā"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mainīt lietotāju"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"novelkamā izvēlne"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 4fee24d..2faf243 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Прикажи ги сите"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Користи Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Поврзано"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Споделување аудио"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Зачувано"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"прекини врска"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"активирај"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Автоматски вклучи повторно утре"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Функциите како „Брзо споделување“ и „Најди го мојот уред“ користат Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth ќе се вклучи утре наутро"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Споделување аудио"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Се споделува аудио"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Да се актив. работните аплик.?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Прекини ја паузата"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Затворете ги виџетите на заклучениот екран"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Виџети на заклучен екран"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Промени го корисникот"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"паѓачко мени"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index cea0e6b..2fd4411 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"വർക്ക് ആപ്പുകൾ പുനരാരംഭിക്കണോ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"പുനരാരംഭിക്കുക"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ലോക്ക് സ്ക്രീനിൽ വിജറ്റുകൾ അടയ്ക്കുക"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ലോക്ക് സ്ക്രീനിൽ വിജറ്റുകൾ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ഉപയോക്താവ് മാറുക"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"പുൾഡൗൺ മെനു"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index a3e1bc2..94cdf4c 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Бүгдийг харах"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth-г ашиглах"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Холбогдсон"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Аудио хуваалцах"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Хадгалсан"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"салгах"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"идэвхжүүлэх"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Маргааш автоматаар дахин асаах"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Түргэн хуваалцах, Миний төхөөрөмжийг олох зэрэг онцлогууд Bluetooth-г ашигладаг"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth-г маргааш өглөө асаана"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Аудио хуваалцах"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Аудио хуваалцаж байна"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Ажлын аппыг үргэлжлүүлэх үү?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Үргэлжлүүлэх"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Түгжээтэй дэлгэц дээр виджетүүдийг хаах"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Түгжээтэй дэлгэц дээрх виджетүүд"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Хэрэглэгчийг сэлгэх"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"эвхмэл цэс"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index c46e3e7..dd53db5 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"वर्क ॲप्स पुन्हा सुरू करायची?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"पुन्हा सुरू करा"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"लॉक स्क्रीनवरील विजेट बंद करा"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"लॉक स्क्रीनवरील विजेट"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"वापरकर्ता स्विच करा"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"पुलडाउन मेनू"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index fb5efc8..6b858a4 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Nyahjeda apl kerja?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Nyahjeda"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Tutup widget pada skrin kunci"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widget pada skrin kunci"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Tukar pengguna"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu tarik turun"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 42bcfa6..2472d1f 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"အားလုံးကြည့်ရန်"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ဘလူးတုသ်သုံးရန်"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"ချိတ်ဆက်ထားသည်"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"အော်ဒီယို မျှဝေခြင်း"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"သိမ်းထားသည်"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ချိတ်ဆက်မှုဖြုတ်ရန်"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"စသုံးရန်"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"မနက်ဖြန် အလိုအလျောက် ထပ်ဖွင့်ရန်"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"‘အမြန် မျှဝေပါ’ နှင့် Find My Device ကဲ့သို့ တူးလ်များသည် ဘလူးတုသ်သုံးသည်"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"မနက်ဖြန်နံနက်တွင် ဘလူးတုသ် ပွင့်ပါမည်"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"အော်ဒီယို မျှဝေခြင်း"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"အော်ဒီယို မျှဝေနေသည်"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"အလုပ်သုံးအက်ပ် ပြန်ဖွင့်မလား။"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ပြန်ဖွင့်ရန်"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"လော့ခ်မျက်နှာပြင်ရှိ ဝိဂျက်များကို ပိတ်ရန်"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"လော့ခ်မျက်နှာပြင်ရှိ ဝိဂျက်များ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"အသုံးပြုသူကို ပြောင်းလဲရန်"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ဆွဲချမီနူး"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 2ef225e..5bc2fe5 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Vil du slå på jobbapper igjen?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Slå på"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Lukk moduler på låseskjermen"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Moduler på låseskjermen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Bytt bruker"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullegardinmeny"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 459a17f..f52466c 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"कामसम्बन्धी एपहरू अनपज गर्ने हो?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"अनपज गर्नुहोस्"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"लक स्क्रिनमा भएका विजेटहरू बन्द गर्नुहोस्"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"लक स्क्रिनमा भएका विजेटहरू"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"प्रयोगकर्ता फेर्नुहोस्"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"पुलडाउन मेनु"</string>
diff --git a/packages/SystemUI/res/values-night/styles.xml b/packages/SystemUI/res/values-night/styles.xml
index 291f8a2..546bf1c 100644
--- a/packages/SystemUI/res/values-night/styles.xml
+++ b/packages/SystemUI/res/values-night/styles.xml
@@ -72,4 +72,8 @@
<item name="android:textColor">@color/material_dynamic_secondary80</item>
</style>
+ <style name="ShortcutHelperTheme" parent="@style/ShortcutHelperThemeCommon">
+ <item name="android:windowLightNavigationBar">false</item>
+ </style>
+
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 3595fb8..7a37aa0 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Alles tonen"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth gebruiken"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Verbonden"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Audio delen"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Opgeslagen"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"loskoppelen"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activeren"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Morgen weer automatisch aanzetten"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Functies zoals Quick Share en Vind mijn apparaat gebruiken bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth wordt morgenochtend aangezet"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Audio delen"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Audio delen…"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batterijniveau"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Werk-apps hervatten?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Hervatten"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Widgets op het vergrendelscherm sluiten"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets op het vergrendelscherm"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Gebruiker wijzigen"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pull-downmenu"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 3064f1f..7e8ee6f 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"ସବୁ ଦେଖନ୍ତୁ"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"ବ୍ଲୁଟୁଥ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"କନେକ୍ଟ କରାଯାଇଛି"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"ଅଡିଓ ସେୟାରିଂ"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"ସେଭ କରାଯାଇଛି"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ଡିସକନେକ୍ଟ କରନ୍ତୁ"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ଚାଲୁ କରନ୍ତୁ"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"ଆସନ୍ତାକାଲି ସ୍ୱତଃ ପୁଣି ଚାଲୁ ହେବ"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Quick Share ଏବଂ Find My Device ପରି ଫିଚରଗୁଡ଼ିକ ବ୍ଲୁଟୁଥ ବ୍ୟବହାର କରେ"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"ବ୍ଲୁଟୁଥ ଆସନ୍ତା କାଲି ସକାଳେ ଚାଲୁ ହେବ"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"ଅଡିଓ ସେୟାରିଂ"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"ଅଡିଓ ସେୟାର କରାଯାଉଛି"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"ୱାର୍କ ଆପ୍ସକୁ ପୁଣି ଚାଲୁ କରିବେ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ଲକ ସ୍କ୍ରିନରେ ଥିବା ୱିଜେଟଗୁଡ଼ିକୁ ବନ୍ଦ କରନ୍ତୁ"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ଲକ ସ୍କ୍ରିନରେ ଥିବା ୱିଜେଟଗୁଡ଼ିକ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ୟୁଜର୍ ବଦଳାନ୍ତୁ"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ପୁଲଡାଉନ ମେନୁ"</string>
@@ -872,7 +869,7 @@
<string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"କ୍ଵିକ ସେଟିଂସ ଖୋଲନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"ଦ୍ରୁତ ସେଟିଂସ୍ ବନ୍ଦ କରନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> ଭାବରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି"</string>
- <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ଉପଯୋଗକର୍ତ୍ତା ବାଛନ୍ତୁ"</string>
+ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ୟୁଜର ବାଛନ୍ତୁ"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"କୌଣସି ଇଣ୍ଟରନେଟ୍ କନେକ୍ସନ୍ ନାହିଁ"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ସେଟିଂସର କ୍ରମ ଏଡିଟ କରନ୍ତୁ।"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 16c148e..df823cf 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਤੋਂ ਰੋਕ ਹਟਾਈਏ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ਰੋਕ ਹਟਾਓ"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਵਿਜੇਟ ਬੰਦ ਕਰੋ"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਵਿਜੇਟ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ਵਰਤੋਂਕਾਰ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ਪੁੱਲਡਾਊਨ ਮੀਨੂ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 0a0bea2..f6468af 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Cofnąć wstrzymanie aplikacji służbowych?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Cofnij wstrzymanie"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Zamknij widżety na ekranie blokady"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widżety na ekranie blokady"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Przełącz użytkownika"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 9317528..a1c72dc 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Mostrar tudo"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Conectado"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Compartilhamento de áudio"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Salvo"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ativar"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Ativar automaticamente de novo amanhã"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Recursos como o Quick Share e o Encontre Meu Dispositivo usam Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"O Bluetooth será ativado amanhã de manhã"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Compartilhamento de áudio"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Compartilhando áudio"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Áudio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Fone de ouvido"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Reativar apps de trabalho?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Reativar"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Fechar widgets na tela de bloqueio"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets na tela de bloqueio"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Trocar usuário"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu suspenso"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 2c1a9d1..eadb5e54 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Retomar apps de trabalho?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Retomar"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Fechar widgets no ecrã de bloqueio"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets no ecrã de bloqueio"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mudar utilizador"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pendente"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 9317528..a1c72dc 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Mostrar tudo"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Conectado"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Compartilhamento de áudio"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Salvo"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ativar"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Ativar automaticamente de novo amanhã"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Recursos como o Quick Share e o Encontre Meu Dispositivo usam Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"O Bluetooth será ativado amanhã de manhã"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Compartilhamento de áudio"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Compartilhando áudio"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Áudio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Fone de ouvido"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Reativar apps de trabalho?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Reativar"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Fechar widgets na tela de bloqueio"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgets na tela de bloqueio"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Trocar usuário"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu suspenso"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 95194c5..e53b4a4 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Afișează tot"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Folosește Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Conectat"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Permiterea accesului la audio"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Salvat"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"deconectează"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activează"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Activează din nou automat mâine"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funcții precum Quick Share și Găsește-mi dispozitivul folosesc Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth se va activa mâine dimineață"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Permiterea accesului la audio"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Se permite accesul la conținutul audio"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Căști"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Reactivezi aplicații de lucru?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Reactivează"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Închide widgeturile de pe ecranul de blocare"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgeturi pe ecranul de blocare"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Schimbă utilizatorul"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"meniu vertical"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 2ab3a741..8f6d7a8 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Включить рабочие приложения?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Включить"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Закрыть виджеты на заблокированном экране"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Виджеты на заблокированном экране"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Сменить пользователя."</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"раскрывающееся меню"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index df8ddda..afb5755 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"කාර්ය යෙදුම් විරාම නොකරන්න ද?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"විරාම නොකරන්න"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"අගුළු තිරයෙහි විජට් වසන්න"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"අගුළු තිරයෙහි විජට්"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"පරිශීලක මාරුව"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"නිපතන මෙනුව"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index a2a967e..453dd44 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Zrušiť pozast. prac. aplikácií?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Zrušiť pozastavenie"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Zavrieť miniaplikácie na uzamknutej obrazovke"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Miniaplikácie na uzamknutej obrazovke"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Prepnutie používateľa"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rozbaľovacia ponuka"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 55f9c71..27c376a 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Pokaži vse"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Uporabi Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Povezano"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Deljenje zvoka"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Shranjeno"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekinitev povezave"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiviranje"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Samodejno znova vklopi jutri"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funkcije, kot sta Hitro deljenje in Poišči mojo napravo, uporabljajo Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth se bo vklopil jutri zjutraj"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Deljenje zvoka"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Poteka deljenje zvoka"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Zvok"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Slušalke z mikrofonom"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Želite znova aktivirati delovne aplikacije?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Znova aktiviraj"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Zapiranje pripomočkov na zaklenjenem zaslonu"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Pripomočki na zaklenjenem zaslonu"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Preklop med uporabniki"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"spustni meni"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 751f307..071eda7 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Shiko të gjitha"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Përdor Bluetooth-in"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Lidhur"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Ndarja e audios"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Ruajtur"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"shkëput"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivizo"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Aktivizoje automatikisht nesër"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Veçoritë e tilla si \"Ndarja e shpejtë\" dhe \"Gjej pajisjen time\" përdorin Bluetooth-in"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth-i do të aktivizohet nesër në mëngjes"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Ndarja e audios"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Audioja po ndahet"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> bateri"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Kufje me mikrofon"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Hiq nga pauza apl. e punës?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Hiq nga pauza"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Mbyll miniaplikacionet në ekranin e kyçjes"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Miniaplikacionet në ekranin e kyçjes"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Ndërro përdorues"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyja me tërheqje poshtë"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 3efc0e3..233e516 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Укључити пословне апликације?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Поново активирај"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Затворите виџете на закључаном екрану"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Виџети на закључаном екрану"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Замени корисника"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"падајући мени"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 79f5dc8..579f526 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Se alla"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Använd Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Ansluten"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Ljuddelning"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Sparad"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"koppla från"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivera"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Aktivera automatiskt igen i morgon"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funktioner som Snabbdelning och Hitta min enhet använder Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth aktiveras i morgon bitti"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Ljuddelning"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Delar ljud"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batteri"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Ljud"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Vill du återuppta jobbappar?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Återuppta"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Stäng widgetar på låsskärmen"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Widgetar på låsskärmen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Byt användare"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullgardinsmeny"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index f5f2772..bc7b016 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Je, ungependa kuacha kusitisha programu za kazini?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Acha kusitisha"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Funga wijeti kwenye skrini iliyofungwa"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Wijeti kwenye skrini iliyofungwa"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Badili mtumiaji"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyu ya kuvuta chini"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 8c7ff3a..b2c83dc 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"அனைத்தையும் காட்டு"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"புளூடூத்தைப் பயன்படுத்துதல்"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"இணைக்கப்பட்டது"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"ஆடியோ பகிர்வு"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"சேமிக்கப்பட்டது"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"இணைப்பு நீக்கும்"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"செயல்படுத்தும்"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"நாளைக்குத் தானாகவே மீண்டும் இயக்கப்படும்"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"விரைவுப் பகிர்தல், Find My Device போன்ற அம்சங்கள் புளூடூத்தைப் பயன்படுத்துகின்றன"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"நாளை காலை புளூடூத் இயக்கப்படும்"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"ஆடியோ பகிர்வு"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"ஆடியோ பகிரப்படுகிறது"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"பணி ஆப்ஸை மீண்டும் இயக்கவா?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"மீண்டும் இயக்கு"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"பூட்டுத் திரையில் விட்ஜெட்களை மூடும்"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"பூட்டுத் திரையில் விட்ஜெட்கள்"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"பயனரை மாற்று"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"கீழ் இழுக்கும் மெனு"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index d57cf26..5cd1341 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"వర్క్ యాప్స్ అన్పాజ్ చేయాలా?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"అన్పాజ్ చేయండి"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"లాక్ స్క్రీన్లో విడ్జెట్లను మూసివేయండి"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"లాక్ స్క్రీన్లో విడ్జెట్లు"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"వినియోగదారుని మార్చు"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"పుల్డౌన్ మెనూ"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 73ba8b4..544844d 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"ยกเลิกการหยุดแอปงานชั่วคราวไหม"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ยกเลิกการหยุดชั่วคราว"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"ปิดวิดเจ็ตในหน้าจอล็อก"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"วิดเจ็ตในหน้าจอล็อก"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"สลับผู้ใช้"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"เมนูแบบเลื่อนลง"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 69e16e5..13e4bf8 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Tingnan lahat"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Gumamit ng Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Nakakonekta"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Pag-share ng Audio"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Na-save"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"idiskonekta"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"i-activate"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Awtomatikong i-on ulit bukas"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Gumagamit ng Bluetooth ang mga feature tulad ng Quick Share at Hanapin ang Aking Device"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Mag-o-on ang Bluetooth bukas ng umaga"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Pag-share ng Audio"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Ibinabahagi ang Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> na baterya"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"I-unpause ang mga work app?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"I-unpause"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Isara ang mga widget sa lock screen"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Mga widget sa lock screen"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Magpalit ng user"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 0d19e47..30b6ce4 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -270,20 +270,15 @@
<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>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Ses Paylaşımı"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Kaydedildi"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"bağlantıyı kes"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"etkinleştir"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Yarın otomatik olarak tekrar aç"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Quick Share ve Cihazımı Bul gibi özellikler Bluetooth\'u kullanır"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth yarın sabah açılacak"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Ses Paylaşımı"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Ses paylaşılıyor"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Ses"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Mikrofonlu kulaklık"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"İş uygulamaları devam ettirilsin mi?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Devam ettir"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Kilit ekranındaki widget\'ları kapat"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Kilit ekranındaki widget\'lar"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kullanıcı değiştirme"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"açılır menü"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 5e11ea7..e1d768e 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Показати всі"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Увімкнути Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Підключено"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Надсилання аудіо"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Збережено"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"від’єднати"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"активувати"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Автоматично ввімкнути знову завтра"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Такі функції, як швидкий обмін і \"Знайти пристрій\", використовують Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth увімкнеться завтра вранці"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Надсилання аудіо"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Надсилання аудіо"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Увімкнути робочі додатки?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Увімкнути"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Закрити віджети на заблокованому екрані"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Віджети на заблокованому екрані"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Змінити користувача"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"спадне меню"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index cc979d8..16b40bf 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"ورک ایپس کو غیر موقوف کریں؟"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"غیر موقوف کریں"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"مقفل اسکرین پر ویجٹس بند کریں"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"مقفل اسکرین پر ویجیٹس"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"صارف سوئچ کریں"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"پل ڈاؤن مینیو"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 555e1e1..76694df 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Ishga oid ilovalar qaytarilsinmi?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Davom ettirish"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Ekran qulfida vidjetlarni yopish"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Ekran qulfidagi vidjetlar"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Foydalanuvchini almashtirish"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"tortib tushiriladigan menyu"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index ff002d0..41066f9 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Xem tất cả"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Bật Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Đã kết nối"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"Chia sẻ âm thanh"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Đã lưu"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ngắt kết nối"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"kích hoạt"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Tự động bật lại vào ngày mai"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Các tính năng như Chia sẻ nhanh và Tìm thiết bị của tôi đều sử dụng Bluetooth"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth sẽ bật vào sáng mai"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"Chia sẻ âm thanh"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"Đang chia sẻ âm thanh"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> pin"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Âm thanh"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Tai nghe"</string>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Tiếp tục dùng ứng dụng công việc?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Tiếp tục dùng"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Đóng các tiện ích trên màn hình khoá"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Các tiện ích trên màn hình khoá"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Chuyển đổi người dùng"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"trình đơn kéo xuống"</string>
diff --git a/packages/SystemUI/res/values-xlarge-land/config.xml b/packages/SystemUI/res/values-xlarge-land/config.xml
new file mode 100644
index 0000000..5e4304e
--- /dev/null
+++ b/packages/SystemUI/res/values-xlarge-land/config.xml
@@ -0,0 +1,19 @@
+<?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>
+ <item name="shortcut_helper_screen_width_fraction" format="float" type="dimen">0.8</item>
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 602d707..60a46d60 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -270,20 +270,15 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"查看全部"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"使用蓝牙"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"已连接"</string>
- <!-- no translation found for quick_settings_bluetooth_device_audio_sharing (1496358082943301670) -->
- <skip />
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"音频分享"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"已保存"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"断开连接"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"启用"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"明天自动重新开启"</string>
- <!-- no translation found for turn_on_bluetooth_auto_info_disabled (682984290339848844) -->
- <skip />
- <!-- no translation found for turn_on_bluetooth_auto_info_enabled (7440944034584560279) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (4499275822759907822) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (8626191139359072540) -->
- <skip />
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"快速分享、查找我的设备等功能会使用蓝牙"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"蓝牙将在明天早上开启"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"音频分享"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"正在分享音频"</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>
@@ -463,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"是否为工作应用解除暂停状态?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"解除暂停"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"关闭锁定屏幕上的微件"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"锁定屏幕上的微件"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切换用户"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉菜单"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index c311d71d..995129e 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -270,14 +270,14 @@
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"查看全部"</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_audio_sharing" msgid="1496358082943301670">"音訊分享"</string>
+ <string name="quick_settings_bluetooth_device_audio_sharing" msgid="1496358082943301670">"音訊分享功能"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"已儲存"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"解除連結"</string>
<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="682984290339848844">"「快速分享」和「尋找我的裝置」等功能需要藍牙"</string>
- <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"藍牙會在明天早上開啟"</string>
- <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"音訊分享"</string>
+ <string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"「快速共享」和「尋找我的裝置」等功能都會使用藍牙"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"藍牙將於明天上午開啟"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="4499275822759907822">"音訊分享功能"</string>
<string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="8626191139359072540">"正在分享音訊"</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>
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"要取消暫停工作應用程式嗎?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"取消暫停"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"關閉上鎖畫面上的小工具"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"上鎖畫面上的小工具"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index b1710e7..d18f828 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"要解除工作應用程式的暫停狀態嗎?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"取消暫停"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"關閉螢幕鎖定畫面上的小工具"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"螢幕鎖定畫面上的小工具"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index dea3db4..a5caa3d 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -458,6 +458,8 @@
<string name="work_mode_off_title" msgid="5794818421357835873">"Susa ukumisa ama-app omsebenzi?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Qhubekisa"</string>
<string name="accessibility_action_label_close_communal_hub" msgid="6790396569621032333">"Vala amawijethi ekukhiyeni isikrini"</string>
+ <!-- no translation found for accessibility_action_label_edit_widgets (3821868581348322346) -->
+ <skip />
<string name="accessibility_content_description_for_communal_hub" msgid="1670220840599380118">"Amawijethi ekukhiyeni isikrini"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Shintsha umsebenzisi"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"imenyu yokudonsela phansi"</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 4a73d85..19273ec 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -1010,4 +1010,7 @@
<!-- Whether volume panel should use the large screen layout or not -->
<bool name="volume_panel_is_large_screen">false</bool>
+
+ <!-- The width of the shortcut helper container, as a fraction of the screen's width. -->
+ <item name="shortcut_helper_screen_width_fraction" format="float" type="dimen">1.0</item>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 9aff9fd..b8e78a4 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1718,6 +1718,11 @@
<!-- Accessibility label for available satellite connection [CHAR LIMIT=NONE] -->
<string name="accessibility_status_bar_satellite_available">Satellite, connection available</string>
+ <!-- Text displayed indicating that the user is connected to a satellite signal. -->
+ <string name="satellite_connected_carrier_text">Connected to satellite</string>
+ <!-- Text displayed indicating that the user is not connected to a satellite signal. -->
+ <string name="satellite_not_connected_carrier_text">Not connected to satellite</string>
+
<!-- Accessibility label for managed profile icon (not shown on screen) [CHAR LIMIT=NONE] -->
<string name="accessibility_managed_profile">Work profile</string>
@@ -1991,7 +1996,7 @@
<string name="keyboard_shortcut_clear_text">Clear search query</string>
<!-- The title for keyboard shortcut search list [CHAR LIMIT=25] -->
<string name="keyboard_shortcut_search_list_title">Keyboard Shortcuts</string>
- <!-- The hint for keyboard shortcut search list [CHAR LIMIT=25] -->
+ <!-- The hint for keyboard shortcut search list [CHAR LIMIT=50] -->
<string name="keyboard_shortcut_search_list_hint">Search shortcuts</string>
<!-- The description for no shortcuts results [CHAR LIMIT=25] -->
<string name="keyboard_shortcut_search_list_no_result">No shortcuts found</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 2c9006e..3d57111 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -1654,4 +1654,28 @@
<style name="Theme.SystemUI.Dialog.StickyKeys" parent="@style/Theme.SystemUI.Dialog">
<item name="android:colorBackground">@color/transparent</item>
</style>
+
+ <style name="ShortcutHelperAnimation" parent="@android:style/Animation.Activity">
+ <item name="android:activityOpenEnterAnimation">@anim/shortcut_helper_launch_anim</item>
+ <item name="android:taskOpenEnterAnimation">@anim/shortcut_helper_launch_anim</item>
+ <item name="android:activityOpenExitAnimation">@anim/shortcut_helper_close_anim</item>
+ <item name="android:taskOpenExitAnimation">@anim/shortcut_helper_close_anim</item>
+ </style>
+
+ <style name="ShortcutHelperThemeCommon" parent="@style/Theme.Material3.DynamicColors.DayNight">
+ <item name="android:windowAnimationStyle">@style/ShortcutHelperAnimation</item>
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:backgroundDimEnabled">true</item>
+ <item name="android:statusBarColor">@android:color/transparent</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:navigationBarColor">@android:color/transparent</item>
+ <item name="android:windowLayoutInDisplayCutoutMode">always</item>
+ <item name="enableEdgeToEdge">true</item>
+ </style>
+
+ <style name="ShortcutHelperTheme" parent="@style/ShortcutHelperThemeCommon">
+ <item name="android:windowLightNavigationBar">true</item>
+ </style>
</resources>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index dcc1440..94b6fd4 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -156,9 +156,11 @@
oneway void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) = 54;
/**
- * Set the override value for home button long press duration in ms and slop multiplier.
+ * Set the override value for home button long press duration in ms and slop multiplier and
+ * haptic.
*/
- oneway void setOverrideHomeButtonLongPress(long duration, float slopMultiplier) = 55;
+ oneway void setOverrideHomeButtonLongPress(long duration, float slopMultiplier, boolean haptic)
+ = 55;
// Next id = 56
}
diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextManager.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextManager.java
index b9b8fbe..5647b0b 100644
--- a/packages/SystemUI/src/com/android/keyguard/CarrierTextManager.java
+++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextManager.java
@@ -19,6 +19,7 @@
import static com.android.keyguard.logging.CarrierTextManagerLogger.REASON_ACTIVE_DATA_SUB_CHANGED;
import static com.android.keyguard.logging.CarrierTextManagerLogger.REASON_ON_TELEPHONY_CAPABLE;
import static com.android.keyguard.logging.CarrierTextManagerLogger.REASON_REFRESH_CARRIER_INFO;
+import static com.android.keyguard.logging.CarrierTextManagerLogger.REASON_SATELLITE_CHANGED;
import static com.android.keyguard.logging.CarrierTextManagerLogger.REASON_SIM_ERROR_STATE_CHANGED;
import android.content.Context;
@@ -43,17 +44,22 @@
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.res.R;
+import com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel.DeviceBasedSatelliteViewModel;
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository;
import com.android.systemui.telephony.TelephonyListenerManager;
+import com.android.systemui.util.kotlin.JavaAdapter;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
+import java.util.concurrent.CancellationException;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.inject.Inject;
+import kotlinx.coroutines.Job;
+
/**
* Controller that generates text including the carrier names and/or the status of all the SIM
* interfaces in the device. Through a callback, the updates can be retrieved either as a list or
@@ -77,10 +83,17 @@
protected KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final CarrierTextManagerLogger mLogger;
private final WifiRepository mWifiRepository;
+ private final DeviceBasedSatelliteViewModel mDeviceBasedSatelliteViewModel;
+ private final JavaAdapter mJavaAdapter;
private final boolean[] mSimErrorState;
private final int mSimSlotsNumber;
@Nullable // Check for nullability before dispatching
private CarrierTextCallback mCarrierTextCallback;
+ @Nullable
+ private Job mSatelliteConnectionJob;
+
+ @Nullable private String mSatelliteCarrierText;
+
private final Context mContext;
private final TelephonyManager mTelephonyManager;
private final CharSequence mSeparator;
@@ -178,6 +191,8 @@
boolean showAirplaneMode,
boolean showMissingSim,
WifiRepository wifiRepository,
+ DeviceBasedSatelliteViewModel deviceBasedSatelliteViewModel,
+ JavaAdapter javaAdapter,
TelephonyManager telephonyManager,
TelephonyListenerManager telephonyListenerManager,
WakefulnessLifecycle wakefulnessLifecycle,
@@ -192,6 +207,8 @@
mShowAirplaneMode = showAirplaneMode;
mShowMissingSim = showMissingSim;
mWifiRepository = wifiRepository;
+ mDeviceBasedSatelliteViewModel = deviceBasedSatelliteViewModel;
+ mJavaAdapter = javaAdapter;
mTelephonyManager = telephonyManager;
mSeparator = separator;
mTelephonyListenerManager = telephonyListenerManager;
@@ -282,6 +299,11 @@
mWakefulnessLifecycle.addObserver(mWakefulnessObserver);
});
mTelephonyListenerManager.addActiveDataSubscriptionIdListener(mPhoneStateListener);
+ cancelSatelliteCollectionJob(/* reason= */ "Starting new job");
+ mSatelliteConnectionJob =
+ mJavaAdapter.alwaysCollectFlow(
+ mDeviceBasedSatelliteViewModel.getCarrierText(),
+ this::onSatelliteCarrierTextChanged);
} else {
// Don't listen and clear out the text when the device isn't a phone.
mMainExecutor.execute(() -> callback.updateCarrierInfo(
@@ -294,6 +316,7 @@
mWakefulnessLifecycle.removeObserver(mWakefulnessObserver);
});
mTelephonyListenerManager.removeActiveDataSubscriptionIdListener(mPhoneStateListener);
+ cancelSatelliteCollectionJob(/* reason= */ "Stopping listening");
}
}
@@ -311,6 +334,12 @@
return mKeyguardUpdateMonitor.getFilteredSubscriptionInfo();
}
+ private void onSatelliteCarrierTextChanged(@Nullable String text) {
+ mLogger.logUpdateCarrierTextForReason(REASON_SATELLITE_CHANGED);
+ mSatelliteCarrierText = text;
+ updateCarrierText();
+ }
+
protected void updateCarrierText() {
Trace.beginSection("CarrierTextManager#updateCarrierText");
boolean allSimsMissing = true;
@@ -411,6 +440,12 @@
airplaneMode = true;
}
+ String currentSatelliteText = mSatelliteCarrierText;
+ if (currentSatelliteText != null) {
+ mLogger.logUsingSatelliteText(currentSatelliteText);
+ displayText = currentSatelliteText;
+ }
+
final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo(
displayText,
carrierNames,
@@ -616,11 +651,20 @@
return list;
}
+ private void cancelSatelliteCollectionJob(String reason) {
+ Job job = mSatelliteConnectionJob;
+ if (job != null) {
+ job.cancel(new CancellationException(reason));
+ }
+ }
+
/** Injectable Buildeer for {@#link CarrierTextManager}. */
public static class Builder {
private final Context mContext;
private final String mSeparator;
private final WifiRepository mWifiRepository;
+ private final DeviceBasedSatelliteViewModel mDeviceBasedSatelliteViewModel;
+ private final JavaAdapter mJavaAdapter;
private final TelephonyManager mTelephonyManager;
private final TelephonyListenerManager mTelephonyListenerManager;
private final WakefulnessLifecycle mWakefulnessLifecycle;
@@ -637,6 +681,8 @@
Context context,
@Main Resources resources,
@Nullable WifiRepository wifiRepository,
+ DeviceBasedSatelliteViewModel deviceBasedSatelliteViewModel,
+ JavaAdapter javaAdapter,
TelephonyManager telephonyManager,
TelephonyListenerManager telephonyListenerManager,
WakefulnessLifecycle wakefulnessLifecycle,
@@ -648,6 +694,8 @@
mSeparator = resources.getString(
com.android.internal.R.string.kg_text_message_separator);
mWifiRepository = wifiRepository;
+ mDeviceBasedSatelliteViewModel = deviceBasedSatelliteViewModel;
+ mJavaAdapter = javaAdapter;
mTelephonyManager = telephonyManager;
mTelephonyListenerManager = telephonyListenerManager;
mWakefulnessLifecycle = wakefulnessLifecycle;
@@ -682,9 +730,20 @@
public CarrierTextManager build() {
mLogger.setLocation(mDebugLocation);
return new CarrierTextManager(
- mContext, mSeparator, mShowAirplaneMode, mShowMissingSim, mWifiRepository,
- mTelephonyManager, mTelephonyListenerManager, mWakefulnessLifecycle,
- mMainExecutor, mBgExecutor, mKeyguardUpdateMonitor, mLogger);
+ mContext,
+ mSeparator,
+ mShowAirplaneMode,
+ mShowMissingSim,
+ mWifiRepository,
+ mDeviceBasedSatelliteViewModel,
+ mJavaAdapter,
+ mTelephonyManager,
+ mTelephonyListenerManager,
+ mWakefulnessLifecycle,
+ mMainExecutor,
+ mBgExecutor,
+ mKeyguardUpdateMonitor,
+ mLogger);
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index e8e1cab..b916fc2 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -39,7 +39,6 @@
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.hardware.biometrics.BiometricRequestConstants;
import android.media.AudioManager;
import android.metrics.LogMaker;
import android.os.SystemClock;
@@ -73,9 +72,6 @@
import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.biometrics.FaceAuthAccessibilityDelegate;
-import com.android.systemui.biometrics.SideFpsController;
-import com.android.systemui.biometrics.SideFpsUiRequestSource;
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor;
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.classifier.FalsingA11yDelegate;
@@ -103,15 +99,14 @@
import dagger.Lazy;
+import kotlinx.coroutines.Job;
+
import java.io.File;
import java.util.Arrays;
-import java.util.Optional;
import javax.inject.Inject;
import javax.inject.Provider;
-import kotlinx.coroutines.Job;
-
/** Controller for {@link KeyguardSecurityContainer} */
@KeyguardBouncerScope
public class KeyguardSecurityContainerController extends ViewController<KeyguardSecurityContainer>
@@ -135,7 +130,6 @@
private final GlobalSettings mGlobalSettings;
private final FeatureFlags mFeatureFlags;
private final SessionTracker mSessionTracker;
- private final Optional<SideFpsController> mSideFpsController;
private final FalsingA11yDelegate mFalsingA11yDelegate;
private final DeviceEntryFaceAuthInteractor mDeviceEntryFaceAuthInteractor;
private final BouncerMessageInteractor mBouncerMessageInteractor;
@@ -457,7 +451,6 @@
FeatureFlags featureFlags,
GlobalSettings globalSettings,
SessionTracker sessionTracker,
- Optional<SideFpsController> sideFpsController,
FalsingA11yDelegate falsingA11yDelegate,
TelephonyManager telephonyManager,
ViewMediatorCallback viewMediatorCallback,
@@ -491,11 +484,6 @@
mFeatureFlags = featureFlags;
mGlobalSettings = globalSettings;
mSessionTracker = sessionTracker;
- if (SideFpsControllerRefactor.isEnabled()) {
- mSideFpsController = Optional.empty();
- } else {
- mSideFpsController = sideFpsController;
- }
mFalsingA11yDelegate = falsingA11yDelegate;
mTelephonyManager = telephonyManager;
mViewMediatorCallback = viewMediatorCallback;
@@ -578,28 +566,6 @@
mView.clearFocus();
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- /**
- * Shows and hides the side finger print sensor animation.
- *
- * @param isVisible sets whether we show or hide the side fps animation
- */
- public void updateSideFpsVisibility(boolean isVisible) {
- SideFpsControllerRefactor.assertInLegacyMode();
- if (!mSideFpsController.isPresent()) {
- return;
- }
-
- if (isVisible) {
- mSideFpsController.get().show(
- SideFpsUiRequestSource.PRIMARY_BOUNCER,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD
- );
- } else {
- mSideFpsController.get().hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
- }
- }
-
/**
* Shows the primary security screen for the user. This will be either the multi-selector
* or the user's security method.
@@ -611,6 +577,7 @@
SecurityMode securityMode = whitelistIpcs(() -> mSecurityModel.getSecurityMode(
mSelectedUserInteractor.getSelectedUserId()));
if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")");
+ mPrimaryBouncerInteractor.get().setLastShownPrimarySecurityScreen(securityMode);
showSecurityScreen(securityMode);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 8c51a4e..519622e 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -42,7 +42,6 @@
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
import static com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_OPENED;
-import static com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_UNKNOWN;
import android.annotation.AnyThread;
import android.annotation.MainThread;
@@ -1868,7 +1867,9 @@
@Override
public void onPostureChanged(@DevicePostureInt int posture) {
if (posture == DEVICE_POSTURE_OPENED) {
- mLogger.d("Posture changed to open - attempting to request active unlock");
+ mLogger.d("Posture changed to open - attempting to request active"
+ + " unlock and run face auth");
+ getFaceAuthInteractor().onDeviceUnfolded();
requestActiveUnlockFromWakeReason(PowerManager.WAKE_REASON_UNFOLD_DEVICE,
false);
}
@@ -2434,9 +2435,7 @@
updateFingerprintListeningState(BIOMETRIC_ACTION_START);
}
});
- if (mConfigFaceAuthSupportedPosture != DEVICE_POSTURE_UNKNOWN) {
- mDevicePostureController.addCallback(mPostureCallback);
- }
+ mDevicePostureController.addCallback(mPostureCallback);
updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE);
mTaskStackChangeListeners.registerTaskStackListener(mTaskStackListener);
diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java
index afea224..4bbc2d6 100644
--- a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java
+++ b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java
@@ -16,23 +16,14 @@
package com.android.keyguard.dagger;
-import static com.android.systemui.biometrics.SideFpsControllerKt.hasSideFpsSensor;
-
-import android.annotation.Nullable;
-import android.hardware.fingerprint.FingerprintManager;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import com.android.keyguard.KeyguardSecurityContainer;
import com.android.keyguard.KeyguardSecurityViewFlipper;
-import com.android.systemui.res.R;
-import com.android.systemui.biometrics.SideFpsController;
-import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
-
-import java.util.Optional;
-
-import javax.inject.Provider;
+import com.android.systemui.dagger.qualifiers.RootView;
+import com.android.systemui.res.R;
import dagger.Module;
import dagger.Provides;
@@ -62,16 +53,4 @@
KeyguardSecurityContainer containerView) {
return containerView.findViewById(R.id.view_flipper);
}
-
- /** Provides {@link SideFpsController} if the device has the side fingerprint sensor. */
- @Provides
- @KeyguardBouncerScope
- static Optional<SideFpsController> providesOptionalSidefpsController(
- @Nullable FingerprintManager fingerprintManager,
- Provider<SideFpsController> sidefpsControllerProvider) {
- if (!hasSideFpsSensor(fingerprintManager)) {
- return Optional.empty();
- }
- return Optional.of(sidefpsControllerProvider.get());
- }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/logging/CarrierTextManagerLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/CarrierTextManagerLogger.kt
index cb474d3..48fea55 100644
--- a/packages/SystemUI/src/com/android/keyguard/logging/CarrierTextManagerLogger.kt
+++ b/packages/SystemUI/src/com/android/keyguard/logging/CarrierTextManagerLogger.kt
@@ -77,6 +77,15 @@
)
}
+ fun logUsingSatelliteText(satelliteText: String) {
+ buffer.log(
+ TAG,
+ LogLevel.VERBOSE,
+ { str1 = satelliteText },
+ { "┣ updateCarrierText: using satellite text. text=$str1" },
+ )
+ }
+
/** De-structures the info object so that we don't have to generate new strings */
fun logCallbackSentFromUpdate(info: CarrierTextCallbackInfo) {
buffer.log(
@@ -129,6 +138,7 @@
const val REASON_ON_TELEPHONY_CAPABLE = 2
const val REASON_SIM_ERROR_STATE_CHANGED = 3
const val REASON_ACTIVE_DATA_SUB_CHANGED = 4
+ const val REASON_SATELLITE_CHANGED = 5
@Retention(AnnotationRetention.SOURCE)
@IntDef(
@@ -138,6 +148,7 @@
REASON_ON_TELEPHONY_CAPABLE,
REASON_SIM_ERROR_STATE_CHANGED,
REASON_ACTIVE_DATA_SUB_CHANGED,
+ REASON_SATELLITE_CHANGED,
]
)
annotation class CarrierTextRefreshReason
@@ -148,6 +159,7 @@
REASON_ON_TELEPHONY_CAPABLE -> "ON_TELEPHONY_CAPABLE"
REASON_SIM_ERROR_STATE_CHANGED -> "SIM_ERROR_STATE_CHANGED"
REASON_ACTIVE_DATA_SUB_CHANGED -> "ACTIVE_DATA_SUB_CHANGED"
+ REASON_SATELLITE_CHANGED -> "SATELLITE_CHANGED"
else -> "unknown"
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index 08d45fa..4b07402 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -299,6 +299,7 @@
int serviceIndex = 0;
do {
+ startedAny = false;
queue = nextQueue;
nextQueue = new ArrayDeque<>(startables.size());
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java b/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java
index 7e94804..5c75a49 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java
@@ -94,7 +94,7 @@
.setOneHanded(mWMComponent.getOneHanded())
.setBubbles(mWMComponent.getBubbles())
.setTaskViewFactory(mWMComponent.getTaskViewFactory())
- .setTransitions(mWMComponent.getTransitions())
+ .setShellTransitions(mWMComponent.getShellTransitions())
.setKeyguardTransitions(mWMComponent.getKeyguardTransitions())
.setStartingSurface(mWMComponent.getStartingSurface())
.setDisplayAreaHelper(mWMComponent.getDisplayAreaHelper())
@@ -115,7 +115,7 @@
.setOneHanded(Optional.ofNullable(null))
.setBubbles(Optional.ofNullable(null))
.setTaskViewFactory(Optional.ofNullable(null))
- .setTransitions(new ShellTransitions() {})
+ .setShellTransitions(new ShellTransitions() {})
.setKeyguardTransitions(new KeyguardTransitions() {})
.setDisplayAreaHelper(Optional.ofNullable(null))
.setStartingSurface(Optional.ofNullable(null))
diff --git a/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.java
index d0f08f5..85aeb27 100644
--- a/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.java
@@ -27,6 +27,7 @@
import android.view.MotionEvent;
import android.view.VelocityTracker;
+import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import com.android.internal.logging.UiEvent;
@@ -94,13 +95,11 @@
private Boolean mCapture;
private Boolean mExpanded;
- private boolean mBouncerInitiallyShowing;
-
private TouchSession mTouchSession;
- private ValueAnimatorCreator mValueAnimatorCreator;
+ private final ValueAnimatorCreator mValueAnimatorCreator;
- private VelocityTrackerFactory mVelocityTrackerFactory;
+ private final VelocityTrackerFactory mVelocityTrackerFactory;
private final UiEventLogger mUiEventLogger;
@@ -118,17 +117,12 @@
private final GestureDetector.OnGestureListener mOnGestureListener =
new GestureDetector.SimpleOnGestureListener() {
@Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
+ public boolean onScroll(MotionEvent e1, @NonNull MotionEvent e2, float distanceX,
float distanceY) {
if (mCapture == null) {
- mBouncerInitiallyShowing = mCentralSurfaces
- .map(CentralSurfaces::isBouncerShowing)
- .orElse(false);
-
if (Flags.dreamOverlayBouncerSwipeDirectionFiltering()) {
mCapture = Math.abs(distanceY) > Math.abs(distanceX)
- && ((distanceY < 0 && mBouncerInitiallyShowing)
- || (distanceY > 0 && !mBouncerInitiallyShowing));
+ && distanceY > 0;
} else {
// If the user scrolling favors a vertical direction, begin capturing
// scrolls.
@@ -146,13 +140,8 @@
return false;
}
- // Don't set expansion for downward scroll when the bouncer is hidden.
- if (!mBouncerInitiallyShowing && (e1.getY() < e2.getY())) {
- return true;
- }
-
- // Don't set expansion for upward scroll when the bouncer is shown.
- if (mBouncerInitiallyShowing && (e1.getY() > e2.getY())) {
+ // Don't set expansion for downward scroll.
+ if (e1.getY() < e2.getY()) {
return true;
}
@@ -176,8 +165,7 @@
final float dragDownAmount = e2.getY() - e1.getY();
final float screenTravelPercentage = Math.abs(e1.getY() - e2.getY())
/ mTouchSession.getBounds().height();
- setPanelExpansion(mBouncerInitiallyShowing
- ? screenTravelPercentage : 1 - screenTravelPercentage);
+ setPanelExpansion(1 - screenTravelPercentage);
return true;
}
};
@@ -223,9 +211,9 @@
LockPatternUtils lockPatternUtils,
UserTracker userTracker,
@Named(BouncerSwipeModule.SWIPE_TO_BOUNCER_FLING_ANIMATION_UTILS_OPENING)
- FlingAnimationUtils flingAnimationUtils,
+ FlingAnimationUtils flingAnimationUtils,
@Named(BouncerSwipeModule.SWIPE_TO_BOUNCER_FLING_ANIMATION_UTILS_CLOSING)
- FlingAnimationUtils flingAnimationUtilsClosing,
+ FlingAnimationUtils flingAnimationUtilsClosing,
@Named(BouncerSwipeModule.SWIPE_TO_BOUNCER_START_REGION) float swipeRegionPercentage,
@Named(BouncerSwipeModule.MIN_BOUNCER_ZONE_SCREEN_PERCENTAGE) float minRegionPercentage,
UiEventLogger uiEventLogger) {
@@ -247,17 +235,13 @@
public void getTouchInitiationRegion(Rect bounds, Region region, Rect exclusionRect) {
final int width = bounds.width();
final int height = bounds.height();
- final float minBouncerHeight = height * mMinBouncerZoneScreenPercentage;
final int minAllowableBottom = Math.round(height * (1 - mMinBouncerZoneScreenPercentage));
- final boolean isBouncerShowing =
- mCentralSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false);
- final Rect normalRegion = isBouncerShowing
- ? new Rect(0, 0, width, Math.round(height * mBouncerZoneScreenPercentage))
- : new Rect(0, Math.round(height * (1 - mBouncerZoneScreenPercentage)),
- width, height);
+ final Rect normalRegion = new Rect(0,
+ Math.round(height * (1 - mBouncerZoneScreenPercentage)),
+ width, height);
- if (!isBouncerShowing && exclusionRect != null) {
+ if (exclusionRect != null) {
int lowestBottom = Math.min(Math.max(0, exclusionRect.bottom), minAllowableBottom);
normalRegion.top = Math.max(normalRegion.top, lowestBottom);
}
@@ -322,8 +306,7 @@
: KeyguardBouncerConstants.EXPANSION_HIDDEN;
// Log the swiping up to show Bouncer event.
- if (!mBouncerInitiallyShowing
- && expansion == KeyguardBouncerConstants.EXPANSION_VISIBLE) {
+ if (expansion == KeyguardBouncerConstants.EXPANSION_VISIBLE) {
mUiEventLogger.log(DreamEvent.DREAM_SWIPED);
}
@@ -335,17 +318,15 @@
}
}
- private ValueAnimator createExpansionAnimator(float targetExpansion, float expansionHeight) {
+ private ValueAnimator createExpansionAnimator(float targetExpansion) {
final ValueAnimator animator =
mValueAnimatorCreator.create(mCurrentExpansion, targetExpansion);
animator.addUpdateListener(
animation -> {
float expansionFraction = (float) animation.getAnimatedValue();
- float dragDownAmount = expansionFraction * expansionHeight;
setPanelExpansion(expansionFraction);
});
- if (!mBouncerInitiallyShowing
- && targetExpansion == KeyguardBouncerConstants.EXPANSION_VISIBLE) {
+ if (targetExpansion == KeyguardBouncerConstants.EXPANSION_VISIBLE) {
animator.addListener(
new AnimatorListenerAdapter() {
@Override
@@ -381,8 +362,7 @@
final float viewHeight = mTouchSession.getBounds().height();
final float currentHeight = viewHeight * mCurrentExpansion;
final float targetHeight = viewHeight * expansion;
- final float expansionHeight = targetHeight - currentHeight;
- final ValueAnimator animator = createExpansionAnimator(expansion, expansionHeight);
+ final ValueAnimator animator = createExpansionAnimator(expansion);
if (expansion == KeyguardBouncerConstants.EXPANSION_HIDDEN) {
// Hides the bouncer, i.e., fully expands the space above the bouncer.
mFlingAnimationUtilsClosing.apply(animator, currentHeight, targetHeight, velocity,
diff --git a/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.java
index 9ef9938..9c7fc9d 100644
--- a/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.java
@@ -23,7 +23,8 @@
import android.view.GestureDetector;
import android.view.MotionEvent;
-import com.android.systemui.shade.ShadeViewController;
+import androidx.annotation.NonNull;
+
import com.android.systemui.statusbar.phone.CentralSurfaces;
import java.util.Optional;
@@ -37,29 +38,34 @@
*/
public class ShadeTouchHandler implements TouchHandler {
private final Optional<CentralSurfaces> mSurfaces;
- private final ShadeViewController mShadeViewController;
private final int mInitiationHeight;
+ /**
+ * Tracks whether or not we are capturing a given touch. Will be null before and after a touch.
+ */
+ private Boolean mCapture;
+
@Inject
ShadeTouchHandler(Optional<CentralSurfaces> centralSurfaces,
- ShadeViewController shadeViewController,
@Named(NOTIFICATION_SHADE_GESTURE_INITIATION_HEIGHT) int initiationHeight) {
mSurfaces = centralSurfaces;
- mShadeViewController = shadeViewController;
mInitiationHeight = initiationHeight;
}
@Override
public void onSessionStart(TouchSession session) {
- if (mSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false)) {
+ if (mSurfaces.isEmpty()) {
session.pop();
return;
}
- session.registerInputListener(ev -> {
- mShadeViewController.handleExternalTouch((MotionEvent) ev);
+ session.registerCallback(() -> mCapture = null);
+ session.registerInputListener(ev -> {
if (ev instanceof MotionEvent) {
+ if (mCapture != null && mCapture) {
+ mSurfaces.get().handleExternalShadeWindowTouch((MotionEvent) ev);
+ }
if (((MotionEvent) ev).getAction() == MotionEvent.ACTION_UP) {
session.pop();
}
@@ -68,15 +74,25 @@
session.registerGestureListener(new GestureDetector.SimpleOnGestureListener() {
@Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
+ public boolean onScroll(MotionEvent e1, @NonNull MotionEvent e2, float distanceX,
float distanceY) {
- return true;
+ if (mCapture == null) {
+ // Only capture swipes that are going downwards.
+ mCapture = Math.abs(distanceY) > Math.abs(distanceX) && distanceY < 0;
+ if (mCapture) {
+ // Send the initial touches over, as the input listener has already
+ // processed these touches.
+ mSurfaces.get().handleExternalShadeWindowTouch(e1);
+ mSurfaces.get().handleExternalShadeWindowTouch(e2);
+ }
+ }
+ return mCapture;
}
@Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+ public boolean onFling(MotionEvent e1, @NonNull MotionEvent e2, float velocityX,
float velocityY) {
- return true;
+ return mCapture;
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
index a667de2..970699f 100644
--- a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
@@ -28,8 +28,9 @@
import android.os.UserHandle
import android.util.Log
import com.android.app.tracing.traceSection
-import com.android.systemui.Flags.communalHub
import com.android.systemui.backup.BackupHelper.Companion.ACTION_RESTORE_FINISHED
+import com.android.systemui.communal.data.backup.CommunalBackupHelper
+import com.android.systemui.communal.data.backup.CommunalBackupUtils
import com.android.systemui.communal.domain.backup.CommunalPrefsBackupHelper
import com.android.systemui.controls.controller.AuxiliaryPersistenceWrapper
import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
@@ -59,6 +60,7 @@
"systemui.keyguard.quickaffordance.shared_preferences"
private const val COMMUNAL_PREFS_BACKUP_KEY =
"systemui.communal.shared_preferences"
+ private const val COMMUNAL_STATE_BACKUP_KEY = "systemui.communal_state"
val controlsDataLock = Any()
const val ACTION_RESTORE_FINISHED = "com.android.systemui.backup.RESTORE_FINISHED"
const val PERMISSION_SELF = "com.android.systemui.permission.SELF"
@@ -89,6 +91,10 @@
userId = userHandle.identifier,
)
)
+ addHelper(
+ COMMUNAL_STATE_BACKUP_KEY,
+ CommunalBackupHelper(userHandle, CommunalBackupUtils(context = this)),
+ )
}
}
@@ -116,7 +122,7 @@
}
private fun communalEnabled(): Boolean {
- return resources.getBoolean(R.bool.config_communalServiceEnabled) && communalHub()
+ return resources.getBoolean(R.bool.config_communalServiceEnabled)
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index d85b81d..ca88d40d 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -71,7 +71,6 @@
import com.android.systemui.biometrics.domain.interactor.LogContextInteractor;
import com.android.systemui.biometrics.domain.interactor.PromptCredentialInteractor;
import com.android.systemui.biometrics.domain.interactor.PromptSelectorInteractor;
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor;
import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
import com.android.systemui.biometrics.ui.viewmodel.CredentialViewModel;
import com.android.systemui.biometrics.ui.viewmodel.PromptViewModel;
@@ -93,6 +92,9 @@
import kotlin.Unit;
+import kotlinx.coroutines.CoroutineScope;
+import kotlinx.coroutines.Job;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
@@ -106,9 +108,6 @@
import javax.inject.Inject;
import javax.inject.Provider;
-import kotlinx.coroutines.CoroutineScope;
-import kotlinx.coroutines.Job;
-
/**
* Receives messages sent from {@link com.android.server.biometrics.BiometricService} and shows the
* appropriate biometric UI (e.g. BiometricDialogView).
@@ -136,7 +135,6 @@
@Nullable private final FingerprintManager mFingerprintManager;
@Nullable private final FaceManager mFaceManager;
private final Provider<UdfpsController> mUdfpsControllerFactory;
- private final Provider<SideFpsController> mSidefpsControllerFactory;
private final CoroutineScope mApplicationCoroutineScope;
private Job mBiometricContextListenerJob = null;
@@ -163,7 +161,6 @@
@Nullable private UdfpsController mUdfpsController;
@Nullable private UdfpsOverlayParams mUdfpsOverlayParams;
@Nullable private IUdfpsRefreshRateRequestCallback mUdfpsRefreshRateRequestCallback;
- @Nullable private SideFpsController mSideFpsController;
@NonNull private Lazy<UdfpsLogger> mUdfpsLogger;
@VisibleForTesting IBiometricSysuiReceiver mReceiver;
@VisibleForTesting @NonNull final BiometricDisplayListener mOrientationListener;
@@ -320,14 +317,7 @@
this, mUdfpsLogger.get()));
mUdfpsBounds = mUdfpsProps.get(0).getLocation().getRect();
}
-
mSidefpsProps = !sidefpsProps.isEmpty() ? sidefpsProps : null;
- if (mSidefpsProps != null) {
- if (!SideFpsControllerRefactor.isEnabled()) {
- mSideFpsController = mSidefpsControllerFactory.get();
- }
- }
-
mFingerprintManager.registerBiometricStateListener(new BiometricStateListener() {
@Override
public void onEnrollmentsChanged(int userId, int sensorId, boolean hasEnrollments) {
@@ -738,7 +728,6 @@
@Nullable FingerprintManager fingerprintManager,
@Nullable FaceManager faceManager,
Provider<UdfpsController> udfpsControllerFactory,
- Provider<SideFpsController> sidefpsControllerFactory,
@NonNull DisplayManager displayManager,
@NonNull WakefulnessLifecycle wakefulnessLifecycle,
@NonNull AuthDialogPanelInteractionDetector panelInteractionDetector,
@@ -766,7 +755,6 @@
mFingerprintManager = fingerprintManager;
mFaceManager = faceManager;
mUdfpsControllerFactory = udfpsControllerFactory;
- mSidefpsControllerFactory = sidefpsControllerFactory;
mUdfpsLogger = udfpsLogger;
mDisplayManager = displayManager;
mWindowManager = windowManager;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
deleted file mode 100644
index 85f63e9..0000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
+++ /dev/null
@@ -1,537 +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.systemui.biometrics
-
-import android.app.ActivityTaskManager
-import android.content.Context
-import android.content.res.Configuration
-import android.graphics.Color
-import android.graphics.PixelFormat
-import android.graphics.PorterDuff
-import android.graphics.PorterDuffColorFilter
-import android.graphics.Rect
-import android.hardware.biometrics.BiometricRequestConstants
-import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_KEYGUARD
-import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_SETTINGS
-import android.hardware.biometrics.SensorLocationInternal
-import android.hardware.display.DisplayManager
-import android.hardware.fingerprint.FingerprintManager
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
-import android.hardware.fingerprint.ISidefpsController
-import android.os.Handler
-import android.util.Log
-import android.util.RotationUtils
-import android.view.Display
-import android.view.DisplayInfo
-import android.view.Gravity
-import android.view.LayoutInflater
-import android.view.Surface
-import android.view.View
-import android.view.View.AccessibilityDelegate
-import android.view.View.INVISIBLE
-import android.view.View.VISIBLE
-import android.view.ViewPropertyAnimator
-import android.view.WindowManager
-import android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION
-import android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY
-import android.view.accessibility.AccessibilityEvent
-import androidx.annotation.RawRes
-import com.airbnb.lottie.LottieAnimationView
-import com.airbnb.lottie.LottieProperty
-import com.airbnb.lottie.model.KeyPath
-import com.android.app.animation.Interpolators
-import com.android.app.tracing.traceSection
-import com.android.internal.annotations.VisibleForTesting
-import com.android.keyguard.KeyguardPINView
-import com.android.systemui.Dumpable
-import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor
-import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.res.R
-import com.android.systemui.util.boundsOnScreen
-import com.android.systemui.util.concurrency.DelayableExecutor
-import java.io.PrintWriter
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
-
-private const val TAG = "SideFpsController"
-
-/**
- * Shows and hides the side fingerprint sensor (side-fps) overlay and handles side fps touch events.
- */
-@SysUISingleton
-class SideFpsController
-@Inject
-constructor(
- private val context: Context,
- private val layoutInflater: LayoutInflater,
- fingerprintManager: FingerprintManager?,
- private val windowManager: WindowManager,
- private val activityTaskManager: ActivityTaskManager,
- displayManager: DisplayManager,
- private val displayStateInteractor: DisplayStateInteractor,
- @Main private val mainExecutor: DelayableExecutor,
- @Main private val handler: Handler,
- private val alternateBouncerInteractor: AlternateBouncerInteractor,
- @Application private val applicationScope: CoroutineScope,
- dumpManager: DumpManager,
- fpsUnlockTracker: FpsUnlockTracker
-) : Dumpable {
- private val requests: HashSet<SideFpsUiRequestSource> = HashSet()
-
- @VisibleForTesting
- val sensorProps: FingerprintSensorPropertiesInternal =
- fingerprintManager?.sideFpsSensorProperties
- ?: throw IllegalStateException("no side fingerprint sensor")
-
- @VisibleForTesting
- val orientationReasonListener =
- OrientationReasonListener(
- context,
- displayManager,
- handler,
- sensorProps,
- { reason -> onOrientationChanged(reason) },
- BiometricRequestConstants.REASON_UNKNOWN
- )
-
- @VisibleForTesting val orientationListener = orientationReasonListener.orientationListener
-
- private val isReverseDefaultRotation =
- context.resources.getBoolean(com.android.internal.R.bool.config_reverseDefaultRotation)
-
- private var overlayShowAnimator: ViewPropertyAnimator? = null
-
- private var overlayView: View? = null
- set(value) {
- field?.let { oldView ->
- val lottie = oldView.requireViewById(R.id.sidefps_animation) as LottieAnimationView
- lottie.pauseAnimation()
- lottie.removeAllLottieOnCompositionLoadedListener()
- windowManager.removeView(oldView)
- orientationListener.disable()
- }
- overlayShowAnimator?.cancel()
- overlayShowAnimator = null
-
- field = value
- field?.let { newView ->
- if (requests.contains(SideFpsUiRequestSource.PRIMARY_BOUNCER)) {
- newView.alpha = 0f
- overlayShowAnimator =
- newView
- .animate()
- .alpha(1f)
- .setDuration(KeyguardPINView.ANIMATION_DURATION)
- .setInterpolator(Interpolators.ALPHA_IN)
- }
- windowManager.addView(newView, overlayViewParams)
- orientationListener.enable()
- overlayShowAnimator?.start()
- }
- }
- @VisibleForTesting var overlayOffsets: SensorLocationInternal = SensorLocationInternal.DEFAULT
-
- private val displayInfo = DisplayInfo()
-
- private val overlayViewParams =
- WindowManager.LayoutParams(
- WindowManager.LayoutParams.WRAP_CONTENT,
- WindowManager.LayoutParams.WRAP_CONTENT,
- WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
- Utils.FINGERPRINT_OVERLAY_LAYOUT_PARAM_FLAGS,
- PixelFormat.TRANSLUCENT
- )
- .apply {
- title = TAG
- fitInsetsTypes = 0 // overrides default, avoiding status bars during layout
- gravity = Gravity.TOP or Gravity.LEFT
- layoutInDisplayCutoutMode =
- WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
- privateFlags = PRIVATE_FLAG_TRUSTED_OVERLAY or PRIVATE_FLAG_NO_MOVE_ANIMATION
- }
-
- init {
- if (!SideFpsControllerRefactor.isEnabled) {
- fpsUnlockTracker.startTracking()
- fingerprintManager?.setSidefpsController(
- object : ISidefpsController.Stub() {
- override fun show(
- sensorId: Int,
- @BiometricRequestConstants.RequestReason reason: Int
- ) =
- if (reason.isReasonToAutoShow(activityTaskManager)) {
- show(SideFpsUiRequestSource.AUTO_SHOW, reason)
- } else {
- hide(SideFpsUiRequestSource.AUTO_SHOW)
- }
-
- override fun hide(sensorId: Int) = hide(SideFpsUiRequestSource.AUTO_SHOW)
- }
- )
- listenForAlternateBouncerVisibility()
-
- dumpManager.registerDumpable(this)
- }
- }
-
- private fun listenForAlternateBouncerVisibility() {
- if (!DeviceEntryUdfpsRefactor.isEnabled) {
- alternateBouncerInteractor.setAlternateBouncerUIAvailable(true, "SideFpsController")
- }
-
- applicationScope.launch {
- alternateBouncerInteractor.isVisible.collect { isVisible: Boolean ->
- if (isVisible) {
- show(SideFpsUiRequestSource.ALTERNATE_BOUNCER, REASON_AUTH_KEYGUARD)
- } else {
- hide(SideFpsUiRequestSource.ALTERNATE_BOUNCER)
- }
- }
- }
- }
-
- /** Shows the side fps overlay if not already shown. */
- fun show(
- request: SideFpsUiRequestSource,
- @BiometricRequestConstants.RequestReason
- reason: Int = BiometricRequestConstants.REASON_UNKNOWN
- ) {
- SideFpsControllerRefactor.assertInLegacyMode()
- if (!displayStateInteractor.isInRearDisplayMode.value) {
- requests.add(request)
- mainExecutor.execute {
- if (overlayView == null) {
- traceSection(
- "SideFpsController#show(request=${request.name}, reason=$reason)"
- ) {
- createOverlayForDisplay(reason)
- }
- } else {
- Log.v(TAG, "overlay already shown")
- }
- }
- }
- }
-
- /** Hides the fps overlay if shown. */
- fun hide(request: SideFpsUiRequestSource) {
- SideFpsControllerRefactor.assertInLegacyMode()
- requests.remove(request)
- mainExecutor.execute {
- if (requests.isEmpty()) {
- traceSection("SideFpsController#hide(${request.name})") { overlayView = null }
- }
- }
- }
-
- /** Hide the arrow indicator. */
- fun hideIndicator() {
- SideFpsControllerRefactor.assertInLegacyMode()
- val lottieAnimationView =
- overlayView?.findViewById(R.id.sidefps_animation) as LottieAnimationView?
- lottieAnimationView?.visibility = INVISIBLE
- }
-
- /** Show the arrow indicator. */
- fun showIndicator() {
- SideFpsControllerRefactor.assertInLegacyMode()
- val lottieAnimationView =
- overlayView?.findViewById(R.id.sidefps_animation) as LottieAnimationView?
- lottieAnimationView?.visibility = VISIBLE
- }
-
- override fun dump(pw: PrintWriter, args: Array<out String>) {
- pw.println("requests:")
- for (requestSource in requests) {
- pw.println(" $requestSource.name")
- }
-
- pw.println("overlayView:")
- pw.println(" width=${overlayView?.width}")
- pw.println(" height=${overlayView?.height}")
- pw.println(" boundsOnScreen=${overlayView?.boundsOnScreen}")
-
- pw.println("displayStateInteractor:")
- pw.println(" isInRearDisplayMode=${displayStateInteractor?.isInRearDisplayMode?.value}")
-
- pw.println("sensorProps:")
- pw.println(" displayId=${displayInfo.uniqueId}")
- pw.println(" sensorType=${sensorProps?.sensorType}")
- pw.println(" location=${sensorProps?.getLocation(displayInfo.uniqueId)}")
- pw.println("lottieAnimationView:")
- pw.println(
- " visibility=${overlayView?.findViewById<View>(R.id.sidefps_animation)?.visibility}"
- )
-
- pw.println("overlayOffsets=$overlayOffsets")
- pw.println("isReverseDefaultRotation=$isReverseDefaultRotation")
- pw.println("currentRotation=${displayInfo.rotation}")
- }
-
- private fun onOrientationChanged(@BiometricRequestConstants.RequestReason reason: Int) {
- if (overlayView?.isAttachedToWindow == true) {
- createOverlayForDisplay(reason)
- }
- }
-
- private fun createOverlayForDisplay(@BiometricRequestConstants.RequestReason reason: Int) {
- val view = layoutInflater.inflate(R.layout.sidefps_view, null, false)
- overlayView = view
- val display = context.display!!
- // b/284098873 `context.display.rotation` may not up-to-date, we use displayInfo.rotation
- display.getDisplayInfo(displayInfo)
- val offsets =
- sensorProps.getLocation(display.uniqueId).let { location ->
- if (location == null) {
- Log.w(TAG, "No location specified for display: ${display.uniqueId}")
- }
- location ?: sensorProps.location
- }
- overlayOffsets = offsets
-
- val lottie = view.requireViewById(R.id.sidefps_animation) as LottieAnimationView
- view.rotation =
- display.asSideFpsAnimationRotation(
- offsets.isYAligned(),
- getRotationFromDefault(displayInfo.rotation)
- )
- lottie.setAnimation(
- display.asSideFpsAnimation(
- offsets.isYAligned(),
- getRotationFromDefault(displayInfo.rotation)
- )
- )
- lottie.addLottieOnCompositionLoadedListener {
- // Check that view is not stale, and that overlayView has not been hidden/removed
- if (overlayView?.isAttachedToWindow == true && overlayView == view) {
- updateOverlayParams(display, it.bounds)
- }
- }
- orientationReasonListener.reason = reason
- lottie.addOverlayDynamicColor(context, reason)
-
- /**
- * Intercepts TYPE_WINDOW_STATE_CHANGED accessibility event, preventing Talkback from
- * speaking @string/accessibility_fingerprint_label twice when sensor location indicator is
- * in focus
- */
- view.setAccessibilityDelegate(
- object : AccessibilityDelegate() {
- override fun dispatchPopulateAccessibilityEvent(
- host: View,
- event: AccessibilityEvent
- ): Boolean {
- return if (
- event.getEventType() === AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
- ) {
- true
- } else {
- super.dispatchPopulateAccessibilityEvent(host, event)
- }
- }
- }
- )
- }
-
- @VisibleForTesting
- fun updateOverlayParams(display: Display, bounds: Rect) {
- val isNaturalOrientation = display.isNaturalOrientation()
- val isDefaultOrientation =
- if (isReverseDefaultRotation) !isNaturalOrientation else isNaturalOrientation
- val size = windowManager.maximumWindowMetrics.bounds
-
- val displayWidth = if (isDefaultOrientation) size.width() else size.height()
- val displayHeight = if (isDefaultOrientation) size.height() else size.width()
- val boundsWidth = if (isDefaultOrientation) bounds.width() else bounds.height()
- val boundsHeight = if (isDefaultOrientation) bounds.height() else bounds.width()
-
- val sensorBounds =
- if (overlayOffsets.isYAligned()) {
- Rect(
- displayWidth - boundsWidth,
- overlayOffsets.sensorLocationY,
- displayWidth,
- overlayOffsets.sensorLocationY + boundsHeight
- )
- } else {
- Rect(
- overlayOffsets.sensorLocationX,
- 0,
- overlayOffsets.sensorLocationX + boundsWidth,
- boundsHeight
- )
- }
-
- RotationUtils.rotateBounds(
- sensorBounds,
- Rect(0, 0, displayWidth, displayHeight),
- getRotationFromDefault(display.rotation)
- )
-
- overlayViewParams.x = sensorBounds.left
- overlayViewParams.y = sensorBounds.top
-
- windowManager.updateViewLayout(overlayView, overlayViewParams)
- }
-
- private fun getRotationFromDefault(rotation: Int): Int =
- if (isReverseDefaultRotation) (rotation + 1) % 4 else rotation
-}
-
-private val FingerprintManager?.sideFpsSensorProperties: FingerprintSensorPropertiesInternal?
- get() = this?.sensorPropertiesInternal?.firstOrNull { it.isAnySidefpsType }
-
-/** Returns [True] when the device has a side fingerprint sensor. */
-fun FingerprintManager?.hasSideFpsSensor(): Boolean = this?.sideFpsSensorProperties != null
-
-@BiometricRequestConstants.RequestReason
-private fun Int.isReasonToAutoShow(activityTaskManager: ActivityTaskManager): Boolean =
- when (this) {
- REASON_AUTH_KEYGUARD -> false
- REASON_AUTH_SETTINGS ->
- when (activityTaskManager.topClass()) {
- // TODO(b/186176653): exclude fingerprint overlays from this list view
- "com.android.settings.biometrics.fingerprint.FingerprintSettings" -> false
- else -> true
- }
- else -> true
- }
-
-private fun ActivityTaskManager.topClass(): String =
- getTasks(1).firstOrNull()?.topActivity?.className ?: ""
-
-@RawRes
-private fun Display.asSideFpsAnimation(yAligned: Boolean, rotationFromDefault: Int): Int =
- when (rotationFromDefault) {
- Surface.ROTATION_0 -> if (yAligned) R.raw.sfps_pulse else R.raw.sfps_pulse_landscape
- Surface.ROTATION_180 -> if (yAligned) R.raw.sfps_pulse else R.raw.sfps_pulse_landscape
- else -> if (yAligned) R.raw.sfps_pulse_landscape else R.raw.sfps_pulse
- }
-
-private fun Display.asSideFpsAnimationRotation(yAligned: Boolean, rotationFromDefault: Int): Float =
- when (rotationFromDefault) {
- Surface.ROTATION_90 -> if (yAligned) 0f else 180f
- Surface.ROTATION_180 -> 180f
- Surface.ROTATION_270 -> if (yAligned) 180f else 0f
- else -> 0f
- }
-
-private fun SensorLocationInternal.isYAligned(): Boolean = sensorLocationY != 0
-
-private fun Display.isNaturalOrientation(): Boolean =
- rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180
-
-private fun LottieAnimationView.addOverlayDynamicColor(
- context: Context,
- @BiometricRequestConstants.RequestReason reason: Int
-) {
- fun update() {
- val isKeyguard = reason == REASON_AUTH_KEYGUARD
- if (isKeyguard) {
- val color =
- com.android.settingslib.Utils.getColorAttrDefaultColor(
- context,
- com.android.internal.R.attr.materialColorPrimaryFixed
- )
- val outerRimColor =
- com.android.settingslib.Utils.getColorAttrDefaultColor(
- context,
- com.android.internal.R.attr.materialColorPrimaryFixedDim
- )
- val chevronFill =
- com.android.settingslib.Utils.getColorAttrDefaultColor(
- context,
- com.android.internal.R.attr.materialColorOnPrimaryFixed
- )
- addValueCallback(KeyPath(".blue600", "**"), LottieProperty.COLOR_FILTER) {
- PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)
- }
- addValueCallback(KeyPath(".blue400", "**"), LottieProperty.COLOR_FILTER) {
- PorterDuffColorFilter(outerRimColor, PorterDuff.Mode.SRC_ATOP)
- }
- addValueCallback(KeyPath(".black", "**"), LottieProperty.COLOR_FILTER) {
- PorterDuffColorFilter(chevronFill, PorterDuff.Mode.SRC_ATOP)
- }
- } else {
- if (!isDarkMode(context)) {
- addValueCallback(KeyPath(".black", "**"), LottieProperty.COLOR_FILTER) {
- PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP)
- }
- }
- for (key in listOf(".blue600", ".blue400")) {
- addValueCallback(KeyPath(key, "**"), LottieProperty.COLOR_FILTER) {
- PorterDuffColorFilter(
- context.getColor(
- com.android.settingslib.color.R.color.settingslib_color_blue400
- ),
- PorterDuff.Mode.SRC_ATOP
- )
- }
- }
- }
- }
-
- if (composition != null) {
- update()
- } else {
- addLottieOnCompositionLoadedListener { update() }
- }
-}
-
-private fun isDarkMode(context: Context): Boolean {
- val darkMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
- return darkMode == Configuration.UI_MODE_NIGHT_YES
-}
-
-@VisibleForTesting
-class OrientationReasonListener(
- context: Context,
- displayManager: DisplayManager,
- handler: Handler,
- sensorProps: FingerprintSensorPropertiesInternal,
- onOrientationChanged: (reason: Int) -> Unit,
- @BiometricRequestConstants.RequestReason var reason: Int
-) {
- val orientationListener =
- BiometricDisplayListener(
- context,
- displayManager,
- handler,
- BiometricDisplayListener.SensorType.SideFingerprint(sensorProps)
- ) {
- onOrientationChanged(reason)
- }
-}
-
-/**
- * The source of a request to show the side fps visual indicator. This is distinct from
- * [BiometricRequestConstants] which corresponds with the reason fingerprint authentication is
- * requested.
- */
-enum class SideFpsUiRequestSource {
- /** see [isReasonToAutoShow] */
- AUTO_SHOW,
- /** Pin, pattern or password bouncer */
- PRIMARY_BOUNCER,
- ALTERNATE_BOUNCER,
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FacePropertyRepository.kt b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FacePropertyRepository.kt
index 59b59bf..7d4ba84 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FacePropertyRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FacePropertyRepository.kt
@@ -39,6 +39,7 @@
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.keyguard.shared.model.DevicePosture
import com.android.systemui.res.R
import java.util.concurrent.Executor
import javax.inject.Inject
@@ -68,6 +69,8 @@
/** The info of current available camera. */
val cameraInfo: StateFlow<CameraInfo?>
+
+ val supportedPostures: List<DevicePosture>
}
/** Describes a biometric sensor */
@@ -188,6 +191,15 @@
initialValue = if (cameraInfoList.isNotEmpty()) cameraInfoList[0] else null
)
+ private val supportedPosture =
+ applicationContext.resources.getInteger(R.integer.config_face_auth_supported_posture)
+ override val supportedPostures: List<DevicePosture> =
+ if (supportedPosture == 0) {
+ DevicePosture.entries
+ } else {
+ listOf(DevicePosture.toPosture(supportedPosture))
+ }
+
private val defaultSensorLocation: StateFlow<Point?> =
cameraInfo
.map { it?.cameraLocation }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/shared/SideFpsControllerRefactor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/shared/SideFpsControllerRefactor.kt
deleted file mode 100644
index 899b07e..0000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/shared/SideFpsControllerRefactor.kt
+++ /dev/null
@@ -1,53 +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.biometrics.shared
-
-import com.android.systemui.flags.FlagToken
-import com.android.systemui.flags.RefactorFlagUtils
-import com.android.systemui.shared.Flags
-
-/** Helper for reading or using the sidefps controller refactor flag state. */
-@Suppress("NOTHING_TO_INLINE")
-object SideFpsControllerRefactor {
- /** The aconfig flag name */
- const val FLAG_NAME = Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
-
- /** A token used for dependency declaration */
- val token: FlagToken
- get() = FlagToken(FLAG_NAME, isEnabled)
-
- /** Is the refactor enabled */
- @JvmStatic
- inline val isEnabled
- get() = Flags.sidefpsControllerRefactor()
-
- /**
- * 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)
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt
index 9949e4c..245817e 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt
@@ -36,7 +36,6 @@
import com.android.systemui.biometrics.domain.interactor.BiometricStatusInteractor
import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
import com.android.systemui.biometrics.domain.interactor.SideFpsSensorInteractor
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor
import com.android.systemui.biometrics.shared.model.AuthenticationReason.NotRunning
import com.android.systemui.biometrics.shared.model.LottieCallback
import com.android.systemui.biometrics.ui.viewmodel.SideFpsOverlayViewModel
@@ -73,10 +72,6 @@
) : CoreStartable {
override fun start() {
- if (!SideFpsControllerRefactor.isEnabled) {
- return
- }
-
applicationScope
.launch {
sfpsSensorInteractor.get().isAvailable.collect { isSfpsAvailable ->
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/KeyguardBouncerRepository.kt b/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/KeyguardBouncerRepository.kt
index d0ff185..0534824 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/KeyguardBouncerRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/data/repository/KeyguardBouncerRepository.kt
@@ -18,7 +18,7 @@
import android.os.Build
import android.util.Log
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor
+import com.android.keyguard.KeyguardSecurityModel
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EXPANSION_HIDDEN
import com.android.systemui.bouncer.shared.model.BouncerDismissActionModel
import com.android.systemui.bouncer.shared.model.BouncerShowMessageModel
@@ -89,7 +89,9 @@
val resourceUpdateRequests: StateFlow<Boolean>
val alternateBouncerVisible: StateFlow<Boolean>
val alternateBouncerUIAvailable: StateFlow<Boolean>
- val sideFpsShowing: StateFlow<Boolean>
+
+ /** Last shown security mode of the primary bouncer (ie: pin/pattern/password/SIM) */
+ val lastShownSecurityMode: StateFlow<KeyguardSecurityModel.SecurityMode>
/** Action that should be run right after the bouncer is dismissed. */
var bouncerDismissActionModel: BouncerDismissActionModel?
@@ -126,8 +128,7 @@
fun setAlternateBouncerUIAvailable(isAvailable: Boolean)
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- fun setSideFpsShowing(isShowing: Boolean)
+ fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode)
}
@SysUISingleton
@@ -186,6 +187,11 @@
private val _showMessage = MutableStateFlow<BouncerShowMessageModel?>(null)
override val showMessage = _showMessage.asStateFlow()
+ private val _lastShownSecurityMode =
+ MutableStateFlow(KeyguardSecurityModel.SecurityMode.Invalid)
+ override val lastShownSecurityMode: StateFlow<KeyguardSecurityModel.SecurityMode> =
+ _lastShownSecurityMode.asStateFlow()
+
private val _resourceUpdateRequests = MutableStateFlow(false)
override val resourceUpdateRequests = _resourceUpdateRequests.asStateFlow()
@@ -196,8 +202,6 @@
private val _alternateBouncerUIAvailable = MutableStateFlow(false)
override val alternateBouncerUIAvailable: StateFlow<Boolean> =
_alternateBouncerUIAvailable.asStateFlow()
- private val _sideFpsShowing = MutableStateFlow(false)
- override val sideFpsShowing: StateFlow<Boolean> = _sideFpsShowing.asStateFlow()
init {
setUpLogging()
@@ -269,10 +273,8 @@
_isBackButtonEnabled.value = isBackButtonEnabled
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- override fun setSideFpsShowing(isShowing: Boolean) {
- SideFpsControllerRefactor.assertInLegacyMode()
- _sideFpsShowing.value = isShowing
+ override fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode) {
+ _lastShownSecurityMode.value = securityMode
}
/** Sets up logs for state flows. */
@@ -321,8 +323,9 @@
alternateBouncerUIAvailable
.logDiffsForTable(buffer, "", "IsAlternateBouncerUIAvailable", false)
.launchIn(applicationScope)
- sideFpsShowing
- .logDiffsForTable(buffer, "", "isSideFpsShowing", false)
+ lastShownSecurityMode
+ .map { it.name }
+ .logDiffsForTable(buffer, "", "lastShownSecurityMode", null)
.launchIn(applicationScope)
}
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractor.kt
index d20c607..1dbf6f1 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractor.kt
@@ -38,7 +38,7 @@
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.TrustRepository
import com.android.systemui.user.data.repository.UserRepository
-import com.android.systemui.util.kotlin.Sextuple
+import com.android.systemui.util.kotlin.Septuple
import com.android.systemui.util.kotlin.combine
import javax.inject.Inject
import kotlin.math.roundToInt
@@ -145,15 +145,16 @@
private val initialBouncerMessage: Flow<BouncerMessageModel> =
combine(
+ primaryBouncerInteractor.lastShownSecurityMode, // required to update defaultMessage
biometricSettingsRepository.authenticationFlags,
trustRepository.isCurrentUserTrustManaged,
isAnyBiometricsEnabledAndEnrolled,
deviceEntryFingerprintAuthInteractor.isLockedOut,
faceAuthRepository.isLockedOut,
isFingerprintAuthCurrentlyAllowedOnBouncer,
- ::Sextuple
+ ::Septuple
)
- .map { (flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) ->
+ .map { (_, flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) ->
val isTrustUsuallyManaged = trustRepository.isCurrentUserTrustUsuallyManaged.value
val trustOrBiometricsAvailable =
(isTrustUsuallyManaged || biometricsEnrolledAndEnabled)
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt
index d88b3dc..3c5e571 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt
@@ -18,18 +18,14 @@
import android.content.Context
import android.content.res.ColorStateList
-import android.hardware.biometrics.BiometricSourceType
import android.os.Handler
import android.os.Trace
import android.util.Log
import android.view.View
-import com.android.keyguard.KeyguardConstants
import com.android.keyguard.KeyguardSecurityModel
import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.DejankUtils
import com.android.systemui.Flags
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EXPANSION_HIDDEN
@@ -107,6 +103,8 @@
val resourceUpdateRequests: Flow<Boolean> = repository.resourceUpdateRequests.filter { it }
val keyguardPosition: Flow<Float> = repository.keyguardPosition.filterNotNull()
val panelExpansionAmount: Flow<Float> = repository.panelExpansionAmount
+ val lastShownSecurityMode: Flow<KeyguardSecurityModel.SecurityMode> =
+ repository.lastShownSecurityMode
/** 0f = bouncer fully hidden. 1f = bouncer fully visible. */
val bouncerExpansion: Flow<Float> =
@@ -122,31 +120,9 @@
/** Allow for interaction when just about fully visible */
val isInteractable: Flow<Boolean> = bouncerExpansion.map { it > 0.9 }
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- val sideFpsShowing: Flow<Boolean> = repository.sideFpsShowing
private var currentUserActiveUnlockRunning = false
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- /** This callback needs to be a class field so it does not get garbage collected. */
- val keyguardUpdateMonitorCallback =
- object : KeyguardUpdateMonitorCallback() {
- override fun onBiometricRunningStateChanged(
- running: Boolean,
- biometricSourceType: BiometricSourceType?
- ) {
- updateSideFpsVisibility()
- }
-
- override fun onStrongAuthStateChanged(userId: Int) {
- updateSideFpsVisibility()
- }
- }
-
init {
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- if (!SideFpsControllerRefactor.isEnabled) {
- keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
- }
applicationScope.launch {
trustRepository.isCurrentUserActiveUnlockRunning.collect {
currentUserActiveUnlockRunning = it
@@ -357,36 +333,6 @@
repository.setPrimaryStartDisappearAnimation(runnable)
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- /** Determine whether to show the side fps animation. */
- fun updateSideFpsVisibility() {
- SideFpsControllerRefactor.assertInLegacyMode()
- val sfpsEnabled: Boolean =
- context.resources.getBoolean(R.bool.config_show_sidefps_hint_on_bouncer)
- val fpsDetectionRunning: Boolean = keyguardUpdateMonitor.isFingerprintDetectionRunning
- val isUnlockingWithFpAllowed: Boolean =
- keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed
- val toShow =
- (isBouncerShowing() &&
- sfpsEnabled &&
- fpsDetectionRunning &&
- isUnlockingWithFpAllowed &&
- !isAnimatingAway())
-
- if (KeyguardConstants.DEBUG) {
- Log.d(
- TAG,
- ("sideFpsToShow=$toShow\n" +
- "isBouncerShowing=${isBouncerShowing()}\n" +
- "configEnabled=$sfpsEnabled\n" +
- "fpsDetectionRunning=$fpsDetectionRunning\n" +
- "isUnlockingWithFpAllowed=$isUnlockingWithFpAllowed\n" +
- "isAnimatingAway=${isAnimatingAway()}")
- )
- }
- repository.setSideFpsShowing(toShow)
- }
-
/** Returns whether bouncer is fully showing. */
fun isFullyShowing(): Boolean {
return (repository.primaryBouncerShowingSoon.value || isBouncerShowing()) &&
@@ -440,6 +386,10 @@
return isShowing.value
}
+ fun setLastShownPrimarySecurityScreen(securityMode: KeyguardSecurityModel.SecurityMode) {
+ repository.setLastShownSecurityMode(securityMode)
+ }
+
/** Whether we want to wait to show the bouncer in case passive auth succeeds. */
private fun usePrimaryBouncerPassiveAuthDelay(): Boolean {
val canRunActiveUnlock =
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt
index cc387e9..b76520b 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt
@@ -27,7 +27,6 @@
import com.android.keyguard.KeyguardSecurityModel
import com.android.keyguard.KeyguardSecurityView
import com.android.keyguard.dagger.KeyguardBouncerComponent
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EXPANSION_VISIBLE
import com.android.systemui.bouncer.ui.BouncerViewDelegate
@@ -231,23 +230,6 @@
.collect { view.systemUiVisibility = it }
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- if (!SideFpsControllerRefactor.isEnabled) {
- launch {
- viewModel.shouldUpdateSideFps.collect {
- viewModel.updateSideFpsVisibility()
- }
- }
- }
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- if (!SideFpsControllerRefactor.isEnabled) {
- launch {
- viewModel.sideFpsShowing.collect {
- securityContainerController.updateSideFpsVisibility(it)
- }
- }
- }
awaitCancellation()
} finally {
viewModel.setBouncerViewDelegate(null)
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModel.kt
index e1fea5f..3fef766 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModel.kt
@@ -17,7 +17,6 @@
package com.android.systemui.bouncer.ui.viewmodel
import android.view.View
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.bouncer.shared.model.BouncerShowMessageModel
import com.android.systemui.bouncer.ui.BouncerView
@@ -25,9 +24,7 @@
import javax.inject.Inject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.merge
/** Models UI state for the lock screen bouncer; handles user input. */
@ExperimentalCoroutinesApi
@@ -64,19 +61,6 @@
/** Observe whether keyguard is authenticated already. */
val keyguardAuthenticated: Flow<Boolean> = interactor.keyguardAuthenticatedBiometrics
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- /** Observe whether the side fps is showing. */
- val sideFpsShowing: Flow<Boolean> = interactor.sideFpsShowing
-
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- /** Observe whether we should update fps is showing. */
- val shouldUpdateSideFps: Flow<Unit> =
- merge(
- interactor.isShowing.map {},
- interactor.startingToHide,
- interactor.startingDisappearAnimation.filterNotNull().map {}
- )
-
/** Observe whether we want to update resources. */
fun notifyUpdateResources() {
interactor.notifyUpdatedResources()
@@ -92,12 +76,6 @@
interactor.onMessageShown()
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- fun updateSideFpsVisibility() {
- SideFpsControllerRefactor.assertInLegacyMode()
- interactor.updateSideFpsVisibility()
- }
-
/** Observe whether back button is enabled. */
fun observeOnIsBackButtonEnabled(systemUiVisibility: () -> Int): Flow<Int> {
return interactor.isBackButtonEnabled.map { enabled ->
diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalBackupRestoreStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalBackupRestoreStartable.kt
new file mode 100644
index 0000000..cdeeb6f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalBackupRestoreStartable.kt
@@ -0,0 +1,83 @@
+/*
+ * 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.communal
+
+import android.appwidget.AppWidgetManager
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import com.android.systemui.CoreStartable
+import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.communal.domain.interactor.CommunalInteractor
+import com.android.systemui.communal.widgets.CommunalWidgetModule
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.Logger
+import com.android.systemui.log.dagger.CommunalLog
+import javax.inject.Inject
+
+@SysUISingleton
+class CommunalBackupRestoreStartable
+@Inject
+constructor(
+ private val broadcastDispatcher: BroadcastDispatcher,
+ private val communalInteractor: CommunalInteractor,
+ @CommunalLog logBuffer: LogBuffer,
+) : CoreStartable, BroadcastReceiver() {
+
+ private val logger = Logger(logBuffer, TAG)
+
+ override fun start() {
+ broadcastDispatcher.registerReceiver(
+ receiver = this,
+ filter = IntentFilter(AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED),
+ )
+ }
+
+ override fun onReceive(context: Context?, intent: Intent?) {
+ if (intent == null) {
+ logger.w("On app widget host restored, but intent is null")
+ return
+ }
+
+ if (intent.action != AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED) {
+ return
+ }
+
+ val hostId = intent.getIntExtra(AppWidgetManager.EXTRA_HOST_ID, 0)
+ if (hostId != CommunalWidgetModule.APP_WIDGET_HOST_ID) {
+ return
+ }
+
+ val oldIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS)
+ val newIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS)
+
+ if (oldIds == null || newIds == null || oldIds.size != newIds.size) {
+ logger.w("On app widget host restored, but old to new ids mapping is invalid")
+ communalInteractor.abortRestoreWidgets()
+ return
+ }
+
+ val oldToNewWidgetIdMap = oldIds.zip(newIds).toMap()
+ communalInteractor.restoreWidgets(oldToNewWidgetIdMap)
+ }
+
+ companion object {
+ const val TAG = "CommunalBackupRestoreStartable"
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
index 5a174b9..f437032 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
@@ -17,6 +17,7 @@
package com.android.systemui.communal
import android.provider.Settings
+import android.service.dreams.Flags.dreamTracksFocus
import com.android.compose.animation.scene.SceneKey
import com.android.systemui.CoreStartable
import com.android.systemui.communal.domain.interactor.CommunalInteractor
@@ -25,11 +26,13 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dock.DockManager
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.keyguard.shared.model.TransitionStep
+import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.util.kotlin.emitOnStart
import com.android.systemui.util.kotlin.sample
import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
@@ -37,15 +40,18 @@
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
/**
* A [CoreStartable] responsible for automatically navigating between communal scenes when certain
@@ -61,8 +67,10 @@
private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
private val keyguardInteractor: KeyguardInteractor,
private val systemSettings: SystemSettings,
+ private val notificationShadeWindowController: NotificationShadeWindowController,
@Application private val applicationScope: CoroutineScope,
@Background private val bgScope: CoroutineScope,
+ @Main private val mainDispatcher: CoroutineDispatcher,
) : CoreStartable {
private var screenTimeout: Int = DEFAULT_SCREEN_TIMEOUT
@@ -134,6 +142,16 @@
}
}
}
+
+ if (dreamTracksFocus()) {
+ bgScope.launch {
+ communalInteractor.isIdleOnCommunal.collectLatest {
+ withContext(mainDispatcher) {
+ notificationShadeWindowController.setGlanceableHubShowing(it)
+ }
+ }
+ }
+ }
}
private suspend fun determineSceneAfterTransition(
diff --git a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
index 27af99e..7fa091a 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
@@ -16,6 +16,8 @@
package com.android.systemui.communal.dagger
+import android.content.Context
+import com.android.systemui.communal.data.backup.CommunalBackupUtils
import com.android.systemui.communal.data.db.CommunalDatabaseModule
import com.android.systemui.communal.data.repository.CommunalMediaRepositoryModule
import com.android.systemui.communal.data.repository.CommunalPrefsRepositoryModule
@@ -78,5 +80,13 @@
)
return SceneDataSourceDelegator(applicationScope, config)
}
+
+ @Provides
+ @SysUISingleton
+ fun providesCommunalBackupUtils(
+ @Application context: Context,
+ ): CommunalBackupUtils {
+ return CommunalBackupUtils(context)
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupHelper.kt b/packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupHelper.kt
new file mode 100644
index 0000000..b95c966
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupHelper.kt
@@ -0,0 +1,114 @@
+/*
+ * 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.communal.data.backup
+
+import android.app.backup.BackupDataInputStream
+import android.app.backup.BackupDataOutput
+import android.app.backup.BackupHelper
+import android.os.ParcelFileDescriptor
+import android.os.UserHandle
+import android.util.Log
+import com.android.systemui.Flags.communalHub
+import com.android.systemui.communal.proto.toByteArray
+import java.io.IOException
+
+/** Helps with backup & restore of the communal hub widgets. */
+class CommunalBackupHelper(
+ private val userHandle: UserHandle,
+ private val communalBackupUtils: CommunalBackupUtils,
+) : BackupHelper {
+
+ override fun performBackup(
+ oldState: ParcelFileDescriptor?,
+ data: BackupDataOutput?,
+ newState: ParcelFileDescriptor?
+ ) {
+ if (!communalHub()) {
+ Log.d(TAG, "Skipping backup. Communal not enabled")
+ return
+ }
+
+ if (data == null) {
+ Log.e(TAG, "Backup failed. Data is null")
+ return
+ }
+
+ if (!userHandle.isSystem) {
+ Log.d(TAG, "Backup skipped for non-system user")
+ return
+ }
+
+ val state = communalBackupUtils.getCommunalHubState()
+ Log.i(TAG, "Backing up communal state: $state")
+
+ val bytes = state.toByteArray()
+ try {
+ data.writeEntityHeader(ENTITY_KEY, bytes.size)
+ data.writeEntityData(bytes, bytes.size)
+ } catch (e: IOException) {
+ Log.e(TAG, "Backup failed while writing data: ${e.localizedMessage}")
+ return
+ }
+
+ Log.i(TAG, "Backup complete")
+ }
+
+ override fun restoreEntity(data: BackupDataInputStream?) {
+ if (data == null) {
+ Log.e(TAG, "Restore failed. Data is null")
+ return
+ }
+
+ if (!userHandle.isSystem) {
+ Log.d(TAG, "Restore skipped for non-system user")
+ return
+ }
+
+ if (data.key != ENTITY_KEY) {
+ Log.d(TAG, "Restore skipped due to mismatching entity key")
+ return
+ }
+
+ val dataSize = data.size()
+ val bytes = ByteArray(dataSize)
+ try {
+ data.read(bytes, /* offset= */ 0, dataSize)
+ } catch (e: IOException) {
+ Log.e(TAG, "Restore failed while reading data: ${e.localizedMessage}")
+ return
+ }
+
+ try {
+ communalBackupUtils.writeBytesToDisk(bytes)
+ } catch (e: Exception) {
+ Log.e(TAG, "Restore failed while writing to disk: ${e.localizedMessage}")
+ return
+ }
+
+ Log.i(TAG, "Restore complete")
+ }
+
+ override fun writeNewStateDescription(newState: ParcelFileDescriptor?) {
+ // Do nothing because there is no partial backup
+ }
+
+ companion object {
+ private const val TAG = "CommunalBackupHelper"
+
+ const val ENTITY_KEY = "communal_hub_state"
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupUtils.kt b/packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupUtils.kt
new file mode 100644
index 0000000..a8e5174
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupUtils.kt
@@ -0,0 +1,113 @@
+/*
+ * 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.communal.data.backup
+
+import android.content.Context
+import androidx.annotation.WorkerThread
+import com.android.systemui.communal.data.db.CommunalDatabase
+import com.android.systemui.communal.nano.CommunalHubState
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileNotFoundException
+import java.io.FileOutputStream
+import java.io.IOException
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.runBlocking
+
+/** Utilities for communal backup and restore. */
+class CommunalBackupUtils(
+ private val context: Context,
+) {
+
+ /**
+ * Retrieves a communal hub state protobuf that represents the current state of the communal
+ * database.
+ */
+ @WorkerThread
+ fun getCommunalHubState(): CommunalHubState {
+ val database = CommunalDatabase.getInstance(context)
+ val widgetsFromDb = runBlocking { database.communalWidgetDao().getWidgets().first() }
+ val widgetsState = mutableListOf<CommunalHubState.CommunalWidgetItem>()
+ widgetsFromDb.keys.forEach { rankItem ->
+ widgetsState.add(
+ CommunalHubState.CommunalWidgetItem().apply {
+ rank = rankItem.rank
+ widgetId = widgetsFromDb[rankItem]!!.widgetId
+ componentName = widgetsFromDb[rankItem]?.componentName
+ }
+ )
+ }
+ return CommunalHubState().apply { widgets = widgetsState.toTypedArray() }
+ }
+
+ /**
+ * Writes [data] to disk as a file as [FILE_NAME], overwriting existing content if any.
+ *
+ * @throws FileNotFoundException if the file exists but is a directory rather than a regular
+ * file, does not exist but cannot be created, or cannot be opened for any other reason.
+ * @throws SecurityException if write access is denied.
+ * @throws IOException if writing fails.
+ */
+ @WorkerThread
+ fun writeBytesToDisk(data: ByteArray) {
+ val output = FileOutputStream(getFile())
+ output.write(data)
+ output.close()
+ }
+
+ /**
+ * Reads bytes from [FILE_NAME], and throws if file does not exist.
+ *
+ * @throws FileNotFoundException if file does not exist.
+ * @throws SecurityException if read access is denied.
+ * @throws IOException if reading fails.
+ */
+ @WorkerThread
+ fun readBytesFromDisk(): ByteArray {
+ val input = FileInputStream(getFile())
+ val bytes = input.readAllBytes()
+ input.close()
+
+ return bytes
+ }
+
+ /**
+ * Removes the bytes written to disk at [FILE_NAME].
+ *
+ * @return True if and only if the file is successfully deleted
+ * @throws SecurityException if permission is denied
+ */
+ @WorkerThread
+ fun clear(): Boolean {
+ return getFile().delete()
+ }
+
+ /** Whether [FILE_NAME] exists. */
+ @WorkerThread
+ fun fileExists(): Boolean {
+ return getFile().exists()
+ }
+
+ @WorkerThread
+ private fun getFile(): File {
+ return File(context.filesDir, FILE_NAME)
+ }
+
+ companion object {
+ private const val FILE_NAME = "communal_restore"
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabase.kt b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabase.kt
index 595d320..3ce8109 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabase.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabase.kt
@@ -16,10 +16,53 @@
package com.android.systemui.communal.data.db
+import android.content.Context
+import androidx.annotation.VisibleForTesting
import androidx.room.Database
+import androidx.room.Room
import androidx.room.RoomDatabase
+import com.android.systemui.res.R
@Database(entities = [CommunalWidgetItem::class, CommunalItemRank::class], version = 1)
abstract class CommunalDatabase : RoomDatabase() {
abstract fun communalWidgetDao(): CommunalWidgetDao
+
+ companion object {
+ private var instance: CommunalDatabase? = null
+
+ /**
+ * Gets a singleton instance of the communal database. If this is called for the first time
+ * globally, a new instance is created.
+ *
+ * @param context The context the database is created in. Only effective when a new instance
+ * is created.
+ * @param callback An optional callback registered to the database. Only effective when a
+ * new instance is created.
+ */
+ fun getInstance(
+ context: Context,
+ callback: Callback? = null,
+ ): CommunalDatabase {
+ if (instance == null) {
+ instance =
+ Room.databaseBuilder(
+ context,
+ CommunalDatabase::class.java,
+ context.resources.getString(R.string.config_communalDatabase)
+ )
+ .also { builder ->
+ builder.fallbackToDestructiveMigration(dropAllTables = false)
+ callback?.let { callback -> builder.addCallback(callback) }
+ }
+ .build()
+ }
+
+ return instance!!
+ }
+
+ @VisibleForTesting
+ fun setInstance(database: CommunalDatabase) {
+ instance = database
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabaseModule.kt b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabaseModule.kt
index e766290..b8161fd 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabaseModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalDatabaseModule.kt
@@ -17,10 +17,8 @@
package com.android.systemui.communal.data.db
import android.content.Context
-import androidx.room.Room
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.res.R
import dagger.Module
import dagger.Provides
@@ -33,14 +31,7 @@
@Application context: Context,
defaultWidgetPopulation: DefaultWidgetPopulation,
): CommunalDatabase {
- return Room.databaseBuilder(
- context,
- CommunalDatabase::class.java,
- context.resources.getString(R.string.config_communalDatabase)
- )
- .fallbackToDestructiveMigration()
- .addCallback(defaultWidgetPopulation)
- .build()
+ return CommunalDatabase.getInstance(context, defaultWidgetPopulation)
}
@SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt
index 9cd77c4..d174fd1 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt
@@ -23,6 +23,7 @@
import androidx.room.RoomDatabase
import androidx.room.Transaction
import androidx.sqlite.db.SupportSQLiteDatabase
+import com.android.systemui.communal.nano.CommunalHubState
import com.android.systemui.communal.widgets.CommunalWidgetHost
import com.android.systemui.communal.widgets.CommunalWidgetModule.Companion.DEFAULT_WIDGETS
import com.android.systemui.dagger.qualifiers.Application
@@ -116,6 +117,10 @@
@Query("UPDATE communal_item_rank_table SET rank = :order WHERE uid = :itemUid")
fun updateItemRank(itemUid: Long, order: Int)
+ @Query("DELETE FROM communal_widget_table") fun clearCommunalWidgetsTable()
+
+ @Query("DELETE FROM communal_item_rank_table") fun clearCommunalItemRankTable()
+
@Transaction
fun updateWidgetOrder(widgetIdToPriorityMap: Map<Int, Int>) {
widgetIdToPriorityMap.forEach { (id, priority) ->
@@ -128,9 +133,18 @@
@Transaction
fun addWidget(widgetId: Int, provider: ComponentName, priority: Int): Long {
- return insertWidget(
+ return addWidget(
widgetId = widgetId,
componentName = provider.flattenToString(),
+ priority = priority,
+ )
+ }
+
+ @Transaction
+ fun addWidget(widgetId: Int, componentName: String, priority: Int): Long {
+ return insertWidget(
+ widgetId = widgetId,
+ componentName = componentName,
itemId = insertItemRank(priority),
)
}
@@ -145,4 +159,13 @@
deleteWidgets(widget)
return true
}
+
+ /** Wipes current database and restores the snapshot represented by [state]. */
+ @Transaction
+ fun restoreCommunalHubState(state: CommunalHubState) {
+ clearCommunalWidgetsTable()
+ clearCommunalItemRankTable()
+
+ state.widgets.forEach { addWidget(it.widgetId, it.componentName, it.rank) }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt
index e395ca9..1f54e70 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt
@@ -16,13 +16,17 @@
package com.android.systemui.communal.data.repository
+import android.app.backup.BackupManager
import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.os.UserHandle
import androidx.annotation.WorkerThread
+import com.android.systemui.communal.data.backup.CommunalBackupUtils
import com.android.systemui.communal.data.db.CommunalItemRank
import com.android.systemui.communal.data.db.CommunalWidgetDao
import com.android.systemui.communal.data.db.CommunalWidgetItem
+import com.android.systemui.communal.nano.CommunalHubState
+import com.android.systemui.communal.proto.toCommunalHubState
import com.android.systemui.communal.shared.model.CommunalWidgetContentModel
import com.android.systemui.communal.widgets.CommunalAppWidgetHost
import com.android.systemui.communal.widgets.CommunalWidgetHost
@@ -69,6 +73,15 @@
* @param widgetIdToPriorityMap mapping of the widget ids to the priority of the widget.
*/
fun updateWidgetOrder(widgetIdToPriorityMap: Map<Int, Int>) {}
+
+ /**
+ * Restores the database by reading a state file from disk and updating the widget ids according
+ * to [oldToNewWidgetIdMap].
+ */
+ fun restoreWidgets(oldToNewWidgetIdMap: Map<Int, Int>)
+
+ /** Aborts the restore process and removes files from disk if necessary. */
+ fun abortRestoreWidgets()
}
@SysUISingleton
@@ -82,6 +95,8 @@
private val communalWidgetHost: CommunalWidgetHost,
private val communalWidgetDao: CommunalWidgetDao,
@CommunalLog logBuffer: LogBuffer,
+ private val backupManager: BackupManager,
+ private val backupUtils: CommunalBackupUtils,
) : CommunalWidgetRepository {
companion object {
const val TAG = "CommunalWidgetRepository"
@@ -143,6 +158,7 @@
provider = provider,
priority = priority,
)
+ backupManager.dataChanged()
} else {
appWidgetHost.deleteAppWidgetId(id)
}
@@ -155,6 +171,7 @@
if (communalWidgetDao.deleteWidgetById(widgetId)) {
appWidgetHost.deleteAppWidgetId(widgetId)
logger.i("Deleted widget with id $widgetId.")
+ backupManager.dataChanged()
}
}
}
@@ -165,6 +182,76 @@
logger.i({ "Updated the order of widget list with ids: $str1." }) {
str1 = widgetIdToPriorityMap.toString()
}
+ backupManager.dataChanged()
+ }
+ }
+
+ override fun restoreWidgets(oldToNewWidgetIdMap: Map<Int, Int>) {
+ bgScope.launch {
+ // Read restored state file from disk
+ val state: CommunalHubState
+ try {
+ state = backupUtils.readBytesFromDisk().toCommunalHubState()
+ } catch (e: Exception) {
+ logger.e({ "Failed reading restore data from disk: $str1" }) {
+ str1 = e.localizedMessage
+ }
+ abortRestoreWidgets()
+ return@launch
+ }
+
+ val widgetsWithHost = appWidgetHost.appWidgetIds.toList()
+ val widgetsToRemove = widgetsWithHost.toMutableList()
+
+ // Produce a new state to be restored, skipping invalid widgets
+ val newWidgets =
+ state.widgets.mapNotNull { restoredWidget ->
+ val newWidgetId =
+ oldToNewWidgetIdMap[restoredWidget.widgetId] ?: restoredWidget.widgetId
+
+ // Skip if widget id is not registered with the host
+ if (!widgetsWithHost.contains(newWidgetId)) {
+ logger.d({
+ "Skipped restoring widget (old:$int1 new:$int2) " +
+ "because it is not registered with host"
+ }) {
+ int1 = restoredWidget.widgetId
+ int2 = newWidgetId
+ }
+ return@mapNotNull null
+ }
+
+ widgetsToRemove.remove(newWidgetId)
+
+ CommunalHubState.CommunalWidgetItem().apply {
+ widgetId = newWidgetId
+ componentName = restoredWidget.componentName
+ rank = restoredWidget.rank
+ }
+ }
+ val newState = CommunalHubState().apply { widgets = newWidgets.toTypedArray() }
+
+ // Restore database
+ logger.i("Restoring communal database $newState")
+ communalWidgetDao.restoreCommunalHubState(newState)
+
+ // Delete restored state file from disk
+ backupUtils.clear()
+
+ // Remove widgets from host that have not been restored
+ widgetsToRemove.forEach { widgetId ->
+ logger.i({ "Deleting widget $int1 from host since it has not been restored" }) {
+ int1 = widgetId
+ }
+ appWidgetHost.deleteAppWidgetId(widgetId)
+ }
+ }
+ }
+
+ override fun abortRestoreWidgets() {
+ bgScope.launch {
+ logger.i("Restore widgets aborted")
+ backupUtils.clear()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
index 619e052..7448e14 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
@@ -170,6 +170,23 @@
}
/**
+ * Repopulates the communal widgets database by first reading a backed-up state from disk and
+ * updating the widget ids indicated by [oldToNewWidgetIdMap]. The backed-up state is removed
+ * from disk afterwards.
+ */
+ fun restoreWidgets(oldToNewWidgetIdMap: Map<Int, Int>) {
+ widgetRepository.restoreWidgets(oldToNewWidgetIdMap)
+ }
+
+ /**
+ * Aborts the task of restoring widgets from a backup. The backed up state stored on disk is
+ * removed.
+ */
+ fun abortRestoreWidgets() {
+ widgetRepository.abortRestoreWidgets()
+ }
+
+ /**
* Updates the transition state of the hub [SceneTransitionLayout].
*
* Note that you must call is with `null` when the UI is done or risk a memory leak.
diff --git a/packages/SystemUI/src/com/android/systemui/communal/proto/CommunalHubStateExt.kt b/packages/SystemUI/src/com/android/systemui/communal/proto/CommunalHubStateExt.kt
new file mode 100644
index 0000000..2d661cd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/proto/CommunalHubStateExt.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.systemui.communal.proto
+
+import com.android.systemui.communal.nano.CommunalHubState
+import com.google.protobuf.nano.InvalidProtocolBufferNanoException
+
+/** Converts a [CommunalHubState] to bytes. */
+fun CommunalHubState.toByteArray(): ByteArray {
+ return CommunalHubState.toByteArray(this)
+}
+
+/**
+ * Converts bytes to a [CommunalHubState].
+ *
+ * @throws InvalidProtocolBufferNanoException if parsing fails.
+ */
+fun ByteArray.toCommunalHubState(): CommunalHubState {
+ return CommunalHubState.parseFrom(this)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/proto/communal_hub_state.proto b/packages/SystemUI/src/com/android/systemui/communal/proto/communal_hub_state.proto
new file mode 100644
index 0000000..0816259
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/proto/communal_hub_state.proto
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+syntax = "proto3";
+
+package com.android.systemui.communal;
+
+option java_multiple_files = true;
+
+// Represents the state of communal hub for backup & restore.
+message CommunalHubState {
+ // Widgets in the communal hub.
+ repeated CommunalWidgetItem widgets = 1;
+
+ // Represents a widget in the communal hub.
+ message CommunalWidgetItem {
+ // Id of the widget.
+ int32 widget_id = 1;
+
+ // Component name of the widget.
+ string component_name = 2;
+
+ // Rank or order of the widget in the communal hub.
+ int32 rank = 3;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalWidgetModule.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalWidgetModule.kt
index 60fb8d4..aa6516d 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalWidgetModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalWidgetModule.kt
@@ -38,7 +38,7 @@
@Module
interface CommunalWidgetModule {
companion object {
- private const val APP_WIDGET_HOST_ID = 116
+ const val APP_WIDGET_HOST_ID = 116
const val DEFAULT_WIDGETS = "default_widgets"
@SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
index 00a8259..3e98fc1 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
@@ -23,6 +23,7 @@
import android.hardware.SensorPrivacyManager;
import com.android.keyguard.KeyguardViewController;
+import com.android.systemui.CoreStartable;
import com.android.systemui.ScreenDecorationsModule;
import com.android.systemui.accessibility.SystemActionsModule;
import com.android.systemui.battery.BatterySaverModule;
@@ -50,12 +51,15 @@
import com.android.systemui.settings.MultiUserUtilsModule;
import com.android.systemui.shade.NotificationShadeWindowControllerImpl;
import com.android.systemui.shade.ShadeModule;
+import com.android.systemui.startable.Dependencies;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.KeyboardShortcutsModule;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
import com.android.systemui.statusbar.NotificationShadeWindowController;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.dagger.StartCentralSurfacesModule;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.DozeServiceHost;
import com.android.systemui.statusbar.phone.HeadsUpModule;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -77,6 +81,10 @@
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
+import dagger.multibindings.ClassKey;
+import dagger.multibindings.IntoMap;
+
+import java.util.Set;
import javax.inject.Named;
@@ -199,4 +207,13 @@
@Binds
abstract DozeHost provideDozeHost(DozeServiceHost dozeServiceHost);
+
+ /** */
+ @Provides
+ @IntoMap
+ @Dependencies
+ @ClassKey(SysuiStatusBarStateController.class)
+ static Set<Class<? extends CoreStartable>> providesStatusBarStateControllerDeps() {
+ return Set.of(CentralSurfaces.class);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index 871ef1e..1dd3722 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -94,7 +94,7 @@
Builder setTaskViewFactory(Optional<TaskViewFactory> t);
@BindsInstance
- Builder setTransitions(ShellTransitions t);
+ Builder setShellTransitions(ShellTransitions t);
@BindsInstance
Builder setKeyguardTransitions(KeyguardTransitions k);
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt
index 23fc8ac..593196c 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt
@@ -25,6 +25,7 @@
import com.android.systemui.biometrics.BiometricNotificationService
import com.android.systemui.clipboardoverlay.ClipboardListener
import com.android.systemui.communal.CommunalDreamStartable
+import com.android.systemui.communal.CommunalBackupRestoreStartable
import com.android.systemui.communal.CommunalSceneStartable
import com.android.systemui.communal.log.CommunalLoggerStartable
import com.android.systemui.communal.widgets.CommunalAppWidgetHostStartable
@@ -342,6 +343,13 @@
@Binds
@IntoMap
+ @ClassKey(CommunalBackupRestoreStartable::class)
+ abstract fun bindCommunalBackupRestoreStartable(
+ impl: CommunalBackupRestoreStartable
+ ): CoreStartable
+
+ @Binds
+ @IntoMap
@ClassKey(HomeControlsDreamStartable::class)
abstract fun bindHomeControlsDreamStartable(impl: HomeControlsDreamStartable): CoreStartable
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index 93864799..3462164 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -18,6 +18,7 @@
import android.app.INotificationManager;
import android.app.Service;
+import android.app.backup.BackupManager;
import android.content.Context;
import android.service.dreams.IDreamManager;
@@ -318,6 +319,13 @@
return new Monitor(executor, Collections.singleton(systemProcessCondition), logBuffer);
}
+ /** Provides the package name for SystemUI. */
+ @SysUISingleton
+ @Provides
+ static BackupManager provideBackupManager(@Application Context context) {
+ return new BackupManager(context);
+ }
+
@BindsOptionalOf
abstract CommandQueue optionalCommandQueue();
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
index e04a0e5..a3cdb2e 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
@@ -94,7 +94,7 @@
Optional<TaskViewFactory> getTaskViewFactory();
@WMSingleton
- ShellTransitions getTransitions();
+ ShellTransitions getShellTransitions();
@WMSingleton
KeyguardTransitions getKeyguardTransitions();
diff --git a/packages/SystemUI/src/com/android/systemui/demomode/DemoMode.java b/packages/SystemUI/src/com/android/systemui/demomode/DemoMode.java
index 672ade2..3021184 100644
--- a/packages/SystemUI/src/com/android/systemui/demomode/DemoMode.java
+++ b/packages/SystemUI/src/com/android/systemui/demomode/DemoMode.java
@@ -37,6 +37,15 @@
return NO_COMMANDS;
}
+ /** Something simple enough to be recognizable in dumpsys logs */
+ default String logName() {
+ if (this.getClass().isAnonymousClass()) {
+ return getClass().getName();
+ } else {
+ return getClass().getSimpleName();
+ }
+ }
+
String ACTION_DEMO = "com.android.systemui.demo";
String EXTRA_COMMAND = "command";
diff --git a/packages/SystemUI/src/com/android/systemui/demomode/DemoModeController.kt b/packages/SystemUI/src/com/android/systemui/demomode/DemoModeController.kt
index 45ff963..f03aa63 100644
--- a/packages/SystemUI/src/com/android/systemui/demomode/DemoModeController.kt
+++ b/packages/SystemUI/src/com/android/systemui/demomode/DemoModeController.kt
@@ -25,12 +25,12 @@
import android.util.Log
import com.android.systemui.Dumpable
import com.android.systemui.broadcast.BroadcastDispatcher
-import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.demomode.DemoMode.ACTION_DEMO
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.util.Assert
import com.android.systemui.util.settings.GlobalSettings
+import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import java.io.PrintWriter
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
@@ -209,20 +209,18 @@
pw.println("DemoModeController state -")
pw.println(" isInDemoMode=$isInDemoMode")
pw.println(" isDemoModeAllowed=$isAvailable")
- pw.print(" receivers=[")
- val copy: List<DemoModeCommandReceiver>
+ val copy: List<DemoMode>
synchronized(this) { copy = receivers.toList() }
- copy.forEach { recv -> pw.print(" ${recv.javaClass.simpleName}") }
- pw.println(" ]")
+
+ // List of all receivers
+ pw.println(" receivers=[${copy.joinToString(", ") { it.logName() }}]")
+
+ // Print out the map of COMMAND -> list of receivers for that command
pw.println(" receiverMap= [")
- receiverMap.keys.forEach { command ->
- pw.print(" $command : [")
- val recvs =
- receiverMap[command]!!
- .map { receiver -> receiver.javaClass.simpleName }
- .joinToString(",")
- pw.println("$recvs ]")
+ receiverMap.entries.forEach { (comm, recv) ->
+ pw.println(" $comm : [${recv.joinToString(", ") {it.logName()}}]")
}
+ pw.println(" ]")
}
private val tracker =
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractor.kt
index 7733de4..a32b2aa 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractor.kt
@@ -68,6 +68,7 @@
fun onPrimaryBouncerUserInput()
fun onAccessibilityAction()
fun onWalletLaunched()
+ fun onDeviceUnfolded()
/** Whether face auth is considered class 3 */
fun isFaceAuthStrong(): Boolean
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/NoopDeviceEntryFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/NoopDeviceEntryFaceAuthInteractor.kt
index 65f3eb7..6629f6e 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/NoopDeviceEntryFaceAuthInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/NoopDeviceEntryFaceAuthInteractor.kt
@@ -66,4 +66,5 @@
override fun onPrimaryBouncerUserInput() {}
override fun onAccessibilityAction() {}
override fun onWalletLaunched() = Unit
+ override fun onDeviceUnfolded() {}
}
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/SystemUIDeviceEntryFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/SystemUIDeviceEntryFaceAuthInteractor.kt
index 03819ed..6c6683a 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/SystemUIDeviceEntryFaceAuthInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/SystemUIDeviceEntryFaceAuthInteractor.kt
@@ -37,6 +37,7 @@
import com.android.systemui.deviceentry.shared.model.FaceAuthenticationStatus
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.DevicePosture
import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING
import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
@@ -248,6 +249,12 @@
}
}
+ override fun onDeviceUnfolded() {
+ if (facePropertyRepository.supportedPostures.contains(DevicePosture.OPENED)) {
+ runFaceAuth(FaceAuthUiEvent.FACE_AUTH_UPDATED_POSTURE_CHANGED, true)
+ }
+ }
+
override fun registerListener(listener: FaceAuthenticationListener) {
listeners.add(listener)
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
index 5a036b1..0c2709e 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
@@ -22,6 +22,7 @@
import static com.android.systemui.complication.ComplicationLayoutParams.POSITION_BOTTOM;
import static com.android.systemui.complication.ComplicationLayoutParams.POSITION_TOP;
import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
+import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;
import android.animation.Animator;
import android.content.res.Resources;
@@ -40,6 +41,8 @@
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
import com.android.systemui.dreams.dagger.DreamOverlayModule;
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
+import com.android.systemui.keyguard.shared.model.KeyguardState;
import com.android.systemui.res.R;
import com.android.systemui.shade.ShadeExpansionChangeEvent;
import com.android.systemui.statusbar.BlurUtils;
@@ -50,6 +53,8 @@
import javax.inject.Inject;
import javax.inject.Named;
+import kotlinx.coroutines.CoroutineDispatcher;
+
/**
* View controller for {@link DreamOverlayContainerView}.
*/
@@ -62,6 +67,7 @@
private final DreamOverlayAnimationsController mDreamOverlayAnimationsController;
private final DreamOverlayStateController mStateController;
private final LowLightTransitionCoordinator mLowLightTransitionCoordinator;
+ private final KeyguardTransitionInteractor mKeyguardTransitionInteractor;
private final ComplicationHostViewController mComplicationHostViewController;
@@ -81,6 +87,7 @@
// Main thread handler used to schedule periodic tasks (e.g. burn-in protection updates).
private final Handler mHandler;
+ private final CoroutineDispatcher mMainDispatcher;
private final int mDreamOverlayMaxTranslationY;
private final PrimaryBouncerCallbackInteractor mPrimaryBouncerCallbackInteractor;
@@ -88,6 +95,7 @@
private boolean mBouncerAnimating;
private boolean mWakingUpFromSwipe;
+ private boolean mAnyBouncerShowing;
private final BouncerlessScrimController mBouncerlessScrimController;
@@ -170,6 +178,7 @@
LowLightTransitionCoordinator lowLightTransitionCoordinator,
BlurUtils blurUtils,
@Main Handler handler,
+ @Main CoroutineDispatcher mainDispatcher,
@Main Resources resources,
@Named(DreamOverlayModule.MAX_BURN_IN_OFFSET) int maxBurnInOffset,
@Named(DreamOverlayModule.BURN_IN_PROTECTION_UPDATE_INTERVAL) long
@@ -178,7 +187,8 @@
PrimaryBouncerCallbackInteractor primaryBouncerCallbackInteractor,
DreamOverlayAnimationsController animationsController,
DreamOverlayStateController stateController,
- BouncerlessScrimController bouncerlessScrimController) {
+ BouncerlessScrimController bouncerlessScrimController,
+ KeyguardTransitionInteractor keyguardTransitionInteractor) {
super(containerView);
mDreamOverlayContentView = contentView;
mStatusBarViewController = statusBarViewController;
@@ -190,6 +200,8 @@
mBouncerlessScrimController = bouncerlessScrimController;
mBouncerlessScrimController.addCallback(mBouncerlessExpansionCallback);
+ mKeyguardTransitionInteractor = keyguardTransitionInteractor;
+
mComplicationHostViewController = complicationHostViewController;
mDreamOverlayMaxTranslationY = resources.getDimensionPixelSize(
R.dimen.dream_overlay_y_offset);
@@ -200,6 +212,7 @@
ViewGroup.LayoutParams.MATCH_PARENT));
mHandler = handler;
+ mMainDispatcher = mainDispatcher;
mMaxBurnInOffset = maxBurnInOffset;
mBurnInProtectionUpdateInterval = burnInProtectionUpdateInterval;
mMillisUntilFullJitter = millisUntilFullJitter;
@@ -225,6 +238,12 @@
mView.getRootSurfaceControl().setTouchableRegion(emptyRegion);
emptyRegion.recycle();
+ collectFlow(
+ mView,
+ mKeyguardTransitionInteractor.isFinishedInStateWhere(KeyguardState::isBouncerState),
+ isFinished -> mAnyBouncerShowing = isFinished,
+ mMainDispatcher);
+
// Start dream entry animations. Skip animations for low light clock.
if (!mStateController.isLowLightActive()) {
// If this is transitioning from the low light dream to the user dream, the overlay
@@ -246,6 +265,10 @@
return mView;
}
+ boolean isBouncerShowing() {
+ return mAnyBouncerShowing;
+ }
+
private void updateBurnInOffsets() {
// Make sure the offset starts at zero, to avoid a big jump in the overlay when it first
// appears.
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
index 1135afe..a9ef531 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
@@ -19,9 +19,11 @@
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_OVERLAY_WINDOW_TITLE;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_TOUCH_INSET_MANAGER;
import static com.android.systemui.dreams.dagger.DreamModule.HOME_CONTROL_PANEL_DREAM_COMPONENT;
+import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.util.Log;
import android.view.View;
@@ -34,7 +36,10 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
+import androidx.lifecycle.LifecycleService;
+import androidx.lifecycle.ServiceLifecycleDispatcher;
import androidx.lifecycle.ViewModelStore;
import com.android.dream.lowlight.dagger.LowLightDreamModule;
@@ -45,15 +50,21 @@
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.ambient.touch.TouchMonitor;
import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent;
+import com.android.systemui.ambient.touch.scrim.ScrimManager;
+import com.android.systemui.communal.domain.interactor.CommunalInteractor;
+import com.android.systemui.communal.shared.model.CommunalScenes;
import com.android.systemui.complication.Complication;
import com.android.systemui.complication.dagger.ComplicationComponent;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
+import com.android.systemui.shade.ShadeExpansionChangeEvent;
import com.android.systemui.touch.TouchInsetManager;
import com.android.systemui.util.concurrency.DelayableExecutor;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.function.Consumer;
import javax.inject.Inject;
import javax.inject.Named;
@@ -63,7 +74,8 @@
* dream reaches directly out to the service with a Window reference (via LayoutParams), which the
* service uses to insert its own child Window into the dream's parent Window.
*/
-public class DreamOverlayService extends android.service.dreams.DreamOverlayService {
+public class DreamOverlayService extends android.service.dreams.DreamOverlayService implements
+ LifecycleOwner {
private static final String TAG = "DreamOverlayService";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -76,6 +88,7 @@
private DreamOverlayContainerViewController mDreamOverlayContainerViewController;
private final DreamOverlayCallbackController mDreamOverlayCallbackController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ private final ScrimManager mScrimManager;
@Nullable
private final ComponentName mLowLightDreamComponent;
@Nullable
@@ -93,6 +106,21 @@
// True if the service has been destroyed.
private boolean mDestroyed = false;
+ /**
+ * True if the notification shade is open.
+ */
+ private boolean mShadeExpanded = false;
+
+ /**
+ * True if any part of the glanceable hub is visible.
+ */
+ private boolean mCommunalVisible = false;
+
+ /**
+ * True if the primary bouncer is visible.
+ */
+ private boolean mBouncerShowing = false;
+
private final ComplicationComponent mComplicationComponent;
private final AmbientTouchComponent mAmbientTouchComponent;
@@ -102,27 +130,72 @@
private final DreamOverlayComponent mDreamOverlayComponent;
- private final DreamOverlayLifecycleOwner mLifecycleOwner;
+ /**
+ * This {@link LifecycleRegistry} controls when dream overlay functionality, like touch
+ * handling, should be active. It will automatically be paused when the dream overlay is hidden
+ * while dreaming, such as when the notification shade, bouncer, or glanceable hub are visible.
+ */
private final LifecycleRegistry mLifecycleRegistry;
+ /**
+ * Drives the lifecycle exposed by this service's {@link #getLifecycle()}.
+ * <p>
+ * Used to mimic a {@link LifecycleService}, though we do not update the lifecycle in
+ * {@link #onBind(Intent)} since it's final in the base class.
+ */
+ private final ServiceLifecycleDispatcher mDispatcher = new ServiceLifecycleDispatcher(this);
+
private TouchMonitor mTouchMonitor;
+ private final CommunalInteractor mCommunalInteractor;
+
+ private final SystemDialogsCloser mSystemDialogsCloser;
+
private final KeyguardUpdateMonitorCallback mKeyguardCallback =
new KeyguardUpdateMonitorCallback() {
@Override
public void onShadeExpandedChanged(boolean expanded) {
mExecutor.execute(() -> {
- if (getCurrentStateLocked() != Lifecycle.State.RESUMED
- && getCurrentStateLocked() != Lifecycle.State.STARTED) {
+ if (mShadeExpanded == expanded) {
return;
}
+ mShadeExpanded = expanded;
- setCurrentStateLocked(
- expanded ? Lifecycle.State.STARTED : Lifecycle.State.RESUMED);
+ updateLifecycleStateLocked();
});
}
};
+ private final Consumer<Boolean> mCommunalVisibleConsumer = new Consumer<>() {
+ @Override
+ public void accept(Boolean communalVisible) {
+ mExecutor.execute(() -> {
+ if (mCommunalVisible == communalVisible) {
+ return;
+ }
+
+ mCommunalVisible = communalVisible;
+
+ updateLifecycleStateLocked();
+ });
+ }
+ };
+
+ private final Consumer<Boolean> mBouncerShowingConsumer = new Consumer<>() {
+ @Override
+ public void accept(Boolean bouncerShowing) {
+ mExecutor.execute(() -> {
+ if (mBouncerShowing == bouncerShowing) {
+ return;
+ }
+
+ mBouncerShowing = bouncerShowing;
+
+ updateLifecycleStateLocked();
+ });
+ }
+ };
+
private final DreamOverlayStateController.Callback mExitAnimationFinishedCallback =
new DreamOverlayStateController.Callback() {
@Override
@@ -168,19 +241,24 @@
AmbientTouchComponent.Factory ambientTouchComponentFactory,
DreamOverlayStateController stateController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
+ ScrimManager scrimManager,
+ CommunalInteractor communalInteractor,
+ SystemDialogsCloser systemDialogsCloser,
UiEventLogger uiEventLogger,
@Named(DREAM_TOUCH_INSET_MANAGER) TouchInsetManager touchInsetManager,
@Nullable @Named(LowLightDreamModule.LOW_LIGHT_DREAM_COMPONENT)
- ComponentName lowLightDreamComponent,
+ ComponentName lowLightDreamComponent,
@Nullable @Named(HOME_CONTROL_PANEL_DREAM_COMPONENT)
- ComponentName homeControlPanelDreamComponent,
+ ComponentName homeControlPanelDreamComponent,
DreamOverlayCallbackController dreamOverlayCallbackController,
+ KeyguardInteractor keyguardInteractor,
@Named(DREAM_OVERLAY_WINDOW_TITLE) String windowTitle) {
super(executor);
mContext = context;
mExecutor = executor;
mWindowManager = windowManager;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
+ mScrimManager = scrimManager;
mLowLightDreamComponent = lowLightDreamComponent;
mHomeControlPanelDreamComponent = homeControlPanelDreamComponent;
mKeyguardUpdateMonitor.registerCallback(mKeyguardCallback);
@@ -188,6 +266,8 @@
mUiEventLogger = uiEventLogger;
mDreamOverlayCallbackController = dreamOverlayCallbackController;
mWindowTitle = windowTitle;
+ mCommunalInteractor = communalInteractor;
+ mSystemDialogsCloser = systemDialogsCloser;
final ViewModelStore viewModelStore = new ViewModelStore();
final Complication.Host host =
@@ -203,10 +283,32 @@
new HashSet<>(Arrays.asList(
mDreamComplicationComponent.getHideComplicationTouchHandler(),
mDreamOverlayComponent.getCommunalTouchHandler())));
- mLifecycleOwner = lifecycleOwner;
- mLifecycleRegistry = mLifecycleOwner.getRegistry();
+ mLifecycleRegistry = lifecycleOwner.getRegistry();
- mExecutor.execute(() -> setCurrentStateLocked(Lifecycle.State.CREATED));
+ mExecutor.execute(() -> setLifecycleStateLocked(Lifecycle.State.CREATED));
+
+ collectFlow(getLifecycle(), communalInteractor.isCommunalVisible(),
+ mCommunalVisibleConsumer);
+ collectFlow(getLifecycle(), keyguardInteractor.primaryBouncerShowing,
+ mBouncerShowingConsumer);
+ }
+
+ @NonNull
+ @Override
+ public Lifecycle getLifecycle() {
+ return mDispatcher.getLifecycle();
+ }
+
+ @Override
+ public void onCreate() {
+ mDispatcher.onServicePreSuperOnCreate();
+ super.onCreate();
+ }
+
+ @Override
+ public void onStart(Intent intent, int startId) {
+ mDispatcher.onServicePreSuperOnStart();
+ super.onStart(intent, startId);
}
@Override
@@ -214,19 +316,20 @@
mKeyguardUpdateMonitor.removeCallback(mKeyguardCallback);
mExecutor.execute(() -> {
- setCurrentStateLocked(Lifecycle.State.DESTROYED);
+ setLifecycleStateLocked(Lifecycle.State.DESTROYED);
resetCurrentDreamOverlayLocked();
mDestroyed = true;
});
+ mDispatcher.onServicePreSuperOnDestroy();
super.onDestroy();
}
@Override
public void onStartDream(@NonNull WindowManager.LayoutParams layoutParams) {
- setCurrentStateLocked(Lifecycle.State.STARTED);
+ setLifecycleStateLocked(Lifecycle.State.STARTED);
mUiEventLogger.log(DreamOverlayEvent.DREAM_OVERLAY_ENTER_START);
@@ -256,7 +359,7 @@
return;
}
- setCurrentStateLocked(Lifecycle.State.RESUMED);
+ setLifecycleStateLocked(Lifecycle.State.RESUMED);
mStateController.setOverlayActive(true);
final ComponentName dreamComponent = getDreamComponent();
mStateController.setLowLightActive(
@@ -276,14 +379,27 @@
resetCurrentDreamOverlayLocked();
}
- private Lifecycle.State getCurrentStateLocked() {
+ private Lifecycle.State getLifecycleStateLocked() {
return mLifecycleRegistry.getCurrentState();
}
- private void setCurrentStateLocked(Lifecycle.State state) {
+ private void setLifecycleStateLocked(Lifecycle.State state) {
mLifecycleRegistry.setCurrentState(state);
}
+ private void updateLifecycleStateLocked() {
+ if (getLifecycleStateLocked() != Lifecycle.State.RESUMED
+ && getLifecycleStateLocked() != Lifecycle.State.STARTED) {
+ return;
+ }
+
+ // If anything is on top of the dream, we should stop touch handling.
+ boolean shouldPause = mShadeExpanded || mCommunalVisible || mBouncerShowing;
+
+ setLifecycleStateLocked(
+ shouldPause ? Lifecycle.State.STARTED : Lifecycle.State.RESUMED);
+ }
+
@Override
public void onWakeUp() {
if (mDreamOverlayContainerViewController != null) {
@@ -292,6 +408,28 @@
}
}
+ @Override
+ public void onComeToFront() {
+ // Make sure the bouncer is closed. Expanding the shade effectively contracts the bouncer
+ // an equal amount.
+ if (mDreamOverlayContainerViewController != null
+ && mDreamOverlayContainerViewController.isBouncerShowing()) {
+ mScrimManager.getCurrentController().expand(
+ new ShadeExpansionChangeEvent(
+ /* fraction= */ 1.f,
+ /* expanded= */ false,
+ /* tracking= */ true));
+ }
+
+ // closeSystemDialogs takes care of closing anything that responds to the
+ // {@link Intent.ACTION_CLOSE_SYSTEM_DIALOGS} broadcast (which includes the notification
+ // shade).
+ mSystemDialogsCloser.closeSystemDialogs();
+
+ // Hide glanceable hub (this is a nop if glanceable hub is not open).
+ mCommunalInteractor.changeScene(CommunalScenes.Blank, null);
+ }
+
/**
* Inserts {@link Window} to host the dream overlay into the dream's parent window. Must be
* called from the main executing thread. The window attributes closely mirror those that are
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/src/com/android/systemui/dreams/SystemDialogsCloser.java
similarity index 71%
copy from packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
copy to packages/SystemUI/src/com/android/systemui/dreams/SystemDialogsCloser.java
index c4476fc..6e7239a4 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
+++ b/packages/SystemUI/src/com/android/systemui/dreams/SystemDialogsCloser.java
@@ -14,11 +14,10 @@
* limitations under the License.
*/
-package com.android.systemui.volume.panel.component.mediaoutput.shared.model
+package com.android.systemui.dreams;
-import android.media.session.PlaybackState
-
-data class SessionWithPlayback(
- val session: MediaDeviceSession,
- val playback: PlaybackState,
-)
+/** Defines an interface for a class that is responsible for closing system dialogs. */
+public interface SystemDialogsCloser {
+ /** Close any open system dialogs. */
+ void closeSystemDialogs();
+}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java
index 31710ac..516b8c5 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java
@@ -31,6 +31,7 @@
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.DreamOverlayNotificationCountProvider;
import com.android.systemui.dreams.DreamOverlayService;
+import com.android.systemui.dreams.SystemDialogsCloser;
import com.android.systemui.dreams.complication.dagger.ComplicationComponent;
import com.android.systemui.dreams.homecontrols.DreamActivityProvider;
import com.android.systemui.dreams.homecontrols.DreamActivityProviderImpl;
@@ -146,6 +147,15 @@
return Optional.empty();
}
+ /**
+ * Provides an implementation for {@link SystemDialogsCloser} that calls
+ * {@link Context.closeSystemDialogs}.
+ */
+ @Provides
+ static SystemDialogsCloser providesSystemDialogsCloser(Context context) {
+ return () -> context.closeSystemDialogs();
+ }
+
/** */
@Provides
@Named(DREAM_ONLY_ENABLED_FOR_DOCK_USER)
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java
index 1c047dd..fff0c58 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java
@@ -98,7 +98,7 @@
// Notification shade window has its own logic to be visible if the hub is open, no need to
// do anything here other than send touch events over.
session.registerInputListener(ev -> {
- surfaces.handleDreamTouch((MotionEvent) ev);
+ surfaces.handleExternalShadeWindowTouch((MotionEvent) ev);
if (ev != null && ((MotionEvent) ev).getAction() == MotionEvent.ACTION_UP) {
var unused = session.pop();
}
diff --git a/packages/SystemUI/src/com/android/systemui/graphics/ImageLoader.kt b/packages/SystemUI/src/com/android/systemui/graphics/ImageLoader.kt
index 2856011..567bf70 100644
--- a/packages/SystemUI/src/com/android/systemui/graphics/ImageLoader.kt
+++ b/packages/SystemUI/src/com/android/systemui/graphics/ImageLoader.kt
@@ -339,7 +339,7 @@
}
// Fallback to non-ImageDecoder load if the attempt failed (e.g. the resource
// is a Vector drawable which ImageDecoder doesn't support.)
- ?: icon.loadDrawable(context)
+ ?: loadIconDrawable(icon, context)
}
Icon.TYPE_BITMAP -> {
BitmapDrawable(context.resources, icon.bitmap)
@@ -357,7 +357,7 @@
}
else -> {
// We don't recognize this icon, just fallback.
- icon.loadDrawable(context)
+ loadIconDrawable(icon, context)
}
}?.let { drawable ->
// Icons carry tint which we need to propagate down to a Drawable.
@@ -366,6 +366,14 @@
}
}
+ @WorkerThread
+ fun loadIconDrawable(icon: Icon, context: Context): Drawable? {
+ icon.loadDrawable(context)?.let { return it }
+
+ Log.w(TAG, "Failed to load drawable for $icon")
+ return null
+ }
+
/**
* Obtains the image size from the image header, without decoding the full image.
*
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/HapticSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/HapticSliderViewBinder.kt
index 304fdd6..ca6c8da 100644
--- a/packages/SystemUI/src/com/android/systemui/haptics/slider/HapticSliderViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/HapticSliderViewBinder.kt
@@ -23,11 +23,11 @@
object HapticSliderViewBinder {
/**
- * Binds a [SeekableSliderHapticPlugin] to a [View]. The binded view should be a
+ * Binds a [SeekbarHapticPlugin] to a [View]. The binded view should be a
* [android.widget.SeekBar] or a container of a [android.widget.SeekBar]
*/
@JvmStatic
- fun bind(view: View?, plugin: SeekableSliderHapticPlugin) {
+ fun bind(view: View?, plugin: SeekbarHapticPlugin) {
view?.repeatWhenAttached {
plugin.startInScope(lifecycleScope)
try {
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderEventProducer.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderEventProducer.kt
deleted file mode 100644
index cfa5294..0000000
--- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderEventProducer.kt
+++ /dev/null
@@ -1,75 +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.haptics.slider
-
-import android.widget.SeekBar
-import android.widget.SeekBar.OnSeekBarChangeListener
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.update
-
-/** An event producer for a Seekable element such as the Android [SeekBar] */
-class SeekableSliderEventProducer : SliderEventProducer, OnSeekBarChangeListener {
-
- /** The current event reported by a SeekBar */
- private val _currentEvent = MutableStateFlow(SliderEvent(SliderEventType.NOTHING, 0f))
-
- override fun produceEvents(): Flow<SliderEvent> = _currentEvent.asStateFlow()
-
- override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
- val eventType =
- if (fromUser) SliderEventType.PROGRESS_CHANGE_BY_USER
- else SliderEventType.PROGRESS_CHANGE_BY_PROGRAM
-
- _currentEvent.value = SliderEvent(eventType, normalizeProgress(seekBar, progress))
- }
-
- /**
- * Normalize the integer progress of a SeekBar to the range from 0F to 1F.
- *
- * @param[seekBar] The SeekBar that reports a progress.
- * @param[progress] The integer progress of the SeekBar within its min and max values.
- * @return The progress in the range from 0F to 1F.
- */
- private fun normalizeProgress(seekBar: SeekBar, progress: Int): Float {
- if (seekBar.max == seekBar.min) {
- return 1.0f
- }
- val range = seekBar.max - seekBar.min
- return (progress - seekBar.min) / range.toFloat()
- }
-
- override fun onStartTrackingTouch(seekBar: SeekBar) {
- _currentEvent.update { previousEvent ->
- SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, previousEvent.currentProgress)
- }
- }
-
- override fun onStopTrackingTouch(seekBar: SeekBar) {
- _currentEvent.update { previousEvent ->
- SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, previousEvent.currentProgress)
- }
- }
-
- /** The arrow navigation that was operating the slider has stopped. */
- fun onArrowUp() {
- _currentEvent.update { previousEvent ->
- SliderEvent(SliderEventType.ARROW_UP, previousEvent.currentProgress)
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderHapticPlugin.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt
similarity index 72%
rename from packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderHapticPlugin.kt
rename to packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt
index ed82278..2007db34 100644
--- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderHapticPlugin.kt
+++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt
@@ -30,12 +30,12 @@
/**
* A plugin added to a manager of a [android.widget.SeekBar] that adds dynamic haptic feedback.
*
- * A [SeekableSliderEventProducer] is used as the producer of slider events, a
+ * A [SliderStateProducer] is used as the producer of slider events, a
* [SliderHapticFeedbackProvider] is used as the listener of slider states to play haptic feedback
- * depending on the state, and a [SeekableSliderTracker] is used as the state machine handler that
+ * depending on the state, and a [SliderStateTracker] is used as the state machine handler that
* tracks and manipulates the slider state.
*/
-class SeekableSliderHapticPlugin
+class SeekbarHapticPlugin
@JvmOverloads
constructor(
vibratorHelper: VibratorHelper,
@@ -46,7 +46,7 @@
private val velocityTracker = VelocityTracker.obtain()
- private val sliderEventProducer = SeekableSliderEventProducer()
+ private val sliderEventProducer = SliderStateProducer()
private val sliderHapticFeedbackProvider =
SliderHapticFeedbackProvider(
@@ -56,7 +56,7 @@
systemClock,
)
- private var sliderTracker: SeekableSliderTracker? = null
+ private var sliderTracker: SliderStateTracker? = null
private var pluginScope: CoroutineScope? = null
@@ -86,7 +86,7 @@
fun startInScope(scope: CoroutineScope) {
if (sliderTracker != null) stop()
sliderTracker =
- SeekableSliderTracker(
+ SliderStateTracker(
sliderHapticFeedbackProvider,
sliderEventProducer,
scope,
@@ -116,28 +116,52 @@
/** onStartTrackingTouch event from the slider's [android.widget.SeekBar] */
fun onStartTrackingTouch(seekBar: SeekBar) {
if (isTracking) {
- sliderEventProducer.onStartTrackingTouch(seekBar)
+ sliderEventProducer.onStartTracking(true)
}
}
/** onProgressChanged event from the slider's [android.widget.SeekBar] */
fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (isTracking) {
- sliderEventProducer.onProgressChanged(seekBar, progress, fromUser)
+ if (sliderTracker?.currentState == SliderState.IDLE && !fromUser) {
+ // This case translates to the slider starting to track program changes
+ sliderEventProducer.resetWithProgress(normalizeProgress(seekBar, progress))
+ sliderEventProducer.onStartTracking(false)
+ } else {
+ sliderEventProducer.onProgressChanged(
+ fromUser,
+ normalizeProgress(seekBar, progress),
+ )
+ }
}
}
+ /**
+ * Normalize the integer progress of a SeekBar to the range from 0F to 1F.
+ *
+ * @param[seekBar] The SeekBar that reports a progress.
+ * @param[progress] The integer progress of the SeekBar within its min and max values.
+ * @return The progress in the range from 0F to 1F.
+ */
+ private fun normalizeProgress(seekBar: SeekBar, progress: Int): Float {
+ if (seekBar.max == seekBar.min) {
+ return 1.0f
+ }
+ val range = seekBar.max - seekBar.min
+ return (progress - seekBar.min) / range.toFloat()
+ }
+
/** onStopTrackingTouch event from the slider's [android.widget.SeekBar] */
fun onStopTrackingTouch(seekBar: SeekBar) {
if (isTracking) {
- sliderEventProducer.onStopTrackingTouch(seekBar)
+ sliderEventProducer.onStopTracking(true)
}
}
- /** onArrowUp event recorded */
- fun onArrowUp() {
+ /** Programmatic changes have stopped */
+ private fun onStoppedTrackingProgram() {
if (isTracking) {
- sliderEventProducer.onArrowUp()
+ sliderEventProducer.onStopTracking(false)
}
}
@@ -146,7 +170,7 @@
*
* This event is used to estimate the key-up event based on a running a timer as a waiting
* coroutine in the [pluginScope]. A key-up event in a slider corresponds to an onArrowUp event.
- * Therefore, [onArrowUp] must be called after the timeout.
+ * Therefore, [onStoppedTrackingProgram] must be called after the timeout.
*/
fun onKeyDown() {
if (!isTracking) return
@@ -158,7 +182,7 @@
keyUpJob =
pluginScope?.launch {
delay(KEY_UP_TIMEOUT)
- onArrowUp()
+ onStoppedTrackingProgram()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderEventType.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderEventType.kt
index 4a63941..0edef99 100644
--- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderEventType.kt
+++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderEventType.kt
@@ -22,6 +22,8 @@
NOTHING,
/* The slider has captured a touch input and is tracking touch events. */
STARTED_TRACKING_TOUCH,
+ /* The slider started tracking programmatic value changes */
+ STARTED_TRACKING_PROGRAM,
/* The slider progress is changing due to user touch input. */
PROGRESS_CHANGE_BY_USER,
/* The slider progress is changing programmatically. */
@@ -29,5 +31,5 @@
/* The slider has stopped tracking touch events. */
STOPPED_TRACKING_TOUCH,
/* The external (not touch) stimulus that was modifying the slider progress has stopped. */
- ARROW_UP,
+ STOPPED_TRACKING_PROGRAM,
}
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateProducer.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateProducer.kt
new file mode 100644
index 0000000..1124ab1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateProducer.kt
@@ -0,0 +1,62 @@
+/*
+ * 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.haptics.slider
+
+import androidx.annotation.FloatRange
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.update
+
+/** A stateful producer of [SliderEvent] */
+class SliderStateProducer : SliderEventProducer {
+
+ /** The current event of a slider */
+ private val _currentEvent = MutableStateFlow(SliderEvent(SliderEventType.NOTHING, 0f))
+
+ override fun produceEvents(): Flow<SliderEvent> = _currentEvent.asStateFlow()
+
+ fun onProgressChanged(fromUser: Boolean, @FloatRange(from = 0.0, to = 1.0) progress: Float) {
+ val eventType =
+ if (fromUser) SliderEventType.PROGRESS_CHANGE_BY_USER
+ else SliderEventType.PROGRESS_CHANGE_BY_PROGRAM
+
+ _currentEvent.value = SliderEvent(eventType, progress)
+ }
+
+ fun onStartTracking(fromUser: Boolean) {
+ val eventType =
+ if (fromUser) SliderEventType.STARTED_TRACKING_TOUCH
+ else SliderEventType.STARTED_TRACKING_PROGRAM
+ _currentEvent.update { previousEvent ->
+ SliderEvent(eventType, previousEvent.currentProgress)
+ }
+ }
+
+ fun onStopTracking(fromUser: Boolean) {
+ val eventType =
+ if (fromUser) SliderEventType.STOPPED_TRACKING_TOUCH
+ else SliderEventType.STOPPED_TRACKING_PROGRAM
+ _currentEvent.update { previousEvent ->
+ SliderEvent(eventType, previousEvent.currentProgress)
+ }
+ }
+
+ fun resetWithProgress(@FloatRange(from = 0.0, to = 1.0) progress: Float) {
+ _currentEvent.value = SliderEvent(SliderEventType.NOTHING, progress)
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderTracker.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt
similarity index 94%
rename from packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderTracker.kt
rename to packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt
index 0af3038..14cf411 100644
--- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderTracker.kt
+++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt
@@ -25,11 +25,12 @@
import kotlinx.coroutines.launch
/**
- * Slider tracker attached to a seekable slider.
+ * Slider tracker attached to a slider.
*
- * The tracker runs a state machine to execute actions on touch-based events typical of a seekable
- * slider such as [android.widget.SeekBar]. Coroutines responsible for running the state machine,
- * collecting slider events and maintaining waiting states are run on the provided [CoroutineScope].
+ * The tracker runs a state machine to execute actions on touch-based events typical of a general
+ * slider (including a [android.widget.SeekBar]). Coroutines responsible for running the state
+ * machine, collecting slider events and maintaining waiting states are run on the provided
+ * [CoroutineScope].
*
* @param[sliderStateListener] Listener of the slider state.
* @param[sliderEventProducer] Producer of slider events arising from the slider.
@@ -37,7 +38,7 @@
* events and the launch of timer jobs.
* @property[config] Configuration parameters of the slider tracker.
*/
-class SeekableSliderTracker(
+class SliderStateTracker(
sliderStateListener: SliderStateListener,
sliderEventProducer: SliderEventProducer,
trackerScope: CoroutineScope,
@@ -79,7 +80,7 @@
// This will disambiguate between an imprecise touch that acquires the slider handle,
// and a select and jump operation in the slider track.
setState(SliderState.WAIT)
- } else if (newEventType == SliderEventType.PROGRESS_CHANGE_BY_PROGRAM) {
+ } else if (newEventType == SliderEventType.STARTED_TRACKING_PROGRAM) {
val state =
if (bookendReached(currentProgress)) SliderState.ARROW_HANDLE_REACHED_BOOKEND
else SliderState.ARROW_HANDLE_MOVED_ONCE
@@ -227,7 +228,7 @@
}
SliderEventType.PROGRESS_CHANGE_BY_PROGRAM ->
SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY
- SliderEventType.ARROW_UP -> SliderState.IDLE
+ SliderEventType.STOPPED_TRACKING_PROGRAM -> SliderState.IDLE
else -> SliderState.ARROW_HANDLE_MOVED_ONCE
}
setState(nextState)
@@ -237,7 +238,7 @@
val reachedBookend = bookendReached(currentProgress)
val nextState =
when (newEventType) {
- SliderEventType.ARROW_UP -> SliderState.IDLE
+ SliderEventType.STOPPED_TRACKING_PROGRAM -> SliderState.IDLE
SliderEventType.STARTED_TRACKING_TOUCH -> {
// Launching the timer and going to WAIT
timerJob = launchTimer()
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperActivity.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperActivity.kt
new file mode 100644
index 0000000..692fbb0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperActivity.kt
@@ -0,0 +1,149 @@
+/*
+ * 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.keyboard.shortcut
+
+import android.graphics.Insets
+import android.os.Bundle
+import android.view.View
+import android.view.WindowInsets
+import androidx.activity.BackEventCompat
+import androidx.activity.ComponentActivity
+import androidx.activity.OnBackPressedCallback
+import androidx.core.view.updatePadding
+import com.android.systemui.res.R
+import com.google.android.material.bottomsheet.BottomSheetBehavior
+import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HIDDEN
+
+/**
+ * Activity that hosts the new version of the keyboard shortcut helper. It will be used both for
+ * small and large screen devices.
+ */
+class ShortcutHelperActivity : ComponentActivity() {
+
+ private val bottomSheetContainer
+ get() = requireViewById<View>(R.id.shortcut_helper_sheet_container)
+
+ private val bottomSheet
+ get() = requireViewById<View>(R.id.shortcut_helper_sheet)
+
+ private val bottomSheetBehavior
+ get() = BottomSheetBehavior.from(bottomSheet)
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ setupEdgeToEdge()
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_keyboard_shortcut_helper)
+ setUpBottomSheetWidth()
+ setUpInsets()
+ setUpPredictiveBack()
+ setUpSheetDismissListener()
+ setUpDismissOnTouchOutside()
+ }
+
+ private fun setupEdgeToEdge() {
+ // Draw behind system bars
+ window.setDecorFitsSystemWindows(false)
+ }
+
+ private fun setUpBottomSheetWidth() {
+ val sheetScreenWidthFraction =
+ resources.getFloat(R.dimen.shortcut_helper_screen_width_fraction)
+ // maxWidth needs to be set before the sheet is drawn, otherwise the call will have no
+ // effect.
+ val screenWidth = resources.displayMetrics.widthPixels
+ bottomSheetBehavior.maxWidth = (sheetScreenWidthFraction * screenWidth).toInt()
+ }
+
+ private fun setUpInsets() {
+ bottomSheetContainer.setOnApplyWindowInsetsListener { _, insets ->
+ val safeDrawingInsets = insets.safeDrawing
+ // Make sure the bottom sheet is not covered by the status bar.
+ bottomSheetContainer.updatePadding(top = safeDrawingInsets.top)
+ // Make sure the contents inside of the bottom sheet are not hidden by system bars, or
+ // cutouts.
+ bottomSheet.updatePadding(
+ left = safeDrawingInsets.left,
+ right = safeDrawingInsets.right,
+ bottom = safeDrawingInsets.bottom
+ )
+ // The bottom sheet has to be expanded only after setting up insets, otherwise there is
+ // a bug and it will not use full height.
+ expandBottomSheet()
+
+ // Return CONSUMED if you don't want want the window insets to keep passing
+ // down to descendant views.
+ WindowInsets.CONSUMED
+ }
+ }
+
+ private fun expandBottomSheet() {
+ bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
+ bottomSheetBehavior.skipCollapsed = true
+ }
+
+ private fun setUpPredictiveBack() {
+ val onBackPressedCallback =
+ object : OnBackPressedCallback(/* enabled= */ true) {
+ override fun handleOnBackStarted(backEvent: BackEventCompat) {
+ bottomSheetBehavior.startBackProgress(backEvent)
+ }
+
+ override fun handleOnBackProgressed(backEvent: BackEventCompat) {
+ bottomSheetBehavior.updateBackProgress(backEvent)
+ }
+
+ override fun handleOnBackPressed() {
+ bottomSheetBehavior.handleBackInvoked()
+ }
+
+ override fun handleOnBackCancelled() {
+ bottomSheetBehavior.cancelBackProgress()
+ }
+ }
+ onBackPressedDispatcher.addCallback(
+ owner = this,
+ onBackPressedCallback = onBackPressedCallback
+ )
+ }
+
+ private fun setUpSheetDismissListener() {
+ bottomSheetBehavior.addBottomSheetCallback(
+ object : BottomSheetCallback() {
+ override fun onStateChanged(bottomSheet: View, newState: Int) {
+ if (newState == STATE_HIDDEN) {
+ finish()
+ }
+ }
+
+ override fun onSlide(bottomSheet: View, slideOffset: Float) {}
+ }
+ )
+ }
+
+ private fun setUpDismissOnTouchOutside() {
+ bottomSheetContainer.setOnClickListener { finish() }
+ }
+}
+
+private val WindowInsets.safeDrawing
+ get() =
+ getInsets(WindowInsets.Type.systemBars())
+ .union(getInsets(WindowInsets.Type.ime()))
+ .union(getInsets(WindowInsets.Type.displayCutout()))
+
+private fun Insets.union(insets: Insets): Insets = Insets.max(this, insets)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt
index 39aa615..e441017 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt
@@ -27,7 +27,6 @@
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
-import com.android.systemui.util.kotlin.sample as sampleUtil
import com.android.wm.shell.animation.Interpolators
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
@@ -157,12 +156,8 @@
}
}
)
- .sampleUtil(finishedKeyguardState)
- .collect { keyguardState ->
- if (keyguardState == KeyguardState.ALTERNATE_BOUNCER) {
- startTransitionTo(KeyguardState.GONE)
- }
- }
+ .filterRelevantKeyguardState()
+ .collect { startTransitionTo(KeyguardState.GONE) }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
index 7224536..d191768 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
@@ -226,7 +226,7 @@
val ambientIndicationVisible: Flow<Boolean> = repository.ambientIndicationVisible.asStateFlow()
/** Whether the primary bouncer is showing or not. */
- val primaryBouncerShowing: Flow<Boolean> = bouncerRepository.primaryBouncerShow
+ @JvmField val primaryBouncerShowing: Flow<Boolean> = bouncerRepository.primaryBouncerShow
/** Whether the alternate bouncer is showing or not. */
val alternateBouncerShowing: Flow<Boolean> = bouncerRepository.alternateBouncerVisible
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt
index 92612b8..7d05539 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt
@@ -87,6 +87,7 @@
}
/** Whether either of the bouncers are visible when we're FINISHED in the given state. */
+ @JvmStatic
fun isBouncerState(state: KeyguardState): Boolean {
return state == PRIMARY_BOUNCER || state == ALTERNATE_BOUNCER
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
index f46a207..cccb93c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
@@ -128,6 +128,8 @@
view.getIconState(viewModel.type, viewModel.useAodVariant),
/* merge */ false
)
+ fgIconView.contentDescription =
+ fgIconView.resources.getString(viewModel.type.contentDescriptionResId)
fgIconView.imageTintList = ColorStateList.valueOf(viewModel.tint)
fgIconView.setPadding(
viewModel.padding,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
index 9a6dca3..76edda3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
@@ -20,8 +20,6 @@
import android.graphics.Point
import com.android.systemui.CoreStartable
import com.android.systemui.Flags
-import com.android.systemui.biometrics.SideFpsController
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.ui.view.SideFpsProgressBar
@@ -38,7 +36,7 @@
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
-private const val spfsProgressBarCommand = "sfps-progress-bar"
+private const val sfpsProgressBarCommand = "sfps-progress-bar"
@SysUISingleton
class SideFpsProgressBarViewBinder
@@ -47,8 +45,6 @@
private val viewModel: SideFpsProgressBarViewModel,
private val view: SideFpsProgressBar,
@Application private val applicationScope: CoroutineScope,
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- private val sfpsController: dagger.Lazy<SideFpsController>,
private val logger: SideFpsLogger,
private val commandRegistry: CommandRegistry,
) : CoreStartable {
@@ -61,7 +57,7 @@
// not required.
var layoutJob: Job? = null
var progressJob: Job? = null
- commandRegistry.registerCommand(spfsProgressBarCommand) { SfpsProgressBarCommand() }
+ commandRegistry.registerCommand(sfpsProgressBarCommand) { SfpsProgressBarCommand() }
applicationScope.launch {
viewModel.isProlongedTouchRequiredForAuthentication.collectLatest { enabled ->
logger.isProlongedTouchRequiredForAuthenticationChanged(enabled)
@@ -109,17 +105,6 @@
) {
logger.sfpsProgressBarStateChanged(visible, location, fpDetectRunning, length, rotation)
view.updateView(visible, location, length, thickness, rotation)
- // We have to hide the SFPS indicator as the progress bar will
- // be shown at the same location
- if (!SideFpsControllerRefactor.isEnabled) {
- if (visible) {
- logger.hidingSfpsIndicator()
- sfpsController.get().hideIndicator()
- } else if (fpDetectRunning) {
- logger.showingSfpsIndicator()
- sfpsController.get().showIndicator()
- }
- }
}
inner class SfpsProgressBarCommand : Command {
@@ -164,7 +149,7 @@
}
override fun help(pw: PrintWriter) {
- pw.println("Usage: adb shell cmd statusbar $spfsProgressBarCommand <command>")
+ pw.println("Usage: adb shell cmd statusbar $sfpsProgressBarCommand <command>")
pw.println("Available commands:")
pw.println(" show x y width height rotation")
pw.println(" hide")
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/DeviceEntryIconView.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/DeviceEntryIconView.kt
index af1d0df..2735aed 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/DeviceEntryIconView.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/DeviceEntryIconView.kt
@@ -68,12 +68,12 @@
object : AccessibilityDelegate() {
private val accessibilityAuthenticateHint =
AccessibilityNodeInfo.AccessibilityAction(
- AccessibilityNodeInfoCompat.ACTION_CLICK,
+ AccessibilityNodeInfoCompat.ACTION_LONG_CLICK,
resources.getString(R.string.accessibility_authenticate_hint)
)
private val accessibilityEnterHint =
AccessibilityNodeInfo.AccessibilityAction(
- AccessibilityNodeInfoCompat.ACTION_CLICK,
+ AccessibilityNodeInfoCompat.ACTION_LONG_CLICK,
resources.getString(R.string.accessibility_enter_hint)
)
override fun onInitializeAccessibilityNodeInfo(
@@ -261,10 +261,10 @@
return lockIconState
}
- enum class IconType {
- LOCK,
- UNLOCK,
- FINGERPRINT,
+ enum class IconType(val contentDescriptionResId: Int) {
+ LOCK(R.string.accessibility_lock_icon),
+ UNLOCK(R.string.accessibility_unlock_button),
+ FINGERPRINT(R.string.accessibility_fingerprint_label),
}
enum class AccessibilityHintType {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
index 644bea0..5b83a10 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
@@ -27,6 +27,7 @@
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.ComposeLockscreen
import com.android.systemui.keyguard.shared.model.BurnInModel
import com.android.systemui.keyguard.shared.model.ClockSize
import com.android.systemui.keyguard.ui.StateToValue
@@ -126,32 +127,41 @@
val useScaleOnly =
useAltAod && keyguardClockViewModel.clockSize.value == ClockSize.LARGE
- if (useScaleOnly) {
- BurnInModel(
- translationX = 0,
- translationY = 0,
- scale = MathUtils.lerp(burnIn.scale, 1f, 1f - interpolated),
- )
- } else {
- // Ensure the desired translation doesn't encroach on the top inset
- val burnInY = MathUtils.lerp(0, burnIn.translationY, interpolated).toInt()
- val translationY =
- if (MigrateClocksToBlueprint.isEnabled) {
- max(params.topInset - params.minViewY, burnInY)
- } else {
- max(params.topInset, params.minViewY + burnInY) - params.minViewY
- }
+ val burnInY = MathUtils.lerp(0, burnIn.translationY, interpolated).toInt()
+ val translationY =
+ if (MigrateClocksToBlueprint.isEnabled) {
+ max(params.topInset - params.minViewY, burnInY)
+ } else {
+ max(params.topInset, params.minViewY + burnInY) - params.minViewY
+ }
+ if (ComposeLockscreen.isEnabled) {
BurnInModel(
translationX = MathUtils.lerp(0, burnIn.translationX, interpolated).toInt(),
translationY = translationY,
- scale =
- MathUtils.lerp(
- /* start= */ burnIn.scale,
- /* stop= */ 1f,
- /* amount= */ 1f - interpolated,
- ),
- scaleClockOnly = true,
+ scale = MathUtils.lerp(burnIn.scale, 1f, 1f - interpolated),
+ scaleClockOnly = !useScaleOnly,
)
+ } else {
+ if (useScaleOnly) {
+ BurnInModel(
+ translationX = 0,
+ translationY = 0,
+ scale = MathUtils.lerp(burnIn.scale, 1f, 1f - interpolated),
+ )
+ } else {
+ // Ensure the desired translation doesn't encroach on the top inset
+ BurnInModel(
+ translationX = MathUtils.lerp(0, burnIn.translationX, interpolated).toInt(),
+ translationY = translationY,
+ scale =
+ MathUtils.lerp(
+ /* start= */ burnIn.scale,
+ /* stop= */ 1f,
+ /* amount= */ 1f - interpolated,
+ ),
+ scaleClockOnly = true,
+ )
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
index 5dafd94..c997617 100644
--- a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
+++ b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
@@ -17,6 +17,7 @@
package com.android.systemui.lifecycle
+import android.os.Trace
import android.view.View
import android.view.ViewTreeObserver
import androidx.annotation.MainThread
@@ -73,7 +74,7 @@
Dispatchers.Main + createCoroutineTracingContext() + coroutineContext
val traceName =
if (Compile.IS_DEBUG && coroutineTracing()) {
- traceSectionName()
+ inferTraceSectionName()
} else {
DEFAULT_TRACE_NAME
}
@@ -197,16 +198,21 @@
frame.className != CURRENT_CLASS_NAME && frame.className != JAVA_ADAPTER_CLASS_NAME
/** Get a name for the trace section include the name of the call site. */
-private fun traceSectionName(): String {
- val interestingFrame =
- StackWalker.getInstance().walk { stream ->
- stream.filter(::isFrameInteresting).limit(5).findFirst()
+private fun inferTraceSectionName(): String {
+ try {
+ Trace.traceBegin(Trace.TRACE_TAG_APP, "RepeatWhenAttachedKt#inferTraceSectionName")
+ val interestingFrame =
+ StackWalker.getInstance().walk { stream ->
+ stream.filter(::isFrameInteresting).limit(5).findFirst()
+ }
+ if (interestingFrame.isPresent) {
+ val f = interestingFrame.get()
+ return "${f.className}#${f.methodName}:${f.lineNumber} [$DEFAULT_TRACE_NAME]"
+ } else {
+ return DEFAULT_TRACE_NAME
}
- if (interestingFrame.isPresent) {
- val frame = interestingFrame.get()
- return "${frame.className}#${frame.methodName}:${frame.lineNumber} [$DEFAULT_TRACE_NAME]"
- } else {
- return DEFAULT_TRACE_NAME
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_APP)
}
}
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 8ee3adc..df3a974 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
@@ -72,6 +72,11 @@
val sortedMedia: StateFlow<Map<MediaSortKeyModel, MediaCommonModel>> =
_sortedMedia.asStateFlow()
+ private val _isMediaFromRec: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ val isMediaFromRec: StateFlow<Boolean> = _isMediaFromRec.asStateFlow()
+
+ private var mediaFromRecPackageName: String? = null
+
fun addMediaEntry(key: String, data: MediaData) {
val entries = LinkedHashMap<String, MediaData>(_allUserEntries.value)
entries[key] = data
@@ -161,6 +166,12 @@
)
if (mediaDataLoadingModel is MediaDataLoadingModel.Loaded) {
+ val isMediaFromRec = isMediaFromRec(it)
+
+ _isMediaFromRec.value = isMediaFromRec
+ if (isMediaFromRec) {
+ mediaFromRecPackageName = null
+ }
sortedMap[sortKey] =
MediaCommonModel.MediaControl(mediaDataLoadingModel, canBeRemoved(it))
}
@@ -195,7 +206,15 @@
_sortedMedia.value = sortedMap
}
+ fun setMediaFromRecPackageName(packageName: String) {
+ mediaFromRecPackageName = packageName
+ }
+
private fun canBeRemoved(data: MediaData): Boolean {
return data.isPlaying?.let { !it } ?: data.isClearable && !data.active
}
+
+ private fun isMediaFromRec(data: MediaData): Boolean {
+ return data.isPlaying == true && mediaFromRecPackageName == data.packageName
+ }
}
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 dc2c651..13f934e 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
@@ -133,6 +133,9 @@
initialValue = emptyList(),
)
+ /** Whether the current change in media was done by clicking on a recommendation */
+ val isMediaFromRec: StateFlow<Boolean> = mediaFilterRepository.isMediaFromRec
+
override fun start() {
if (!mediaFlags.isMediaControlsRefactorEnabled()) {
return
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
index d57b049..dea5810 100644
--- 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
@@ -49,7 +49,7 @@
constructor(
@Application applicationScope: CoroutineScope,
@Application private val applicationContext: Context,
- repository: MediaFilterRepository,
+ private val repository: MediaFilterRepository,
private val mediaDataProcessor: MediaDataProcessor,
private val broadcastSender: BroadcastSender,
private val activityStarter: ActivityStarter,
@@ -133,6 +133,10 @@
}
}
+ fun switchToMediaControl(packageName: String) {
+ repository.setMediaFromRecPackageName(packageName)
+ }
+
companion object {
private const val TAG = "MediaRecommendationsInteractor"
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaCommonModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaCommonModel.kt
index 562fe7a..23860bb 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaCommonModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaCommonModel.kt
@@ -20,7 +20,7 @@
sealed class MediaCommonModel {
data class MediaControl(
val mediaLoadedModel: MediaDataLoadingModel.Loaded,
- val canBeRemoved: Boolean = false
+ val canBeRemoved: Boolean = false,
) : MediaCommonModel()
data class MediaRecommendations(val recsLoadingModel: SmartspaceMediaLoadingModel) :
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java
index bd3893b..e6c785e 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java
@@ -57,6 +57,7 @@
import android.media.session.PlaybackState;
import android.os.Process;
import android.os.Trace;
+import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -738,11 +739,11 @@
mPackageName, mMediaViewHolder.getSeamlessButton());
} else {
mLogger.logOpenOutputSwitcher(mUid, mPackageName, mInstanceId);
- // TODO: b/321969740 - Populate the userHandle parameter. The user
- // handle is necessary to disambiguate the same package running on
- // different users.
mMediaOutputDialogManager.createAndShow(
- mPackageName, true, mMediaViewHolder.getSeamlessButton(), null);
+ mPackageName,
+ /* aboveStatusBar */ true,
+ mMediaViewHolder.getSeamlessButton(),
+ UserHandle.getUserHandleForUid(mUid));
}
} else {
mLogger.logOpenOutputSwitcher(mUid, mPackageName, mInstanceId);
@@ -770,11 +771,11 @@
Log.w(TAG, "Device pending intent is not an activity.");
}
} else {
- // TODO: b/321969740 - Populate the userHandle parameter. The user
- // handle is necessary to disambiguate the same package running on
- // different users.
mMediaOutputDialogManager.createAndShow(
- mPackageName, true, mMediaViewHolder.getSeamlessButton(), null);
+ mPackageName,
+ /* aboveStatusBar */ true,
+ mMediaViewHolder.getSeamlessButton(),
+ UserHandle.getUserHandleForUid(mUid));
}
}
});
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
index c92965e..5188132 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
@@ -29,6 +29,7 @@
import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
import com.android.systemui.util.Utils
+import com.android.systemui.util.kotlin.pairwiseBy
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
@@ -37,8 +38,8 @@
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
/** Models UI state and handles user inputs for media carousel */
@@ -66,8 +67,11 @@
awaitClose { visualStabilityProvider.removeReorderingAllowedListener(listener) }
}
.flatMapLatest {
- interactor.sortedMedia.map { sortedItems ->
+ combine(interactor.isMediaFromRec, interactor.sortedMedia) {
+ isRecsToMedia,
+ sortedItems ->
buildList {
+ shouldReorder = isRecsToMedia
val reorderAllowed = isReorderingAllowed()
sortedItems.forEach { commonModel ->
if (!reorderAllowed || !modelsPendingRemoval.contains(commonModel)) {
@@ -85,6 +89,16 @@
}
}
}
+ .pairwiseBy { old, new ->
+ // This condition can only happen when view is attached. So the old emit is of the
+ // most recent list updated.
+ // If the old list is empty, it is okay to emit the new ordered list.
+ if (isReorderingAllowed() || shouldReorder || old.isEmpty()) {
+ new
+ } else {
+ old
+ }
+ }
.stateIn(
scope = applicationScope,
started = SharingStarted.WhileSubscribed(),
@@ -98,6 +112,8 @@
private var modelsPendingRemoval: MutableSet<MediaCommonModel> = mutableSetOf()
+ private var shouldReorder = true
+
fun onSwipeToDismiss() {
logger.logSwipeDismiss()
interactor.onSwipeToDismiss()
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt
index a2307d4..5cd9804 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt
@@ -107,6 +107,10 @@
logger.logRecommendationItemTap(packageName, instanceId, index)
}
// TODO (b/330897926) log smartspace card reported (SMARTSPACE_CARD_CLICK_EVENT).
+
+ // set the package name of the player added by recommendation once the media is loaded.
+ interactor.switchToMediaControl(packageName)
+
interactor.startClickIntent(expandable, intent)
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt
index cef1e69..22b3f35 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModel.kt
@@ -33,12 +33,19 @@
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.android.systemui.classifier.Classifier.MEDIA_SEEKBAR
+import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.statusbar.NotificationMediaManager
import com.android.systemui.util.concurrency.RepeatableExecutor
import javax.inject.Inject
import kotlin.math.abs
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
private const val POSITION_UPDATE_INTERVAL_MILLIS = 100L
private const val MIN_FLING_VELOCITY_SCALE_FACTOR = 10
@@ -81,8 +88,11 @@
class SeekBarViewModel
@Inject
constructor(
+ @Application private val applicationScope: CoroutineScope,
+ @Main private val mainDispatcher: CoroutineDispatcher,
@Background private val bgExecutor: RepeatableExecutor,
private val falsingManager: FalsingManager,
+ private val mediaFlags: MediaFlags,
) {
private var _data =
Progress(
@@ -108,9 +118,19 @@
private var controller: MediaController? = null
set(value) {
if (field?.sessionToken != value?.sessionToken) {
- field?.unregisterCallback(callback)
- value?.registerCallback(callback)
- field = value
+ if (!mediaFlags.isMediaControlsRefactorEnabled()) {
+ field?.unregisterCallback(callback)
+ value?.registerCallback(callback)
+ field = value
+ } else {
+ applicationScope.launch {
+ withContext(mainDispatcher) {
+ field?.unregisterCallback(callback)
+ value?.registerCallback(callback)
+ field = value
+ }
+ }
+ }
}
}
private var playbackState: PlaybackState? = null
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 43c73c4..1a2ae8a 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -243,6 +243,7 @@
private Optional<Long> mHomeButtonLongPressDurationMs;
private Optional<Long> mOverrideHomeButtonLongPressDurationMs = Optional.empty();
private Optional<Float> mOverrideHomeButtonLongPressSlopMultiplier = Optional.empty();
+ private boolean mHomeButtonLongPressHapticEnabled = true;
/** @see android.view.WindowInsetsController#setSystemBarsAppearance(int, int) */
private @Appearance int mAppearance;
@@ -410,13 +411,15 @@
}
@Override
- public void setOverrideHomeButtonLongPress(long duration, float slopMultiplier) {
- Log.d(TAG, "setOverrideHomeButtonLongPress receives: " + duration + "; "
- + slopMultiplier);
+ public void setOverrideHomeButtonLongPress(long duration, float slopMultiplier,
+ boolean haptic) {
+ Log.d(TAG, "setOverrideHomeButtonLongPress receives: " + duration + ";"
+ + slopMultiplier + ";" + haptic);
mOverrideHomeButtonLongPressDurationMs = Optional.of(duration)
.filter(value -> value > 0);
mOverrideHomeButtonLongPressSlopMultiplier = Optional.of(slopMultiplier)
.filter(value -> value > 0);
+ mHomeButtonLongPressHapticEnabled = haptic;
mOverrideHomeButtonLongPressDurationMs.ifPresent(aLong
-> Log.d(TAG, "Use duration override: " + aLong));
mOverrideHomeButtonLongPressSlopMultiplier.ifPresent(aFloat
@@ -463,9 +466,11 @@
private final Runnable mEnableLayoutTransitions = () -> mView.setLayoutTransitionsEnabled(true);
private final Runnable mOnVariableDurationHomeLongClick = () -> {
if (onHomeLongClick(mView.getHomeButton().getCurrentView())) {
- mView.getHomeButton().getCurrentView().performHapticFeedback(
- HapticFeedbackConstants.LONG_PRESS,
- HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
+ if (mHomeButtonLongPressHapticEnabled) {
+ mView.getHomeButton().getCurrentView().performHapticFeedback(
+ HapticFeedbackConstants.LONG_PRESS,
+ HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
+ }
}
};
@@ -1042,7 +1047,8 @@
mView.getHomeButton().setOnLongClickListener(null);
} else {
mView.getHomeButton().getCurrentView().setLongClickable(true);
- mView.getHomeButton().getCurrentView().setHapticFeedbackEnabled(true);
+ mView.getHomeButton().getCurrentView().setHapticFeedbackEnabled(
+ mHomeButtonLongPressHapticEnabled);
mView.getHomeButton().setOnLongClickListener(this::onHomeLongClick);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 4ee2db7..042fb63f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -75,6 +75,10 @@
@Override
protected void onFinishInflate() {
super.onFinishInflate();
+ // set layer to make alpha animation of brightness slider nicer - otherwise elements
+ // of slider are animated separately and it doesn't look good. See b/329244723
+ setLayerType(LAYER_TYPE_HARDWARE, null);
+
mQSPanelContainer = findViewById(R.id.expanded_qs_scroll_view);
mQSPanel = findViewById(R.id.quick_settings_panel);
mHeader = findViewById(R.id.header);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
index 9790a52..d5b05ef 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
@@ -1348,15 +1348,12 @@
mDefaultDataSubId = defaultDataSubId;
}
- boolean mayLaunchShareWifiSettings(WifiEntry wifiEntry) {
+ boolean mayLaunchShareWifiSettings(WifiEntry wifiEntry, View view) {
Intent intent = getConfiguratorQrCodeGeneratorIntentOrNull(wifiEntry);
if (intent == null) {
return false;
}
- if (mCallback != null) {
- mCallback.dismissDialog();
- }
- mActivityStarter.startActivity(intent, false /* dismissShade */);
+ startActivity(intent, view);
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java
index 24089a7..1a881b6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java
@@ -395,7 +395,7 @@
});
mDoneButton.setOnClickListener(v -> dialog.dismiss());
mShareWifiButton.setOnClickListener(v -> {
- if (mInternetDialogController.mayLaunchShareWifiSettings(mConnectedWifiEntry)) {
+ if (mInternetDialogController.mayLaunchShareWifiSettings(mConnectedWifiEntry, v)) {
mUiEventLogger.log(InternetDialogEvent.SHARE_WIFI_QS_BUTTON_CLICKED);
}
});
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 1ddc094..520331a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -264,9 +264,10 @@
}
@Override
- public void setOverrideHomeButtonLongPress(long duration, float slopMultiplier) {
+ public void setOverrideHomeButtonLongPress(long duration, float slopMultiplier,
+ boolean haptic) {
verifyCallerAndClearCallingIdentityPostMain("setOverrideHomeButtonLongPress",
- () -> notifySetOverrideHomeButtonLongPress(duration, slopMultiplier));
+ () -> notifySetOverrideHomeButtonLongPress(duration, slopMultiplier, haptic));
}
@Override
@@ -956,9 +957,11 @@
}
}
- private void notifySetOverrideHomeButtonLongPress(long duration, float slopMultiplier) {
+ private void notifySetOverrideHomeButtonLongPress(long duration, float slopMultiplier,
+ boolean haptic) {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
- mConnectionCallbacks.get(i).setOverrideHomeButtonLongPress(duration, slopMultiplier);
+ mConnectionCallbacks.get(i)
+ .setOverrideHomeButtonLongPress(duration, slopMultiplier, haptic);
}
}
@@ -1119,8 +1122,9 @@
default void startAssistant(Bundle bundle) {}
default void setAssistantOverridesRequested(int[] invocationTypes) {}
default void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) {}
- /** Set override of home button long press duration and touch slop multiplier. */
- default void setOverrideHomeButtonLongPress(long override, float slopMultiplier) {}
+ /** Set override of home button long press duration, touch slop multiplier, and haptic. */
+ default void setOverrideHomeButtonLongPress(
+ long override, float slopMultiplier, boolean haptic) {}
}
/**
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 ae2bb8b..4fc24b8 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
@@ -21,11 +21,13 @@
import android.app.StatusBarManager
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.SceneKey
+import com.android.internal.logging.UiEventLogger
import com.android.systemui.CoreStartable
import com.android.systemui.authentication.domain.interactor.AuthenticationInteractor
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.bouncer.domain.interactor.BouncerInteractor
import com.android.systemui.bouncer.domain.interactor.SimBouncerInteractor
+import com.android.systemui.bouncer.shared.logging.BouncerUiEvent
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.FalsingCollectorActual
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
@@ -35,6 +37,7 @@
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor
+import com.android.systemui.deviceentry.shared.model.DeviceUnlockSource
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.model.SceneContainerPlugin
import com.android.systemui.model.SysUiState
@@ -107,6 +110,7 @@
private val occlusionInteractor: SceneContainerOcclusionInteractor,
private val faceUnlockInteractor: DeviceEntryFaceAuthInteractor,
private val shadeInteractor: ShadeInteractor,
+ private val uiEventLogger: UiEventLogger,
) : CoreStartable {
override fun start() {
@@ -282,6 +286,12 @@
}
}
+ if (
+ isOnBouncer &&
+ deviceUnlockStatus.deviceUnlockSource == DeviceUnlockSource.TrustAgent
+ ) {
+ uiEventLogger.log(BouncerUiEvent.BOUNCER_DISMISS_EXTENDED_ACCESS)
+ }
when {
isOnBouncer ->
// When the device becomes unlocked in Bouncer, go to previous scene,
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index 13f508a..501a4a7 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -19,7 +19,7 @@
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT;
-import static com.android.systemui.Flags.screenshotShelfUi;
+import static com.android.systemui.Flags.screenshotShelfUi2;
import static com.android.systemui.screenshot.LogConfig.DEBUG_ANIM;
import static com.android.systemui.screenshot.LogConfig.DEBUG_CALLBACK;
import static com.android.systemui.screenshot.LogConfig.DEBUG_INPUT;
@@ -403,7 +403,7 @@
return;
}
- if (screenshotShelfUi()) {
+ if (screenshotShelfUi2()) {
final UUID requestId = UUID.randomUUID();
final String screenshotId = String.format("Screenshot_%s", requestId);
mActionsProvider = mActionsProviderFactory.create(
@@ -454,7 +454,7 @@
// ignore system bar insets for the purpose of window layout
mWindow.getDecorView().setOnApplyWindowInsetsListener(
(v, insets) -> WindowInsets.CONSUMED);
- if (!screenshotShelfUi()) {
+ if (!screenshotShelfUi2()) {
mScreenshotHandler.cancelTimeout(); // restarted after animation
}
}
@@ -503,7 +503,7 @@
}
boolean isPendingSharedTransition() {
- if (screenshotShelfUi()) {
+ if (screenshotShelfUi2()) {
return mActionExecutor.isPendingSharedTransition();
} else {
return mViewProxy.isPendingSharedTransition();
@@ -624,7 +624,7 @@
(response) -> {
mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_LONG_SCREENSHOT_IMPRESSION,
0, response.getPackageName());
- if (screenshotShelfUi() && mActionsProvider != null) {
+ if (screenshotShelfUi2() && mActionsProvider != null) {
mActionsProvider.onScrollChipReady(
() -> onScrollButtonClicked(owner, response));
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt
index 303eb78..12a3daa 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt
@@ -31,6 +31,7 @@
import android.view.WindowManager
import android.window.OnBackInvokedCallback
import android.window.OnBackInvokedDispatcher
+import androidx.core.animation.doOnEnd
import com.android.internal.logging.UiEventLogger
import com.android.systemui.log.DebugLogger.debugLog
import com.android.systemui.res.R
@@ -109,7 +110,10 @@
override fun updateOrientation(insets: WindowInsets) {}
override fun createScreenshotDropInAnimation(screenRect: Rect, showFlash: Boolean): Animator {
- return animationController.getEntranceAnimation()
+ val entrance = animationController.getEntranceAnimation(screenRect, showFlash)
+ // reset the timeout when animation finishes
+ entrance.doOnEnd { callbacks?.onUserInteraction() }
+ return entrance
}
override fun addQuickShareChip(quickShareAction: Notification.Action) {}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java b/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java
index ab23e5f..9b8d047 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java
@@ -16,7 +16,7 @@
package com.android.systemui.screenshot.dagger;
-import static com.android.systemui.Flags.screenshotShelfUi;
+import static com.android.systemui.Flags.screenshotShelfUi2;
import android.app.Service;
import android.view.accessibility.AccessibilityManager;
@@ -99,7 +99,7 @@
static ScreenshotViewProxy.Factory providesScreenshotViewProxyFactory(
ScreenshotShelfViewProxy.Factory shelfScreenshotViewProxyFactory,
LegacyScreenshotViewProxy.Factory legacyScreenshotViewProxyFactory) {
- if (screenshotShelfUi()) {
+ if (screenshotShelfUi2()) {
return shelfScreenshotViewProxyFactory;
} else {
return legacyScreenshotViewProxyFactory;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/ScreenshotAnimationController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/ScreenshotAnimationController.kt
index 9cf8ca5..3f4f74b 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/ScreenshotAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/ScreenshotAnimationController.kt
@@ -17,9 +17,16 @@
package com.android.systemui.screenshot.ui
import android.animation.Animator
-import android.animation.AnimatorListenerAdapter
+import android.animation.AnimatorSet
+import android.animation.ObjectAnimator
import android.animation.ValueAnimator
+import android.graphics.PointF
+import android.graphics.Rect
+import android.util.MathUtils
import android.view.View
+import android.view.animation.AnimationUtils
+import androidx.core.animation.doOnEnd
+import androidx.core.animation.doOnStart
import com.android.systemui.res.R
import kotlin.math.abs
import kotlin.math.max
@@ -27,23 +34,57 @@
class ScreenshotAnimationController(private val view: ScreenshotShelfView) {
private var animator: Animator? = null
+ private val screenshotPreview = view.requireViewById<View>(R.id.screenshot_preview)
+ private val flashView = view.requireViewById<View>(R.id.screenshot_flash)
private val actionContainer = view.requireViewById<View>(R.id.actions_container_background)
-
- fun getEntranceAnimation(): Animator {
- val animator = ValueAnimator.ofFloat(0f, 1f)
- animator.addUpdateListener { view.alpha = it.animatedFraction }
- animator.addListener(
- object : AnimatorListenerAdapter() {
- override fun onAnimationStart(animator: Animator) {
- view.alpha = 0f
- }
- override fun onAnimationEnd(animator: Animator) {
- view.alpha = 1f
- }
- }
+ private val fastOutSlowIn =
+ AnimationUtils.loadInterpolator(view.context, android.R.interpolator.fast_out_slow_in)
+ private val staticUI =
+ listOf<View>(
+ view.requireViewById(R.id.screenshot_preview_border),
+ view.requireViewById(R.id.actions_container_background),
+ view.requireViewById(R.id.screenshot_badge),
+ view.requireViewById(R.id.screenshot_dismiss_button)
)
- this.animator = animator
- return animator
+
+ fun getEntranceAnimation(bounds: Rect, showFlash: Boolean): Animator {
+ val entranceAnimation = AnimatorSet()
+
+ val previewAnimator = getPreviewAnimator(bounds)
+
+ if (showFlash) {
+ val flashInAnimator =
+ ObjectAnimator.ofFloat(flashView, "alpha", 0f, 1f).apply {
+ duration = FLASH_IN_DURATION_MS
+ interpolator = fastOutSlowIn
+ }
+ val flashOutAnimator =
+ ObjectAnimator.ofFloat(flashView, "alpha", 1f, 0f).apply {
+ duration = FLASH_OUT_DURATION_MS
+ interpolator = fastOutSlowIn
+ }
+ flashInAnimator.doOnStart { flashView.visibility = View.VISIBLE }
+ flashOutAnimator.doOnEnd { flashView.visibility = View.GONE }
+ entranceAnimation.play(flashOutAnimator).after(flashInAnimator)
+ entranceAnimation.play(previewAnimator).with(flashOutAnimator)
+ entranceAnimation.doOnStart { screenshotPreview.visibility = View.INVISIBLE }
+ }
+
+ val fadeInAnimator = ValueAnimator.ofFloat(0f, 1f)
+ fadeInAnimator.addUpdateListener {
+ for (child in staticUI) {
+ child.alpha = it.animatedValue as Float
+ }
+ }
+ entranceAnimation.play(fadeInAnimator).after(previewAnimator)
+ entranceAnimation.doOnStart {
+ for (child in staticUI) {
+ child.alpha = 0f
+ }
+ }
+
+ this.animator = entranceAnimation
+ return entranceAnimation
}
fun getSwipeReturnAnimation(): Animator {
@@ -81,11 +122,49 @@
animator?.cancel()
}
+ private fun getPreviewAnimator(bounds: Rect): Animator {
+ val targetPosition = Rect()
+ screenshotPreview.getHitRect(targetPosition)
+ val startXScale = bounds.width() / targetPosition.width().toFloat()
+ val startYScale = bounds.height() / targetPosition.height().toFloat()
+ val startPos = PointF(bounds.exactCenterX(), bounds.exactCenterY())
+ val endPos = PointF(targetPosition.exactCenterX(), targetPosition.exactCenterY())
+
+ val previewYAnimator =
+ ValueAnimator.ofFloat(startPos.y, endPos.y).apply {
+ duration = PREVIEW_Y_ANIMATION_DURATION_MS
+ interpolator = fastOutSlowIn
+ }
+ previewYAnimator.addUpdateListener {
+ val progress = it.animatedValue as Float
+ screenshotPreview.y = progress - screenshotPreview.height / 2f
+ }
+ // scale animation starts/finishes at the same time as x placement
+ val previewXAndScaleAnimator =
+ ValueAnimator.ofFloat(0f, 1f).apply {
+ duration = PREVIEW_X_ANIMATION_DURATION_MS
+ interpolator = fastOutSlowIn
+ }
+ previewXAndScaleAnimator.addUpdateListener {
+ val t = it.animatedFraction
+ screenshotPreview.scaleX = MathUtils.lerp(startXScale, 1f, t)
+ screenshotPreview.scaleY = MathUtils.lerp(startYScale, 1f, t)
+ screenshotPreview.x =
+ MathUtils.lerp(startPos.x, endPos.x, t) - screenshotPreview.width / 2f
+ }
+
+ val previewAnimator = AnimatorSet()
+ previewAnimator.play(previewXAndScaleAnimator).with(previewYAnimator)
+
+ previewAnimator.doOnStart { screenshotPreview.visibility = View.VISIBLE }
+ return previewAnimator
+ }
+
private fun getAdjustedVelocity(requestedVelocity: Float?): Float {
return if (requestedVelocity == null) {
val isLTR = view.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_LTR
// dismiss to the left in LTR locales, to the right in RTL
- if (isLTR) -1 * MINIMUM_VELOCITY else MINIMUM_VELOCITY
+ if (isLTR) -MINIMUM_VELOCITY else MINIMUM_VELOCITY
} else {
sign(requestedVelocity) * max(MINIMUM_VELOCITY, abs(requestedVelocity))
}
@@ -93,5 +172,9 @@
companion object {
private const val MINIMUM_VELOCITY = 1.5f // pixels per second
+ private const val FLASH_IN_DURATION_MS: Long = 133
+ private const val FLASH_OUT_DURATION_MS: Long = 217
+ private const val PREVIEW_X_ANIMATION_DURATION_MS: Long = 234
+ private const val PREVIEW_Y_ANIMATION_DURATION_MS: Long = 500
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/SwipeGestureListener.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/SwipeGestureListener.kt
index 7274757..61d4489 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/SwipeGestureListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/SwipeGestureListener.kt
@@ -24,7 +24,7 @@
class SwipeGestureListener(
private val view: View,
- private val onDismiss: (Float) -> Unit,
+ private val onDismiss: (Float?) -> Unit,
private val onCancel: () -> Unit
) {
private val velocityTracker = VelocityTracker.obtain()
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt
index 3e35295..3376b8c 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt
@@ -30,6 +30,7 @@
import com.android.systemui.screenshot.ui.SwipeGestureListener
import com.android.systemui.screenshot.ui.viewmodel.ScreenshotViewModel
import com.android.systemui.util.children
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
object ScreenshotShelfViewBinder {
@@ -60,7 +61,8 @@
onDismissalRequested(ScreenshotEvent.SCREENSHOT_EXPLICIT_DISMISSAL, null)
}
- view.repeatWhenAttached {
+ // use immediate dispatcher to ensure screenshot bitmap is set before animation
+ view.repeatWhenAttached(Dispatchers.Main.immediate) {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
@@ -96,9 +98,9 @@
// ID is unique.
val newIds = visibleActions.map { it.id }
- for (view in actionsContainer.children.toList()) {
- if (view.tag !in newIds) {
- actionsContainer.removeView(view)
+ for (child in actionsContainer.children.toList()) {
+ if (child.tag !in newIds) {
+ actionsContainer.removeView(child)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
index 8397d9f..37f2a21 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
@@ -47,7 +47,9 @@
import com.android.internal.display.BrightnessSynchronizer;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.systemui.Flags;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.settings.DisplayTracker;
@@ -370,10 +372,18 @@
mBackgroundHandler.post(new Runnable() {
@Override
public void run() {
- mControl.setEnforcedAdmin(
+ int userId = mUserTracker.getUserId();
+ RestrictedLockUtils.EnforcedAdmin enforcedAdmin =
RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
UserManager.DISALLOW_CONFIG_BRIGHTNESS,
- mUserTracker.getUserId()));
+ userId);
+ if (Flags.enforceBrightnessBaseUserRestriction() && enforcedAdmin == null
+ && RestrictedLockUtilsInternal.hasBaseUserRestriction(mContext,
+ UserManager.DISALLOW_CONFIG_BRIGHTNESS,
+ userId)) {
+ enforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ }
+ mControl.setEnforcedAdmin(enforcedAdmin);
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java
index b425fb9..083cee7 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java
@@ -33,7 +33,7 @@
import com.android.systemui.Gefingerpoken;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.haptics.slider.HapticSliderViewBinder;
-import com.android.systemui.haptics.slider.SeekableSliderHapticPlugin;
+import com.android.systemui.haptics.slider.SeekbarHapticPlugin;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.res.R;
@@ -65,7 +65,7 @@
private final FalsingManager mFalsingManager;
private final UiEventLogger mUiEventLogger;
- private final SeekableSliderHapticPlugin mBrightnessSliderHapticPlugin;
+ private final SeekbarHapticPlugin mBrightnessSliderHapticPlugin;
private final ActivityStarter mActivityStarter;
private final Gefingerpoken mOnInterceptListener = new Gefingerpoken() {
@@ -89,7 +89,7 @@
BrightnessSliderView brightnessSliderView,
FalsingManager falsingManager,
UiEventLogger uiEventLogger,
- SeekableSliderHapticPlugin brightnessSliderHapticPlugin,
+ SeekbarHapticPlugin brightnessSliderHapticPlugin,
ActivityStarter activityStarter) {
super(brightnessSliderView);
mFalsingManager = falsingManager;
@@ -314,7 +314,7 @@
int layout = getLayout();
BrightnessSliderView root = (BrightnessSliderView) LayoutInflater.from(context)
.inflate(layout, viewRoot, false);
- SeekableSliderHapticPlugin plugin = new SeekableSliderHapticPlugin(
+ SeekbarHapticPlugin plugin = new SeekbarHapticPlugin(
mVibratorHelper,
mSystemClock);
if (hapticBrightnessSlider()) {
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java
index 92006a4..e051dab 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java
@@ -63,7 +63,6 @@
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- setLayerType(LAYER_TYPE_HARDWARE, null);
mSlider = requireViewById(R.id.slider);
mSlider.setAccessibilityLabel(getContentDescription().toString());
diff --git a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
index a8481cd..a5a5474 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
@@ -28,10 +28,14 @@
import androidx.activity.setViewTreeOnBackPressedDispatcherOwner
import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.android.compose.theme.PlatformTheme
import com.android.internal.annotations.VisibleForTesting
+import com.android.systemui.ambient.touch.TouchMonitor
+import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent
import com.android.systemui.communal.dagger.Communal
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.ui.compose.CommunalContainer
@@ -45,6 +49,8 @@
import com.android.systemui.scene.shared.model.SceneDataSourceDelegator
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.phone.SystemUIDialogFactory
+import com.android.systemui.util.kotlin.BooleanFlowOperators.and
+import com.android.systemui.util.kotlin.BooleanFlowOperators.not
import com.android.systemui.util.kotlin.BooleanFlowOperators.or
import com.android.systemui.util.kotlin.collectFlow
import javax.inject.Inject
@@ -67,12 +73,27 @@
private val shadeInteractor: ShadeInteractor,
private val powerManager: PowerManager,
private val communalColors: CommunalColors,
- @Communal private val dataSourceDelegator: SceneDataSourceDelegator,
-) {
+ private val ambientTouchComponentFactory: AmbientTouchComponent.Factory,
+ @Communal private val dataSourceDelegator: SceneDataSourceDelegator
+) : LifecycleOwner {
/** The container view for the hub. This will not be initialized until [initView] is called. */
private var communalContainerView: View? = null
/**
+ * This lifecycle is used to control when the [touchMonitor] listens to touches. The lifecycle
+ * should only be [Lifecycle.State.RESUMED] when the hub is showing and not covered by anything,
+ * such as the notification shade or bouncer.
+ */
+ private var lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
+
+ /**
+ * This [TouchMonitor] listens for top and bottom swipe gestures globally when the hub is open.
+ * When a top or bottom swipe is detected, they will be intercepted and used to open the
+ * notification shade/bouncer.
+ */
+ private var touchMonitor: TouchMonitor? = null
+
+ /**
* The width of the area in which a right edge swipe can open the hub, in pixels. Read from
* resources when [initView] is called.
*/
@@ -80,20 +101,6 @@
private var rightEdgeSwipeRegionWidth: Int = 0
/**
- * The height of the area in which a top edge swipe while the hub is open will not intercept
- * touches, in pixels. This allows the top edge swipe to instead open the notification shade.
- * Read from resources when [initView] is called.
- */
- private var topEdgeSwipeRegionWidth: Int = 0
-
- /**
- * The height of the area in which a bottom edge swipe while the hub is open will not intercept
- * touches, in pixels. This allows the bottom edge swipe to instead open the bouncer. Read from
- * resources when [initView] is called.
- */
- private var bottomEdgeSwipeRegionWidth: Int = 0
-
- /**
* True if we are currently tracking a gesture for opening the hub that started in the edge
* swipe region.
*/
@@ -102,9 +109,6 @@
/** 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.
*
@@ -121,9 +125,15 @@
private var anyBouncerShowing = false
/**
- * True if the shade is fully expanded, meaning the hub should not receive any touch input.
+ * True if the shade is fully expanded and the user is not interacting with it anymore, meaning
+ * the hub should not receive any touch input.
*
- * Tracks [ShadeInteractor.isAnyFullyExpanded].
+ * We need to not pause the touch handling lifecycle as soon as the shade opens because if the
+ * user swipes down, then back up without lifting their finger, the lifecycle will be paused
+ * then resumed, and resuming force-stops all active touch sessions. This means the shade will
+ * not receive the end of the gesture and will be stuck open.
+ *
+ * Based on [ShadeInteractor.isAnyFullyExpanded] and [ShadeInteractor.isUserInteracting].
*/
private var shadeShowing = false
@@ -132,8 +142,6 @@
* 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
@@ -192,28 +200,45 @@
throw RuntimeException("Communal view has already been initialized")
}
+ if (touchMonitor == null) {
+ touchMonitor =
+ ambientTouchComponentFactory.create(this, HashSet()).getTouchMonitor().apply {
+ init()
+ }
+ }
+ lifecycleRegistry.currentState = Lifecycle.State.CREATED
+
communalContainerView = containerView
rightEdgeSwipeRegionWidth =
containerView.resources.getDimensionPixelSize(
R.dimen.communal_right_edge_swipe_region_width
)
- topEdgeSwipeRegionWidth =
- containerView.resources.getDimensionPixelSize(
- R.dimen.communal_top_edge_swipe_region_height
- )
- bottomEdgeSwipeRegionWidth =
- containerView.resources.getDimensionPixelSize(
- R.dimen.communal_bottom_edge_swipe_region_height
- )
collectFlow(
containerView,
keyguardTransitionInteractor.isFinishedInStateWhere(KeyguardState::isBouncerState),
- { anyBouncerShowing = it }
+ {
+ anyBouncerShowing = it
+ updateLifecycleState()
+ }
)
- collectFlow(containerView, communalInteractor.isCommunalShowing, { hubShowing = it })
- collectFlow(containerView, shadeInteractor.isAnyFullyExpanded, { shadeShowing = it })
+ collectFlow(
+ containerView,
+ communalInteractor.isCommunalShowing,
+ {
+ hubShowing = it
+ updateLifecycleState()
+ }
+ )
+ collectFlow(
+ containerView,
+ and(shadeInteractor.isAnyFullyExpanded, not(shadeInteractor.isUserInteracting)),
+ {
+ shadeShowing = it
+ updateLifecycleState()
+ }
+ )
collectFlow(containerView, keyguardInteractor.isDreaming, { isDreaming = it })
communalContainerView = containerView
@@ -221,10 +246,24 @@
return containerView
}
+ /**
+ * Updates the lifecycle stored by the [lifecycleRegistry] to control when the [touchMonitor]
+ * should listen for and intercept top and bottom swipes.
+ */
+ private fun updateLifecycleState() {
+ val shouldInterceptGestures = hubShowing && !(shadeShowing || anyBouncerShowing)
+ if (shouldInterceptGestures) {
+ lifecycleRegistry.currentState = Lifecycle.State.RESUMED
+ } else {
+ lifecycleRegistry.currentState = Lifecycle.State.STARTED
+ }
+ }
+
/** Removes the container view from its parent. */
fun disposeView() {
communalContainerView?.let {
(it.parent as ViewGroup).removeView(it)
+ lifecycleRegistry.currentState = Lifecycle.State.CREATED
communalContainerView = null
}
}
@@ -262,15 +301,7 @@
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) {
- isTrackingHubGesture = true
- } else {
- isTrackingHubTouch = true
- }
+ isTrackingHubTouch = true
}
if (isTrackingHubTouch) {
@@ -283,19 +314,6 @@
// 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
@@ -347,4 +365,7 @@
0
)
}
+
+ override val lifecycle: Lifecycle
+ get() = lifecycleRegistry
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
index adcb14a..8b7e11c 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
@@ -448,6 +448,9 @@
|| mScreenOffAnimationController.shouldIgnoreKeyguardTouches()) {
mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE;
mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+ } else if (state.glanceableHubShowing) {
+ mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE;
+ mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM;
} else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) {
mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE;
// Make sure to remove FLAG_ALT_FOCUSABLE_IM when keyguard needs input.
@@ -611,6 +614,7 @@
state.panelVisible,
state.shadeOrQsExpanded,
state.notificationShadeFocusable,
+ state.glanceableHubShowing,
state.bouncerShowing,
state.keyguardFadingAway,
state.keyguardGoingAway,
@@ -740,6 +744,12 @@
}
@Override
+ public void setGlanceableHubShowing(boolean showing) {
+ mCurrentState.glanceableHubShowing = showing;
+ apply(mCurrentState);
+ }
+
+ @Override
public void setBackdropShowing(boolean showing) {
mCurrentState.mediaBackdropShowing = showing;
apply(mCurrentState);
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowState.kt b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowState.kt
index e0a98b3..6a4b52a 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowState.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowState.kt
@@ -35,6 +35,7 @@
@JvmField var shadeOrQsExpanded: Boolean = false,
@JvmField var notificationShadeFocusable: Boolean = false,
@JvmField var bouncerShowing: Boolean = false,
+ @JvmField var glanceableHubShowing: Boolean = false,
@JvmField var keyguardFadingAway: Boolean = false,
@JvmField var keyguardGoingAway: Boolean = false,
@JvmField var qsExpanded: Boolean = false,
@@ -79,6 +80,7 @@
shadeOrQsExpanded.toString(),
notificationShadeFocusable.toString(),
bouncerShowing.toString(),
+ glanceableHubShowing.toString(),
keyguardFadingAway.toString(),
keyguardGoingAway.toString(),
qsExpanded.toString(),
@@ -119,6 +121,7 @@
panelVisible: Boolean,
panelExpanded: Boolean,
notificationShadeFocusable: Boolean,
+ glanceableHubShowing: Boolean,
bouncerShowing: Boolean,
keyguardFadingAway: Boolean,
keyguardGoingAway: Boolean,
@@ -149,6 +152,7 @@
this.panelVisible = panelVisible
this.shadeOrQsExpanded = panelExpanded
this.notificationShadeFocusable = notificationShadeFocusable
+ this.glanceableHubShowing = glanceableHubShowing
this.bouncerShowing = bouncerShowing
this.keyguardFadingAway = keyguardFadingAway
this.keyguardGoingAway = keyguardGoingAway
@@ -197,6 +201,7 @@
"panelVisible",
"panelExpanded",
"notificationShadeFocusable",
+ "glanceableHubShowing",
"bouncerShowing",
"keyguardFadingAway",
"keyguardGoingAway",
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
index 907cf5e..44f86da 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
@@ -25,7 +25,6 @@
import android.app.StatusBarManager;
import android.util.Log;
import android.view.GestureDetector;
-import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
@@ -74,14 +73,14 @@
import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
import com.android.systemui.util.time.SystemClock;
+import kotlinx.coroutines.ExperimentalCoroutinesApi;
+
import java.io.PrintWriter;
import java.util.Optional;
import java.util.function.Consumer;
import javax.inject.Inject;
-import kotlinx.coroutines.ExperimentalCoroutinesApi;
-
/**
* Controller for {@link NotificationShadeWindowView}.
*/
@@ -137,6 +136,11 @@
private final PanelExpansionInteractor mPanelExpansionInteractor;
private final ShadeExpansionStateManager mShadeExpansionStateManager;
+ /**
+ * If {@code true}, an external touch sent in {@link #handleExternalTouch(MotionEvent)} has been
+ * intercepted and all future touch events for the gesture should be processed by this view.
+ */
+ private boolean mExternalTouchIntercepted = false;
private boolean mIsTrackingBarGesture = false;
private boolean mIsOcclusionTransitionRunning = false;
private DisableSubpixelTextTransitionListener mDisableSubpixelTextTransitionListener;
@@ -253,11 +257,28 @@
}
/**
- * Handle a touch event while dreaming by forwarding the event to the content view.
+ * Handle a touch event while dreaming or on the hub by forwarding the event to the content
+ * view.
+ * <p>
+ * Since important logic for handling touches lives in the dispatch/intercept phases, we
+ * simulate going through all of these stages before sending onTouchEvent if intercepted.
+ *
* @param event The event to forward.
*/
- public void handleDreamTouch(MotionEvent event) {
- mView.dispatchTouchEvent(event);
+ public void handleExternalTouch(MotionEvent event) {
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ mExternalTouchIntercepted = false;
+ }
+
+ if (!mView.dispatchTouchEvent(event)) {
+ return;
+ }
+ if (!mExternalTouchIntercepted) {
+ mExternalTouchIntercepted = mView.onInterceptTouchEvent(event);
+ }
+ if (mExternalTouchIntercepted) {
+ mView.onTouchEvent(event);
+ }
}
/** Inflates the {@link R.layout#status_bar_expanded} layout and sets it up. */
diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
index 2507507..6df8ac4 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
@@ -19,7 +19,6 @@
import static android.view.WindowInsets.Type.ime;
-import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE;
import static com.android.systemui.Flags.centralizedStatusBarHeightFix;
import static com.android.systemui.classifier.Classifier.QS_COLLAPSE;
import static com.android.systemui.shade.NotificationPanelViewController.COUNTER_PANEL_OPEN_QS;
@@ -57,6 +56,7 @@
import com.android.app.animation.Interpolators;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.jank.Cuj;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
@@ -153,7 +153,7 @@
private final DeviceEntryFaceAuthInteractor mDeviceEntryFaceAuthInteractor;
private final CastController mCastController;
private final SplitShadeStateController mSplitShadeStateController;
- private final InteractionJankMonitor mInteractionJankMonitor;
+ private final Lazy<InteractionJankMonitor> mInteractionJankMonitorLazy;
private final ShadeRepository mShadeRepository;
private final ShadeInteractor mShadeInteractor;
private final ActiveNotificationsInteractor mActiveNotificationsInteractor;
@@ -324,7 +324,7 @@
AccessibilityManager accessibilityManager,
LockscreenGestureLogger lockscreenGestureLogger,
MetricsLogger metricsLogger,
- InteractionJankMonitor interactionJankMonitor,
+ Lazy<InteractionJankMonitor> interactionJankMonitorLazy,
ShadeLogger shadeLog,
DumpManager dumpManager,
DeviceEntryFaceAuthInteractor deviceEntryFaceAuthInteractor,
@@ -375,7 +375,7 @@
mShadeLog = shadeLog;
mDeviceEntryFaceAuthInteractor = deviceEntryFaceAuthInteractor;
mCastController = castController;
- mInteractionJankMonitor = interactionJankMonitor;
+ mInteractionJankMonitorLazy = interactionJankMonitorLazy;
mShadeRepository = shadeRepository;
mShadeInteractor = shadeInteractor;
mActiveNotificationsInteractor = activeNotificationsInteractor;
@@ -2312,44 +2312,46 @@
}
void beginJankMonitoring(boolean isFullyCollapsed) {
- if (mInteractionJankMonitor == null) {
+ InteractionJankMonitor monitor = mInteractionJankMonitorLazy.get();
+ if (monitor == null) {
return;
}
// TODO (b/265193930): remove dependency on NPVC
InteractionJankMonitor.Configuration.Builder builder =
InteractionJankMonitor.Configuration.Builder.withView(
- InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE,
+ Cuj.CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE,
mPanelView).setTag(isFullyCollapsed ? "Expand" : "Collapse");
- mInteractionJankMonitor.begin(builder);
+ monitor.begin(builder);
}
void endJankMonitoring() {
- if (mInteractionJankMonitor == null) {
+ InteractionJankMonitor monitor = mInteractionJankMonitorLazy.get();
+ if (monitor == null) {
return;
}
- InteractionJankMonitor.getInstance().end(
- InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
+ monitor.end(Cuj.CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
}
void cancelJankMonitoring() {
- if (mInteractionJankMonitor == null) {
+ InteractionJankMonitor monitor = mInteractionJankMonitorLazy.get();
+ if (monitor == null) {
return;
}
- InteractionJankMonitor.getInstance().cancel(
- InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
+ monitor.cancel(Cuj.CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
}
void traceQsJank(boolean startTracing, boolean wasCancelled) {
- if (mInteractionJankMonitor == null) {
+ InteractionJankMonitor monitor = mInteractionJankMonitorLazy.get();
+ if (monitor == null) {
return;
}
if (startTracing) {
- mInteractionJankMonitor.begin(mPanelView, CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE);
+ monitor.begin(mPanelView, Cuj.CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE);
} else {
if (wasCancelled) {
- mInteractionJankMonitor.cancel(CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE);
+ monitor.cancel(Cuj.CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE);
} else {
- mInteractionJankMonitor.end(CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE);
+ monitor.end(Cuj.CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java
index e669556..707d59aa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java
@@ -86,6 +86,9 @@
/** Sets the state of whether the bouncer is showing or not. */
default void setBouncerShowing(boolean showing) {}
+ /** Sets the state of whether the glanceable hub is showing or not. */
+ default void setGlanceableHubShowing(boolean showing) {}
+
/** Sets the state of whether the backdrop is showing or not. */
default void setBackdropShowing(boolean showing) {}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index aa6bec1..4f8c3caa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -106,7 +106,7 @@
private final ArrayList<RankedListener> mListeners = new ArrayList<>();
private final UiEventLogger mUiEventLogger;
- private final InteractionJankMonitor mInteractionJankMonitor;
+ private final Lazy<InteractionJankMonitor> mInteractionJankMonitorLazy;
private final JavaAdapter mJavaAdapter;
private final Lazy<ShadeInteractor> mShadeInteractorLazy;
private final Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy;
@@ -173,14 +173,14 @@
@Inject
public StatusBarStateControllerImpl(
UiEventLogger uiEventLogger,
- InteractionJankMonitor interactionJankMonitor,
+ Lazy<InteractionJankMonitor> interactionJankMonitorLazy,
JavaAdapter javaAdapter,
Lazy<ShadeInteractor> shadeInteractorLazy,
Lazy<DeviceUnlockedInteractor> deviceUnlockedInteractorLazy,
Lazy<SceneInteractor> sceneInteractorLazy,
Lazy<KeyguardClockInteractor> keyguardClockInteractorLazy) {
mUiEventLogger = uiEventLogger;
- mInteractionJankMonitor = interactionJankMonitor;
+ mInteractionJankMonitorLazy = interactionJankMonitorLazy;
mJavaAdapter = javaAdapter;
mShadeInteractorLazy = shadeInteractorLazy;
mDeviceUnlockedInteractorLazy = deviceUnlockedInteractorLazy;
@@ -482,7 +482,8 @@
private void beginInteractionJankMonitor() {
final boolean shouldPost =
(mIsDozing && mDozeAmount == 0) || (!mIsDozing && mDozeAmount == 1);
- if (mInteractionJankMonitor != null && mView != null && mView.isAttachedToWindow()) {
+ InteractionJankMonitor monitor = mInteractionJankMonitorLazy.get();
+ if (monitor != null && mView != null && mView.isAttachedToWindow()) {
if (shouldPost) {
Choreographer.getInstance().postCallback(
Choreographer.CALLBACK_ANIMATION, this::beginInteractionJankMonitor, null);
@@ -490,23 +491,25 @@
Configuration.Builder builder = Configuration.Builder.withView(getCujType(), mView)
.setTag(getClockId())
.setDeferMonitorForAnimationStart(false);
- mInteractionJankMonitor.begin(builder);
+ monitor.begin(builder);
}
}
}
private void endInteractionJankMonitor() {
- if (mInteractionJankMonitor == null) {
+ InteractionJankMonitor monitor = mInteractionJankMonitorLazy.get();
+ if (monitor == null) {
return;
}
- mInteractionJankMonitor.end(getCujType());
+ monitor.end(getCujType());
}
private void cancelInteractionJankMonitor() {
- if (mInteractionJankMonitor == null) {
+ InteractionJankMonitor monitor = mInteractionJankMonitorLazy.get();
+ if (monitor == null) {
return;
}
- mInteractionJankMonitor.cancel(getCujType());
+ monitor.cancel(getCujType());
}
private int getCujType() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java
index 724b19c..e3c47a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java
@@ -83,6 +83,10 @@
import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.util.CarrierConfigTracker;
+import dalvik.annotation.optimization.NeverCompile;
+
+import kotlin.Unit;
+
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -97,9 +101,6 @@
import javax.inject.Inject;
-import dalvik.annotation.optimization.NeverCompile;
-import kotlin.Unit;
-
/** Platform implementation of the network controller. **/
@SysUISingleton
public class NetworkControllerImpl extends BroadcastReceiver
@@ -464,7 +465,10 @@
});
};
- mDemoModeController.addCallback(this);
+ // TODO(b/336357360): Until we can remove this class entirely, disable its handling of ALL
+ // demo mode commands, due to the fact that the mobile command handler has an infinite
+ // loop bug if you use any slot other than 1.
+ // mDemoModeController.addCallback(this);
mDumpManager.registerNormalDumpable(TAG, this);
}
@@ -1317,6 +1321,8 @@
int carrierId = TextUtils.isEmpty(carrierIdString) ? 0
: Integer.parseInt(carrierIdString);
// Ensure we have enough sim slots
+ // TODO(b/336357360): This is the origination of the infinite loop bug, for those
+ // following along at home.
List<SubscriptionInfo> subs = new ArrayList<>();
while (mMobileSignalControllers.size() <= slot) {
int nextSlot = mMobileSignalControllers.size();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
index 9bb860f..594c191 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
@@ -41,7 +41,6 @@
import com.android.systemui.shade.ShadeSurface;
import com.android.systemui.shade.ShadeSurfaceImpl;
import com.android.systemui.shade.carrier.ShadeCarrierGroupController;
-import com.android.systemui.startable.Dependencies;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationClickNotifier;
import com.android.systemui.statusbar.NotificationMediaManager;
@@ -53,7 +52,6 @@
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
-import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.CentralSurfacesImpl;
import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl;
@@ -70,8 +68,6 @@
import dagger.multibindings.ClassKey;
import dagger.multibindings.IntoMap;
-import java.util.Set;
-
import javax.inject.Provider;
/**
@@ -161,15 +157,6 @@
CoreStartable bindsStartStatusBarStateController(StatusBarStateControllerImpl sbsc);
/** */
- @Provides
- @IntoMap
- @Dependencies
- @ClassKey(SysuiStatusBarStateController.class)
- static Set<Class<? extends CoreStartable>> providesStatusBarStateControllerDeps() {
- return Set.of(CentralSurfaces.class);
- }
-
- /** */
@Binds
StatusBarIconController provideStatusBarIconController(
StatusBarIconControllerImpl controllerImpl);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HeadsUpStyleProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HeadsUpStyleProvider.kt
new file mode 100644
index 0000000..816e5c1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HeadsUpStyleProvider.kt
@@ -0,0 +1,37 @@
+/*
+ * 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.row
+
+import android.app.Flags
+import javax.inject.Inject
+
+/**
+ * A class managing the heads up style to be applied based on user settings, immersive mode and
+ * other factors.
+ */
+interface HeadsUpStyleProvider {
+ fun shouldApplyCompactStyle(): Boolean
+}
+
+class HeadsUpStyleProviderImpl @Inject constructor() : HeadsUpStyleProvider {
+
+ /**
+ * TODO(b/270709257) This feature is under development. This method returns Compact when the
+ * flag is enabled for fish fooding purpose.
+ */
+ override fun shouldApplyCompactStyle(): Boolean = Flags.compactHeadsUpNotification()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
index 31e69c9..2f03871 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
@@ -90,6 +90,8 @@
private final Executor mInflationExecutor;
private final SmartReplyStateInflater mSmartReplyStateInflater;
private final NotifLayoutInflaterFactory.Provider mNotifLayoutInflaterFactoryProvider;
+ private final HeadsUpStyleProvider mHeadsUpStyleProvider;
+
private final NotificationContentInflaterLogger mLogger;
@Inject
@@ -101,6 +103,7 @@
@NotifInflation Executor inflationExecutor,
SmartReplyStateInflater smartRepliesInflater,
NotifLayoutInflaterFactory.Provider notifLayoutInflaterFactoryProvider,
+ HeadsUpStyleProvider headsUpStyleProvider,
NotificationContentInflaterLogger logger) {
mRemoteViewCache = remoteViewCache;
mRemoteInputManager = remoteInputManager;
@@ -109,6 +112,7 @@
mInflationExecutor = inflationExecutor;
mSmartReplyStateInflater = smartRepliesInflater;
mNotifLayoutInflaterFactoryProvider = notifLayoutInflaterFactoryProvider;
+ mHeadsUpStyleProvider = headsUpStyleProvider;
mLogger = logger;
}
@@ -158,6 +162,7 @@
/* isMediaFlagEnabled = */ mIsMediaInQS,
mSmartReplyStateInflater,
mNotifLayoutInflaterFactoryProvider,
+ mHeadsUpStyleProvider,
mLogger);
if (mInflateSynchronously) {
task.onPostExecute(task.doInBackground());
@@ -184,6 +189,7 @@
packageContext,
row,
mNotifLayoutInflaterFactoryProvider,
+ mHeadsUpStyleProvider,
mLogger);
result = inflateSmartReplyViews(result, reInflateFlags, entry, row.getContext(),
@@ -370,6 +376,7 @@
boolean usesIncreasedHeadsUpHeight, Context packageContext,
ExpandableNotificationRow row,
NotifLayoutInflaterFactory.Provider notifLayoutInflaterFactoryProvider,
+ HeadsUpStyleProvider headsUpStyleProvider,
NotificationContentInflaterLogger logger) {
return TraceUtils.trace("NotificationContentInflater.createRemoteViews", () -> {
InflationProgress result = new InflationProgress();
@@ -388,8 +395,13 @@
if ((reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0) {
logger.logAsyncTaskProgress(entryForLogging, "creating heads up remote view");
- result.newHeadsUpView = builder.createHeadsUpContentView(
- usesIncreasedHeadsUpHeight);
+ final boolean isHeadsUpCompact = headsUpStyleProvider.shouldApplyCompactStyle();
+ if (isHeadsUpCompact) {
+ result.newHeadsUpView = builder.createCompactHeadsUpContentView();
+ } else {
+ result.newHeadsUpView = builder.createHeadsUpContentView(
+ usesIncreasedHeadsUpHeight);
+ }
}
if ((reInflateFlags & FLAG_CONTENT_VIEW_PUBLIC) != 0) {
@@ -1067,6 +1079,7 @@
private final boolean mIsMediaInQS;
private final SmartReplyStateInflater mSmartRepliesInflater;
private final NotifLayoutInflaterFactory.Provider mNotifLayoutInflaterFactoryProvider;
+ private final HeadsUpStyleProvider mHeadsUpStyleProvider;
private final NotificationContentInflaterLogger mLogger;
private AsyncInflationTask(
@@ -1085,6 +1098,7 @@
boolean isMediaFlagEnabled,
SmartReplyStateInflater smartRepliesInflater,
NotifLayoutInflaterFactory.Provider notifLayoutInflaterFactoryProvider,
+ HeadsUpStyleProvider headsUpStyleProvider,
NotificationContentInflaterLogger logger) {
mEntry = entry;
mRow = row;
@@ -1102,6 +1116,7 @@
mConversationProcessor = conversationProcessor;
mIsMediaInQS = isMediaFlagEnabled;
mNotifLayoutInflaterFactoryProvider = notifLayoutInflaterFactoryProvider;
+ mHeadsUpStyleProvider = headsUpStyleProvider;
mLogger = logger;
entry.setInflationTask(this);
}
@@ -1166,7 +1181,7 @@
InflationProgress inflationProgress = createRemoteViews(mReInflateFlags,
recoveredBuilder, mIsMinimized, mUsesIncreasedHeight,
mUsesIncreasedHeadsUpHeight, packageContext, mRow,
- mNotifLayoutInflaterFactoryProvider, mLogger);
+ mNotifLayoutInflaterFactoryProvider, mHeadsUpStyleProvider, mLogger);
mLogger.logAsyncTaskProgress(mEntry,
"getting existing smart reply state (on wrong thread!)");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java
index 200a08a..17c2026 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java
@@ -50,4 +50,12 @@
@SysUISingleton
public abstract NotifRemoteViewsFactoryContainer provideNotifRemoteViewsFactoryContainer(
NotifRemoteViewsFactoryContainerImpl containerImpl);
+
+ /**
+ * Provides heads up style manager
+ */
+ @Binds
+ @SysUISingleton
+ public abstract HeadsUpStyleProvider provideHeadsUpStyleManager(
+ HeadsUpStyleProviderImpl headsUpStyleManagerImpl);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCompactHeadsUpTemplateViewWrapper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCompactHeadsUpTemplateViewWrapper.kt
new file mode 100644
index 0000000..ce87d2f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCompactHeadsUpTemplateViewWrapper.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.systemui.statusbar.notification.row.wrapper
+
+import android.content.Context
+import android.view.View
+import com.android.systemui.statusbar.notification.FeedbackIcon
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+
+/**
+ * Compact Heads up Notifications template that doesn't set feedback icon and audibly alert icons
+ */
+class NotificationCompactHeadsUpTemplateViewWrapper(
+ ctx: Context,
+ view: View,
+ row: ExpandableNotificationRow
+) : NotificationTemplateViewWrapper(ctx, view, row) {
+ override fun setFeedbackIcon(icon: FeedbackIcon?) = Unit
+ override fun setRecentlyAudiblyAlerted(audiblyAlerted: Boolean) = Unit
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
index 50f3e78..4244542 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
@@ -72,7 +72,10 @@
return new NotificationConversationTemplateViewWrapper(ctx, v, row);
} else if ("call".equals(v.getTag())) {
return new NotificationCallTemplateViewWrapper(ctx, v, row);
+ } else if ("compactHUN".equals((v.getTag()))) {
+ return new NotificationCompactHeadsUpTemplateViewWrapper(ctx, v, row);
}
+
if (row.getEntry().getSbn().getNotification().isStyle(
Notification.DecoratedCustomViewStyle.class)) {
return new NotificationDecoratedCustomViewWrapper(ctx, v, row);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
index dedf366..e520957 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
@@ -38,6 +38,7 @@
import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.BypassController;
import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.policy.AvalancheController;
import java.io.PrintWriter;
@@ -56,6 +57,8 @@
private final SectionProvider mSectionProvider;
private final BypassController mBypassController;
private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
+ private final AvalancheController mAvalancheController;
+
/**
* Used to read bouncer states.
*/
@@ -269,12 +272,14 @@
@NonNull SectionProvider sectionProvider,
@NonNull BypassController bypassController,
@Nullable StatusBarKeyguardViewManager statusBarKeyguardViewManager,
- @NonNull LargeScreenShadeInterpolator largeScreenShadeInterpolator
+ @NonNull LargeScreenShadeInterpolator largeScreenShadeInterpolator,
+ AvalancheController avalancheController
) {
mSectionProvider = sectionProvider;
mBypassController = bypassController;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
+ mAvalancheController = avalancheController;
reload(context);
dumpManager.registerDumpable(this);
}
@@ -287,6 +292,14 @@
mBaseZHeight = getBaseHeight(mZDistanceBetweenElements);
}
+ String getAvalancheShowingHunKey() {
+ return mAvalancheController.getShowingHunKey();
+ }
+
+ String getAvalanchePreviousHunKey() {
+ return mAvalancheController.getPreviousHunKey();
+ }
+
void setOverExpansion(float overExpansion) {
mOverExpansion = overExpansion;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
index 8fb552f..7d97428 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
@@ -283,11 +283,12 @@
void awakenDreams();
/**
- * Handle a touch event while dreaming when the touch was initiated within a prescribed
- * swipeable area. This method is provided for cases where swiping in certain areas of a dream
- * should be handled by CentralSurfaces instead (e.g. swiping communal hub open).
+ * Handle a touch event while dreaming or on the glanceable hub when the touch was initiated
+ * within a prescribed swipeable area. This method is provided for cases where swiping in
+ * certain areas should be handled by CentralSurfaces instead (e.g. swiping hub open, opening
+ * the notification shade over dream or hub).
*/
- void handleDreamTouch(MotionEvent event);
+ void handleExternalShadeWindowTouch(MotionEvent event);
boolean isBouncerShowing();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt
index 8af7ee8..d5e66ff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt
@@ -79,7 +79,7 @@
override fun updateScrimController() {}
override fun shouldIgnoreTouch() = false
override fun isDeviceInteractive() = false
- override fun handleDreamTouch(event: MotionEvent?) {}
+ override fun handleExternalShadeWindowTouch(event: MotionEvent?) {}
override fun awakenDreams() {}
override fun isBouncerShowing() = false
override fun isBouncerShowingScrimmed() = false
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index e9aa7aa..b2b2cea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -2928,8 +2928,8 @@
};
@Override
- public void handleDreamTouch(MotionEvent event) {
- getNotificationShadeWindowViewController().handleDreamTouch(event);
+ public void handleExternalShadeWindowTouch(MotionEvent event) {
+ getNotificationShadeWindowViewController().handleExternalTouch(event);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt
index 4211cab..66e909c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt
@@ -70,7 +70,7 @@
fun logSendPendingIntent(entry: NotificationEntry, pendingIntent: PendingIntent, result: Int) {
buffer.log(TAG, INFO, {
str1 = entry.logKey
- str2 = pendingIntent.intent.toString()
+ str2 = pendingIntent.intent?.toString()
int1 = result
}, {
"(5/5) Started intent $str2 for notification $str1 with result code $int1"
@@ -120,7 +120,7 @@
fun logSendingFullScreenIntent(entry: NotificationEntry, pendingIntent: PendingIntent) {
buffer.log(TAG, INFO, {
str1 = entry.logKey
- str2 = pendingIntent.intent.toString()
+ str2 = pendingIntent.intent?.toString()
}, {
"Notification $str1 has fullScreenIntent; sending fullScreenIntent $str2"
})
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
index 4129b3a..b80ff38 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
@@ -42,6 +42,8 @@
import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxyImpl
import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.data.prod.DeviceBasedSatelliteRepositoryImpl
+import com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel.DeviceBasedSatelliteViewModel
+import com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel.DeviceBasedSatelliteViewModelImpl
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepositoryImpl
import com.android.systemui.statusbar.pipeline.shared.ui.binder.CollapsedStatusBarViewBinder
@@ -85,6 +87,11 @@
impl: DeviceBasedSatelliteRepositoryImpl
): DeviceBasedSatelliteRepository
+ @Binds
+ abstract fun deviceBasedSatelliteViewModel(
+ impl: DeviceBasedSatelliteViewModelImpl
+ ): DeviceBasedSatelliteViewModel
+
@Binds abstract fun wifiRepository(impl: WifiRepositorySwitcher): WifiRepository
@Binds abstract fun wifiInteractor(impl: WifiInteractorImpl): WifiInteractor
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 a0291b8..f2255f3 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
@@ -16,13 +16,16 @@
package com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel
+import android.content.Context
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.LogLevel
+import com.android.systemui.res.R
import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository
import com.android.systemui.statusbar.pipeline.dagger.OemSatelliteInputLog
import com.android.systemui.statusbar.pipeline.satellite.domain.interactor.DeviceBasedSatelliteInteractor
+import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.pipeline.satellite.ui.model.SatelliteIconModel
import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds
@@ -42,15 +45,30 @@
* View-Model for the device-based satellite icon. This icon will only show in the status bar if
* satellite is available AND all other service states are considered OOS.
*/
+interface DeviceBasedSatelliteViewModel {
+ /**
+ * The satellite icon that should be displayed, or null if no satellite icon should be
+ * displayed.
+ */
+ val icon: StateFlow<Icon?>
+
+ /**
+ * The satellite-related text that should be used as the carrier text string when satellite is
+ * active, or null if the carrier text string shouldn't include any satellite information.
+ */
+ val carrierText: StateFlow<String?>
+}
+
@OptIn(ExperimentalCoroutinesApi::class)
-class DeviceBasedSatelliteViewModel
+class DeviceBasedSatelliteViewModelImpl
@Inject
constructor(
+ context: Context,
interactor: DeviceBasedSatelliteInteractor,
@Application scope: CoroutineScope,
airplaneModeRepository: AirplaneModeRepository,
@OemSatelliteInputLog logBuffer: LogBuffer,
-) {
+) : DeviceBasedSatelliteViewModel {
private val shouldShowIcon: Flow<Boolean> =
interactor.areAllConnectionsOutOfService.flatMapLatest { allOos ->
if (!allOos) {
@@ -87,7 +105,7 @@
}
.stateIn(scope, SharingStarted.WhileSubscribed(), false)
- val icon: StateFlow<Icon?> =
+ override val icon: StateFlow<Icon?> =
combine(
shouldActuallyShowIcon,
interactor.connectionState,
@@ -101,6 +119,26 @@
}
.stateIn(scope, SharingStarted.WhileSubscribed(), null)
+ override val carrierText: StateFlow<String?> =
+ combine(
+ shouldActuallyShowIcon,
+ interactor.connectionState,
+ ) { shouldShow, connectionState ->
+ if (shouldShow) {
+ when (connectionState) {
+ SatelliteConnectionState.Connected ->
+ context.getString(R.string.satellite_connected_carrier_text)
+ SatelliteConnectionState.On ->
+ context.getString(R.string.satellite_not_connected_carrier_text)
+ SatelliteConnectionState.Off,
+ SatelliteConnectionState.Unknown -> null
+ }
+ } else {
+ null
+ }
+ }
+ .stateIn(scope, SharingStarted.WhileSubscribed(), null)
+
companion object {
private const val TAG = "DeviceBasedSatelliteViewModel"
private val DELAY_DURATION = 10.seconds
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt
index f573530..2670a95 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt
@@ -40,6 +40,9 @@
// HUN showing right now, in the floating state where full shade is hidden, on launcher or AOD
@VisibleForTesting var headsUpEntryShowing: HeadsUpEntry? = null
+ // Key of HUN previously showing, is being removed or was removed
+ var previousHunKey: String = ""
+
// List of runnables to run for the HUN showing right now
private var headsUpEntryShowingRunnableList: MutableList<Runnable> = ArrayList()
@@ -63,6 +66,10 @@
dumpManager.registerNormalDumpable(tag, /* module */ this)
}
+ fun getShowingHunKey(): String {
+ return getKey(headsUpEntryShowing)
+ }
+
/** Run or delay Runnable for given HeadsUpEntry */
fun update(entry: HeadsUpEntry?, runnable: Runnable, label: String) {
if (!NotificationThrottleHun.isEnabled) {
@@ -134,8 +141,10 @@
debugDropSet.remove(entry)
} else if (isShowing(entry)) {
log { "$fn => [remove showing ${getKey(entry)}]" }
+ previousHunKey = getKey(headsUpEntryShowing)
+
runnable.run()
- showNext()
+ showNextAfterRemove()
} else {
log { "$fn => [removing untracked ${getKey(entry)}]" }
}
@@ -153,27 +162,45 @@
// Use default duration, like we did before AvalancheController existed
return autoDismissMs
}
-
val showingList: MutableList<HeadsUpEntry> = mutableListOf()
- headsUpEntryShowing?.let { showingList.add(it) }
-
+ if (headsUpEntryShowing != null) {
+ showingList.add(headsUpEntryShowing!!)
+ }
nextList.sort()
val entryList = showingList + nextList
- val thisEntryIndex = entryList.indexOf(entry)
+ if (entryList.isEmpty()) {
+ log { "No avalanche HUNs, use default ms: $autoDismissMs" }
+ return autoDismissMs
+ }
+ // entryList.indexOf(entry) returns -1 even when the entry is in entryList
+ var thisEntryIndex = -1
+ for ((i, e) in entryList.withIndex()) {
+ if (e == entry) {
+ thisEntryIndex = i
+ }
+ }
+ if (thisEntryIndex == -1) {
+ log { "Untracked entry, use default ms: $autoDismissMs" }
+ return autoDismissMs
+ }
val nextEntryIndex = thisEntryIndex + 1
// If last entry, use default duration
if (nextEntryIndex >= entryList.size) {
+ log { "Last entry, use default ms: $autoDismissMs" }
return autoDismissMs
}
val nextEntry = entryList[nextEntryIndex]
if (nextEntry.compareNonTimeFields(entry) == -1) {
// Next entry is higher priority
+ log { "Next entry is higher priority: 500ms" }
return 500
} else if (nextEntry.compareNonTimeFields(entry) == 0) {
// Next entry is same priority
+ log { "Next entry is same priority: 1000ms" }
return 1000
} else {
+ log { "Next entry is lower priority, use default ms: $autoDismissMs" }
return autoDismissMs
}
}
@@ -220,7 +247,7 @@
}
}
- private fun showNext() {
+ private fun showNextAfterRemove() {
log { "SHOW NEXT" }
headsUpEntryShowing = null
@@ -266,6 +293,7 @@
private fun getStateStr(): String {
return "SHOWING: [${getKey(headsUpEntryShowing)}]" +
+ "\nPREVIOUS: [$previousHunKey]" +
"\nNEXT LIST: $nextListStr" +
"\nNEXT MAP: $nextMapStr" +
"\nDROPPED: $dropSetStr"
@@ -307,10 +335,10 @@
fun getKey(entry: HeadsUpEntry?): String {
if (entry == null) {
- return "null"
+ return "HeadsUpEntry null"
}
if (entry.mEntry == null) {
- return entry.toString()
+ return "HeadsUpEntry.mEntry null"
}
return entry.mEntry!!.key
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java
index b98eff8..615cc74 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java
@@ -51,7 +51,7 @@
public class FlashlightControllerImpl implements FlashlightController {
private static final String TAG = "FlashlightController";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean DEBUG = true;
private static final int DISPATCH_ERROR = 0;
private static final int DISPATCH_CHANGED = 1;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 2245541..cd82e1d 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -118,7 +118,7 @@
import com.android.systemui.Prefs;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.haptics.slider.HapticSliderViewBinder;
-import com.android.systemui.haptics.slider.SeekableSliderHapticPlugin;
+import com.android.systemui.haptics.slider.SeekbarHapticPlugin;
import com.android.systemui.haptics.slider.SliderHapticFeedbackConfig;
import com.android.systemui.media.dialog.MediaOutputDialogManager;
import com.android.systemui.plugins.VolumeDialog;
@@ -2640,7 +2640,7 @@
private ObjectAnimator anim; // slider progress animation for non-touch-related updates
private int animTargetProgress;
private int lastAudibleLevel = 1;
- private SeekableSliderHapticPlugin mHapticPlugin;
+ private SeekbarHapticPlugin mHapticPlugin;
private int mProgressHapticsType = PROGRESS_HAPTICS_DISABLED;
void setIcon(int iconRes, Resources.Theme theme) {
@@ -2658,7 +2658,7 @@
com.android.systemui.util.time.SystemClock systemClock) {
if (mHapticPlugin != null) return;
- mHapticPlugin = new SeekableSliderHapticPlugin(
+ mHapticPlugin = new SeekbarHapticPlugin(
vibratorHelper,
systemClock,
sSliderHapticFeedbackConfig);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractor.kt
new file mode 100644
index 0000000..ed44699
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractor.kt
@@ -0,0 +1,131 @@
+/*
+ * 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.volume.domain.interactor
+
+import android.bluetooth.BluetoothAdapter
+import android.media.AudioDeviceInfo
+import android.media.AudioDeviceInfo.TYPE_WIRED_HEADPHONES
+import android.media.AudioDeviceInfo.TYPE_WIRED_HEADSET
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.settingslib.media.BluetoothMediaDevice
+import com.android.settingslib.media.MediaDevice
+import com.android.settingslib.media.MediaDevice.MediaDeviceType
+import com.android.settingslib.volume.data.repository.AudioRepository
+import com.android.settingslib.volume.domain.interactor.AudioModeInteractor
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.volume.domain.model.AudioOutputDevice
+import com.android.systemui.volume.panel.component.mediaoutput.data.repository.LocalMediaRepositoryFactory
+import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor
+import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
+import javax.inject.Inject
+import kotlin.coroutines.CoroutineContext
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.stateIn
+
+/** Provides a currently active audio device data. */
+@VolumePanelScope
+@OptIn(ExperimentalCoroutinesApi::class)
+class AudioOutputInteractor
+@Inject
+constructor(
+ audioRepository: AudioRepository,
+ audioModeInteractor: AudioModeInteractor,
+ @VolumePanelScope scope: CoroutineScope,
+ @Background backgroundCoroutineContext: CoroutineContext,
+ private val localBluetoothManager: LocalBluetoothManager?,
+ private val bluetoothAdapter: BluetoothAdapter?,
+ private val deviceIconInteractor: DeviceIconInteractor,
+ private val mediaOutputInteractor: MediaOutputInteractor,
+ private val localMediaRepositoryFactory: LocalMediaRepositoryFactory,
+) {
+
+ val currentAudioDevice: Flow<AudioOutputDevice> =
+ audioModeInteractor.isOngoingCall
+ .flatMapLatest { isOngoingCall ->
+ if (isOngoingCall) {
+ audioRepository.communicationDevice.map { communicationDevice ->
+ communicationDevice?.toAudioOutputDevice()
+ }
+ } else {
+ mediaOutputInteractor.defaultActiveMediaSession
+ .flatMapLatest {
+ localMediaRepositoryFactory
+ .create(it?.packageName)
+ .currentConnectedDevice
+ }
+ .map { mediaDevice -> mediaDevice?.toAudioOutputDevice() }
+ }
+ }
+ .map { it ?: AudioOutputDevice.Unknown }
+ .flowOn(backgroundCoroutineContext)
+ .stateIn(scope, SharingStarted.Eagerly, AudioOutputDevice.Unknown)
+
+ private fun AudioDeviceInfo.toAudioOutputDevice(): AudioOutputDevice {
+ if (type == TYPE_WIRED_HEADPHONES || type == TYPE_WIRED_HEADSET) {
+ return AudioOutputDevice.Wired(
+ name = productName.toString(),
+ icon = deviceIconInteractor.loadIcon(type),
+ )
+ }
+ val cachedBluetoothDevice: CachedBluetoothDevice? =
+ if (address.isEmpty() || localBluetoothManager == null || bluetoothAdapter == null) {
+ null
+ } else {
+ val remoteDevice = bluetoothAdapter.getRemoteDevice(address)
+ localBluetoothManager.cachedDeviceManager.findDevice(remoteDevice)
+ }
+ return cachedBluetoothDevice?.let {
+ AudioOutputDevice.Bluetooth(
+ name = it.name,
+ icon = deviceIconInteractor.loadIcon(it),
+ cachedBluetoothDevice = it,
+ )
+ }
+ ?: AudioOutputDevice.BuiltIn(
+ name = productName.toString(),
+ icon = deviceIconInteractor.loadIcon(type),
+ )
+ }
+
+ private fun MediaDevice.toAudioOutputDevice(): AudioOutputDevice {
+ return when {
+ this is BluetoothMediaDevice ->
+ AudioOutputDevice.Bluetooth(
+ name = name,
+ icon = icon,
+ cachedBluetoothDevice = cachedDevice,
+ )
+ deviceType == MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE ->
+ AudioOutputDevice.Wired(
+ name = name,
+ icon = icon,
+ )
+ else ->
+ AudioOutputDevice.BuiltIn(
+ name = name,
+ icon = icon,
+ )
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/DeviceIconInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/DeviceIconInteractor.kt
new file mode 100644
index 0000000..a2f7d4a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/DeviceIconInteractor.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.volume.domain.interactor
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.media.AudioDeviceInfo
+import com.android.settingslib.R
+import com.android.settingslib.bluetooth.BluetoothUtils
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.media.DeviceIconUtil
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
+import javax.inject.Inject
+
+/** Utility class to load an icon for a [CachedBluetoothDevice]. */
+@VolumePanelScope
+@SuppressLint("UseCompatLoadingForDrawables")
+class DeviceIconInteractor @Inject constructor(@Application private val context: Context) {
+
+ private val iconUtil: DeviceIconUtil = DeviceIconUtil(context)
+
+ fun loadIcon(@AudioDeviceInfo.AudioDeviceType type: Int): Drawable? =
+ context.getDrawable(iconUtil.getIconResIdFromAudioDeviceType(type))
+
+ fun loadIcon(cachedDevice: CachedBluetoothDevice): Drawable? {
+ return if (BluetoothUtils.isAdvancedUntetheredDevice(cachedDevice.device))
+ context.getDrawable(R.drawable.ic_earbuds_advanced)
+ else BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).first
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/domain/model/AudioOutputDevice.kt b/packages/SystemUI/src/com/android/systemui/volume/domain/model/AudioOutputDevice.kt
new file mode 100644
index 0000000..ba0b082
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/domain/model/AudioOutputDevice.kt
@@ -0,0 +1,55 @@
+/*
+ * 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.volume.domain.model
+
+import android.graphics.drawable.Drawable
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+
+/** Models an audio output device. */
+sealed interface AudioOutputDevice {
+
+ val name: String
+ val icon: Drawable?
+
+ /** Models a built audio output device. */
+ data class BuiltIn(
+ override val name: String,
+ override val icon: Drawable?,
+ ) : AudioOutputDevice
+
+ /** Models a wired audio output device. */
+ data class Wired(
+ override val name: String,
+ override val icon: Drawable?,
+ ) : AudioOutputDevice
+
+ /** Models a bluetooth audio output device. */
+ data class Bluetooth(
+ override val name: String,
+ override val icon: Drawable?,
+ val cachedBluetoothDevice: CachedBluetoothDevice,
+ ) : AudioOutputDevice
+
+ /** Models a state when the current audio output device is unknown. */
+ data object Unknown : AudioOutputDevice {
+ override val name: String
+ get() = error("Unsupported for unknown device")
+
+ override val icon: Drawable
+ get() = error("Unsupported for unknown device")
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputActionsInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputActionsInteractor.kt
index eebb6fb..22c0530 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputActionsInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputActionsInteractor.kt
@@ -21,7 +21,7 @@
import com.android.systemui.animation.DialogTransitionAnimator
import com.android.systemui.animation.Expandable
import com.android.systemui.media.dialog.MediaOutputDialogManager
-import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlayback
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlaybackState
import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
import javax.inject.Inject
@@ -33,10 +33,10 @@
private val mediaOutputDialogManager: MediaOutputDialogManager,
) {
- fun onBarClick(sessionWithPlayback: SessionWithPlayback?, expandable: Expandable) {
- if (sessionWithPlayback?.playback?.isActive == true) {
+ fun onBarClick(sessionWithPlaybackState: SessionWithPlaybackState?, expandable: Expandable) {
+ if (sessionWithPlaybackState?.isPlaybackActive == true) {
mediaOutputDialogManager.createAndShowWithController(
- sessionWithPlayback.session.packageName,
+ sessionWithPlaybackState.session.packageName,
false,
expandable.dialogController()
)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
index 41ad035..83b8029 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
@@ -94,7 +94,7 @@
/** Currently connected [MediaDevice]. */
val currentConnectedDevice: Flow<MediaDevice?> =
- localMediaRepository.flatMapLatest { it.currentConnectedDevice }
+ localMediaRepository.flatMapLatest { it.currentConnectedDevice }.distinctUntilChanged()
private suspend fun getApplicationLabel(packageName: String): CharSequence? {
return try {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlaybackState.kt
similarity index 86%
rename from packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
rename to packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlaybackState.kt
index c4476fc..bac969d 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlaybackState.kt
@@ -16,9 +16,7 @@
package com.android.systemui.volume.panel.component.mediaoutput.shared.model
-import android.media.session.PlaybackState
-
-data class SessionWithPlayback(
+data class SessionWithPlaybackState(
val session: MediaDeviceSession,
- val playback: PlaybackState,
+ val isPlaybackActive: Boolean,
)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
index f19fa20..d60d981 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
@@ -25,7 +25,7 @@
import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaDeviceSessionInteractor
import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputActionsInteractor
import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor
-import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlayback
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlaybackState
import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
import com.android.systemui.volume.panel.shared.model.Result
import com.android.systemui.volume.panel.ui.VolumePanelUiEvent
@@ -35,10 +35,9 @@
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.stateIn
/** Models the UI of the Media Output Volume Panel component. */
@@ -55,20 +54,19 @@
private val uiEventLogger: UiEventLogger,
) {
- private val sessionWithPlayback: StateFlow<Result<SessionWithPlayback?>> =
+ private val sessionWithPlaybackState: StateFlow<Result<SessionWithPlaybackState?>> =
interactor.defaultActiveMediaSession
.flatMapLatest { session ->
if (session == null) {
- flowOf(Result.Data<SessionWithPlayback?>(null))
+ flowOf(Result.Data<SessionWithPlaybackState?>(null))
} else {
- mediaDeviceSessionInteractor
- .playbackState(session)
- .map { playback ->
- playback?.let {
- Result.Data<SessionWithPlayback?>(SessionWithPlayback(session, it))
- }
+ mediaDeviceSessionInteractor.playbackState(session).mapNotNull { playback ->
+ playback?.let {
+ Result.Data<SessionWithPlaybackState?>(
+ SessionWithPlaybackState(session, playback.isActive())
+ )
}
- .filterNotNull()
+ }
}
}
.stateIn(
@@ -78,14 +76,14 @@
)
val connectedDeviceViewModel: StateFlow<ConnectedDeviceViewModel?> =
- combine(sessionWithPlayback, interactor.currentConnectedDevice) {
+ combine(sessionWithPlaybackState, interactor.currentConnectedDevice) {
mediaDeviceSession,
currentConnectedDevice ->
if (mediaDeviceSession !is Result.Data) {
return@combine null
}
ConnectedDeviceViewModel(
- if (mediaDeviceSession.data?.playback?.isActive == true) {
+ if (mediaDeviceSession.data?.isPlaybackActive == true) {
context.getString(
R.string.media_output_label_title,
mediaDeviceSession.data.session.appLabel
@@ -103,19 +101,16 @@
)
val deviceIconViewModel: StateFlow<DeviceIconViewModel?> =
- combine(sessionWithPlayback, interactor.currentConnectedDevice) {
+ combine(sessionWithPlaybackState, interactor.currentConnectedDevice) {
mediaDeviceSession,
currentConnectedDevice ->
if (mediaDeviceSession !is Result.Data) {
return@combine null
}
- if (mediaDeviceSession.data?.playback?.isActive == true) {
- val icon =
- currentConnectedDevice?.icon?.let { Icon.Loaded(it, null) }
- ?: Icon.Resource(
- com.android.internal.R.drawable.ic_bt_headphones_a2dp,
- null
- )
+ val icon: Icon =
+ currentConnectedDevice?.icon?.let { Icon.Loaded(it, null) }
+ ?: Icon.Resource(R.drawable.ic_media_home_devices, null)
+ if (mediaDeviceSession.data?.isPlaybackActive == true) {
DeviceIconViewModel.IsPlaying(
icon = icon,
iconColor =
@@ -125,7 +120,7 @@
)
} else {
DeviceIconViewModel.IsNotPlaying(
- icon = Icon.Resource(R.drawable.ic_media_home_devices, null),
+ icon = icon,
iconColor =
Color.Attribute(
com.android.internal.R.attr.materialColorOnSurfaceVariant
@@ -143,7 +138,7 @@
fun onBarClick(expandable: Expandable) {
uiEventLogger.log(VolumePanelUiEvent.VOLUME_PANEL_MEDIA_OUTPUT_CLICKED)
- val result = sessionWithPlayback.value
+ val result = sessionWithPlaybackState.value
actionsInteractor.onBarClick((result as? Result.Data)?.data, expandable)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextManagerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextManagerTest.java
index 303ae97..11d31c6 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextManagerTest.java
@@ -58,12 +58,15 @@
import com.android.keyguard.logging.CarrierTextManagerLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.kosmos.KosmosJavaAdapter;
import com.android.systemui.log.LogBufferHelperKt;
import com.android.systemui.res.R;
+import com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel.FakeDeviceBasedSatelliteViewModel;
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository;
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel;
import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.time.FakeSystemClock;
import org.junit.Before;
@@ -78,6 +81,8 @@
import java.util.HashMap;
import java.util.List;
+import kotlinx.coroutines.test.TestScope;
+
@SmallTest
@RunWith(AndroidTestingRunner.class)
public class CarrierTextManagerTest extends SysuiTestCase {
@@ -99,6 +104,8 @@
TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_CARRIER_ID, 0xFFFFFF, "",
DATA_ROAMING_ENABLE, null, null, null, null, false, null, "");
private FakeWifiRepository mWifiRepository = new FakeWifiRepository();
+ private final FakeDeviceBasedSatelliteViewModel mSatelliteViewModel =
+ new FakeDeviceBasedSatelliteViewModel();
@Mock
private WakefulnessLifecycle mWakefulnessLifecycle;
@Mock
@@ -124,6 +131,10 @@
new CarrierTextManagerLogger(
LogBufferHelperKt.logcatLogBuffer("CarrierTextManagerLog"));
+ private final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this);
+ private final TestScope mTestScope = mKosmos.getTestScope();
+ private final JavaAdapter mJavaAdapter = new JavaAdapter(mTestScope.getBackgroundScope());
+
private Void checkMainThread(InvocationOnMock inv) {
assertThat(mMainExecutor.isExecuting()).isTrue();
assertThat(mBgExecutor.isExecuting()).isFalse();
@@ -156,9 +167,18 @@
when(mTelephonyManager.getActiveModemCount()).thenReturn(3);
mCarrierTextManager = new CarrierTextManager.Builder(
- mContext, mContext.getResources(), mWifiRepository,
- mTelephonyManager, mTelephonyListenerManager, mWakefulnessLifecycle, mMainExecutor,
- mBgExecutor, mKeyguardUpdateMonitor, mLogger)
+ mContext,
+ mContext.getResources(),
+ mWifiRepository,
+ mSatelliteViewModel,
+ mJavaAdapter,
+ mTelephonyManager,
+ mTelephonyListenerManager,
+ mWakefulnessLifecycle,
+ mMainExecutor,
+ mBgExecutor,
+ mKeyguardUpdateMonitor,
+ mLogger)
.setShowAirplaneMode(true)
.setShowMissingSim(true)
.build();
@@ -211,6 +231,8 @@
getContextSpyForStickyBroadcast(stickyIntent),
mContext.getResources(),
mWifiRepository,
+ mSatelliteViewModel,
+ mJavaAdapter,
mTelephonyManager,
mTelephonyListenerManager,
mWakefulnessLifecycle,
@@ -451,6 +473,107 @@
}
@Test
+ public void carrierText_satelliteTextNull_notUsed() {
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION);
+ when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(
+ TelephonyManager.SIM_STATE_READY);
+ when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo()).thenReturn(list);
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+
+ // WHEN the satellite text is null
+ mSatelliteViewModel.getCarrierText().setValue(null);
+ mTestScope.getTestScheduler().runCurrent();
+
+ ArgumentCaptor<CarrierTextManager.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextManager.CarrierTextCallbackInfo.class);
+ FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor);
+
+ // THEN the default subscription carrier text is used
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+ assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER);
+ }
+
+ @Test
+ public void carrierText_satelliteTextUpdates_autoTriggersCallback() {
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION);
+ when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(
+ TelephonyManager.SIM_STATE_READY);
+ when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo()).thenReturn(list);
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+
+ // WHEN the satellite text is set
+ mSatelliteViewModel.getCarrierText().setValue("Test satellite text");
+ mTestScope.getTestScheduler().runCurrent();
+
+ // THEN we should automatically re-trigger #updateCarrierText and get callback info
+ ArgumentCaptor<CarrierTextManager.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextManager.CarrierTextCallbackInfo.class);
+ FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor);
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+ // AND use the satellite text as the carrier text
+ assertThat(captor.getValue().carrierText).isEqualTo("Test satellite text");
+
+ // WHEN the satellite text is reset to null
+ reset(mCarrierTextCallback);
+ mSatelliteViewModel.getCarrierText().setValue(null);
+ mTestScope.getTestScheduler().runCurrent();
+
+ // THEN we should automatically re-trigger #updateCarrierText and get callback info
+ // that doesn't include the satellite info
+ FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor);
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+ assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER);
+ }
+
+ @Test
+ public void carrierText_updatedWhileNotListening_getsNewValueWhenListening() {
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION);
+ when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(
+ TelephonyManager.SIM_STATE_READY);
+ when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo()).thenReturn(list);
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+
+ mSatelliteViewModel.getCarrierText().setValue("Old satellite text");
+ mTestScope.getTestScheduler().runCurrent();
+
+ ArgumentCaptor<CarrierTextManager.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextManager.CarrierTextCallbackInfo.class);
+ FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor);
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+ assertThat(captor.getValue().carrierText).isEqualTo("Old satellite text");
+
+ // WHEN we stop listening
+ reset(mCarrierTextCallback);
+ mCarrierTextManager.setListening(null);
+
+ // AND the satellite text updates
+ mSatelliteViewModel.getCarrierText().setValue("New satellite text");
+
+ // THEN we don't get new callback info because we aren't listening
+ verify(mCarrierTextCallback, never()).updateCarrierInfo(any());
+
+ // WHEN we start listening again
+ reset(mCarrierTextCallback);
+ mCarrierTextManager.setListening(mCarrierTextCallback);
+
+ // THEN we should automatically re-trigger #updateCarrierText and get callback info
+ // that includes the new satellite text
+ mTestScope.getTestScheduler().runCurrent();
+ FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor);
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+ assertThat(captor.getValue().carrierText).isEqualTo("New satellite text");
+ }
+
+ @Test
public void testCreateInfo_noSubscriptions() {
reset(mCarrierTextCallback);
when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo()).thenReturn(
@@ -471,6 +594,28 @@
}
@Test
+ public void testCarrierText_oneValidSubscription() {
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION);
+ when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(
+ TelephonyManager.SIM_STATE_READY);
+ when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo()).thenReturn(list);
+
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+
+ ArgumentCaptor<CarrierTextManager.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextManager.CarrierTextCallbackInfo.class);
+
+ mCarrierTextManager.updateCarrierText();
+ FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor);
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+
+ assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER);
+ }
+
+ @Test
public void testCarrierText_twoValidSubscriptions() {
reset(mCarrierTextCallback);
List<SubscriptionInfo> list = new ArrayList<>();
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 68b6d9d..d354fa2 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -2016,6 +2016,16 @@
}
@Test
+ public void unfoldFromPostureChange_sendActionToFaceAuthInteractor() {
+ // WHEN device posture changes to unfold
+ deviceInPostureStateOpened();
+ mTestableLooper.processAllMessages();
+
+ // THEN request face auth
+ verify(mFaceAuthInteractor).onDeviceUnfolded();
+ }
+
+ @Test
public void detectFingerprint_onTemporaryLockoutReset_authenticateFingerprint() {
ArgumentCaptor<FingerprintManager.LockoutResetCallback> fpLockoutResetCallbackCaptor =
ArgumentCaptor.forClass(FingerprintManager.LockoutResetCallback.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/DialogTransitionAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/DialogTransitionAnimatorTest.kt
index 9182e4101..d84a578 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/DialogTransitionAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/DialogTransitionAnimatorTest.kt
@@ -15,11 +15,11 @@
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.test.filters.SmallTest
-import com.android.internal.jank.InteractionJankMonitor
+import com.android.internal.jank.Cuj
import com.android.internal.policy.DecorView
import com.android.systemui.SysuiTestCase
import com.android.systemui.jank.interactionJankMonitor
-import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import junit.framework.Assert.assertEquals
import junit.framework.Assert.assertFalse
@@ -42,16 +42,15 @@
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper
class DialogTransitionAnimatorTest : SysuiTestCase() {
+ private val kosmos = testKosmos()
private lateinit var mDialogTransitionAnimator: DialogTransitionAnimator
private val attachedViews = mutableSetOf<View>()
-
- private val interactionJankMonitor = Kosmos().interactionJankMonitor
- @get:Rule val rule: MockitoRule = MockitoJUnit.rule()
+ @get:Rule
+ val rule: MockitoRule = MockitoJUnit.rule()
@Before
fun setUp() {
- mDialogTransitionAnimator =
- fakeDialogTransitionAnimator(interactionJankMonitor = interactionJankMonitor)
+ mDialogTransitionAnimator = kosmos.dialogTransitionAnimator
}
@After
@@ -96,7 +95,7 @@
// The dialog content is inside this fake window view.
assertNotNull(
- dialogContentWithBackground.findViewByPredicate { it === dialog.contentView }
+ dialogContentWithBackground.findViewByPredicate { it === dialog.contentView }
)
// Clicking the transparent background should dismiss the dialog.
@@ -126,8 +125,8 @@
val firstDialog = createAndShowDialog()
val secondDialog = createDialogAndShowFromDialog(firstDialog)
- val controller =
- mDialogTransitionAnimator.createActivityTransitionController(secondDialog.contentView)!!
+ val controller = mDialogTransitionAnimator
+ .createActivityTransitionController(secondDialog.contentView)!!
// The dialog shouldn't be dismissable during the animation.
runOnMainThreadAndWaitForIdleSync {
@@ -156,18 +155,24 @@
@Test
fun testActivityLaunchWhenLockedWithoutAlternateAuth() {
val dialogTransitionAnimator =
- fakeDialogTransitionAnimator(isUnlocked = false, isShowingAlternateAuthOnUnlock = false)
+ fakeDialogTransitionAnimator(
+ isUnlocked = false,
+ isShowingAlternateAuthOnUnlock = false,
+ interactionJankMonitor = kosmos.interactionJankMonitor)
val dialog = createAndShowDialog(dialogTransitionAnimator)
assertNull(dialogTransitionAnimator.createActivityTransitionController(dialog.contentView))
}
@Test
fun testActivityLaunchWhenLockedWithAlternateAuth() {
- val dialogTransitionAnimator =
- fakeDialogTransitionAnimator(isUnlocked = false, isShowingAlternateAuthOnUnlock = true)
+ val dialogTransitionAnimator = fakeDialogTransitionAnimator(
+ isUnlocked = false,
+ isShowingAlternateAuthOnUnlock = true,
+ interactionJankMonitor = kosmos.interactionJankMonitor
+ )
val dialog = createAndShowDialog(dialogTransitionAnimator)
assertNotNull(
- dialogTransitionAnimator.createActivityTransitionController(dialog.contentView)
+ dialogTransitionAnimator.createActivityTransitionController(dialog.contentView)
)
}
@@ -193,11 +198,14 @@
runOnMainThreadAndWaitForIdleSync {
val dialog = TestDialog(context)
mDialogTransitionAnimator.showFromView(
- dialog, touchSurface, cuj = DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN))
+ dialog,
+ touchSurface,
+ cuj = DialogCuj(Cuj.CUJ_SHADE_DIALOG_OPEN)
+ )
}
- verify(interactionJankMonitor).begin(any())
- verify(interactionJankMonitor).end(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN)
+ verify(kosmos.interactionJankMonitor).begin(any())
+ verify(kosmos.interactionJankMonitor).end(Cuj.CUJ_SHADE_DIALOG_OPEN)
}
@Test
@@ -206,11 +214,14 @@
runOnMainThreadAndWaitForIdleSync {
val dialog = TestDialog(context)
mDialogTransitionAnimator.showFromDialog(
- dialog, firstDialog, cuj = DialogCuj(InteractionJankMonitor.CUJ_USER_DIALOG_OPEN))
+ dialog,
+ firstDialog,
+ cuj = DialogCuj(Cuj.CUJ_USER_DIALOG_OPEN)
+ )
dialog
}
- verify(interactionJankMonitor).begin(any())
- verify(interactionJankMonitor).end(InteractionJankMonitor.CUJ_USER_DIALOG_OPEN)
+ verify(kosmos.interactionJankMonitor).begin(any())
+ verify(kosmos.interactionJankMonitor).end(Cuj.CUJ_USER_DIALOG_OPEN)
}
@Test
@@ -280,7 +291,7 @@
}
private fun createAndShowDialog(
- animator: DialogTransitionAnimator = mDialogTransitionAnimator,
+ animator: DialogTransitionAnimator = mDialogTransitionAnimator,
): TestDialog {
val touchSurface = createTouchSurface()
return showDialogFromView(touchSurface, animator)
@@ -302,8 +313,8 @@
}
private fun showDialogFromView(
- touchSurface: View,
- animator: DialogTransitionAnimator = mDialogTransitionAnimator,
+ touchSurface: View,
+ animator: DialogTransitionAnimator = mDialogTransitionAnimator,
): TestDialog {
return runOnMainThreadAndWaitForIdleSync {
val dialog = TestDialog(context)
@@ -331,10 +342,10 @@
private class TouchSurfaceView(context: Context) : FrameLayout(context), LaunchableView {
private val delegate =
- LaunchableViewDelegate(
- this,
- superSetVisibility = { super.setVisibility(it) },
- )
+ LaunchableViewDelegate(
+ this,
+ superSetVisibility = { super.setVisibility(it) },
+ )
override fun setShouldBlockVisibilityChanges(block: Boolean) {
delegate.setShouldBlockVisibilityChanges(block)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/TransitionAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/TransitionAnimatorTest.kt
index c380a51..fbe1184 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/TransitionAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/TransitionAnimatorTest.kt
@@ -64,14 +64,7 @@
@get:Rule(order = 0) val deviceEmulationRule = DeviceEmulationRule(emulationSpec)
@get:Rule(order = 1) val activityRule = ActivityScenarioRule(EmptyTestActivity::class.java)
- @get:Rule(order = 2)
- val motionRule =
- ViewMotionTestRule<EmptyTestActivity>(
- pathManager,
- { activityRule.scenario },
- context = context,
- bitmapDiffer = null,
- )
+ @get:Rule(order = 2) val motionRule = ViewMotionTestRule(pathManager, { activityRule.scenario })
@Test
fun backgroundAnimation_whenLaunching() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/BiometricStatusRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/BiometricStatusRepositoryTest.kt
index d48b600..b3e845f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/BiometricStatusRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/BiometricStatusRepositoryTest.kt
@@ -36,7 +36,6 @@
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.withArgCaptor
import com.google.common.truth.Truth.assertThat
@@ -65,8 +64,8 @@
@Before
fun setUp() {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
- underTest = BiometricStatusRepositoryImpl(kosmos.testScope.backgroundScope, biometricManager)
+ underTest =
+ BiometricStatusRepositoryImpl(kosmos.testScope.backgroundScope, biometricManager)
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/BiometricStatusInteractorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/BiometricStatusInteractorImplTest.kt
index be5c7bc..4cff3e6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/BiometricStatusInteractorImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/BiometricStatusInteractorImplTest.kt
@@ -29,7 +29,6 @@
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -51,7 +50,6 @@
@Before
fun setup() {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
underTest = kosmos.biometricStatusInteractor
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
index a603be4..01d9df8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
@@ -78,7 +78,6 @@
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.statusbar.phone.dozeServiceHost
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.testKosmos
@@ -175,8 +174,6 @@
@Before
fun setup() {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
-
allowTestableLooperAsMainThread() // repeatWhenAttached requires the main thread
mContext = spy(mContext)
@@ -203,8 +200,11 @@
)
biometricStatusInteractor =
- BiometricStatusInteractorImpl(activityTaskManager, biometricStatusRepository,
- fingerprintPropertyRepository)
+ BiometricStatusInteractorImpl(
+ activityTaskManager,
+ biometricStatusRepository,
+ fingerprintPropertyRepository
+ )
displayStateInteractor =
DisplayStateInteractorImpl(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
index 415da02..05ec64e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
@@ -77,7 +77,6 @@
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.statusbar.phone.dozeServiceHost
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.testKosmos
@@ -176,8 +175,6 @@
@Before
fun setup() {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
-
mContext = spy(mContext)
val resources = mContext.resources
diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/data/backup/CommunalBackupHelperTest.kt b/packages/SystemUI/tests/src/com/android/systemui/communal/data/backup/CommunalBackupHelperTest.kt
new file mode 100644
index 0000000..7094848
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/communal/data/backup/CommunalBackupHelperTest.kt
@@ -0,0 +1,155 @@
+/*
+ * 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.communal.data.backup
+
+import android.app.backup.BackupDataInput
+import android.app.backup.BackupDataInputStream
+import android.app.backup.BackupDataOutput
+import android.os.UserHandle
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import androidx.room.Room
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.Flags
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.communal.data.backup.CommunalBackupUtilsTest.Companion.represents
+import com.android.systemui.communal.data.backup.CommunalBackupUtilsTest.FakeWidgetMetadata
+import com.android.systemui.communal.data.db.CommunalDatabase
+import com.android.systemui.communal.data.db.CommunalWidgetDao
+import com.android.systemui.communal.proto.toCommunalHubState
+import com.android.systemui.lifecycle.InstantTaskExecutorRule
+import com.google.common.truth.Truth.assertThat
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class CommunalBackupHelperTest : SysuiTestCase() {
+ @JvmField @Rule val instantTaskExecutor = InstantTaskExecutorRule()
+
+ private lateinit var database: CommunalDatabase
+ private lateinit var dao: CommunalWidgetDao
+ private lateinit var backupUtils: CommunalBackupUtils
+
+ // Temporary file used for storing backed-up data.
+ private lateinit var backupDataFile: File
+
+ private lateinit var underTest: CommunalBackupHelper
+
+ @Before
+ fun setup() {
+ database =
+ Room.inMemoryDatabaseBuilder(context, CommunalDatabase::class.java)
+ .allowMainThreadQueries()
+ .build()
+ CommunalDatabase.setInstance(database)
+
+ dao = database.communalWidgetDao()
+ backupUtils = CommunalBackupUtils(context)
+
+ backupDataFile = File(context.cacheDir, "backup_data_file")
+
+ underTest = CommunalBackupHelper(UserHandle.SYSTEM, backupUtils)
+ }
+
+ @After
+ fun teardown() {
+ backupDataFile.delete()
+ database.close()
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_COMMUNAL_HUB)
+ fun backupAndRestoreCommunalHub() {
+ val expectedWidgets = setUpDatabase()
+
+ underTest.performBackup(oldState = null, data = getBackupDataOutput(), newState = null)
+ underTest.restoreEntity(getBackupDataInputStream())
+
+ // Verify restored state matches backed-up state
+ val restoredState = backupUtils.readBytesFromDisk().toCommunalHubState()
+ val restoredWidgets = restoredState.widgets.toList()
+ assertThat(restoredWidgets)
+ .comparingElementsUsing(represents)
+ .containsExactlyElementsIn(expectedWidgets)
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_COMMUNAL_HUB)
+ fun backup_skippedWhenCommunalDisabled() {
+ setUpDatabase()
+
+ underTest.performBackup(oldState = null, data = getBackupDataOutput(), newState = null)
+
+ // Verify nothing written to the backup
+ assertThat(backupDataFile.length()).isEqualTo(0)
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_COMMUNAL_HUB)
+ fun backup_skippedForNonSystemUser() {
+ setUpDatabase()
+
+ val helper = CommunalBackupHelper(UserHandle.CURRENT, backupUtils)
+ helper.performBackup(oldState = null, data = getBackupDataOutput(), newState = null)
+
+ // Verify nothing written to the backup
+ assertThat(backupDataFile.length()).isEqualTo(0)
+ }
+
+ private fun setUpDatabase(): List<FakeWidgetMetadata> {
+ return listOf(
+ FakeWidgetMetadata(11, "com.android.fakePackage1/fakeWidget1", 3),
+ FakeWidgetMetadata(12, "com.android.fakePackage2/fakeWidget2", 2),
+ FakeWidgetMetadata(13, "com.android.fakePackage3/fakeWidget3", 1),
+ )
+ .onEach { dao.addWidget(it.widgetId, it.componentName, it.rank) }
+ }
+
+ private fun getBackupDataInputStream(): BackupDataInputStream {
+ val input = BackupDataInput(FileInputStream(backupDataFile).fd).apply { readNextHeader() }
+
+ // Construct BackupDataInputStream using reflection because its constructor is package
+ // private
+ val inputStream = BackupDataInputStream::class.constructors.first().call(input)
+
+ // Set key
+ with(inputStream.javaClass.getDeclaredField("key")) {
+ isAccessible = true
+ set(inputStream, input.key)
+ }
+
+ // Set dataSize
+ with(inputStream.javaClass.getDeclaredField("dataSize")) {
+ isAccessible = true
+ set(inputStream, input.dataSize)
+ }
+
+ return inputStream
+ }
+
+ private fun getBackupDataOutput(): BackupDataOutput {
+ return BackupDataOutput(FileOutputStream(backupDataFile).fd)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/data/backup/CommunalBackupUtilsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/communal/data/backup/CommunalBackupUtilsTest.kt
new file mode 100644
index 0000000..bed05ee
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/communal/data/backup/CommunalBackupUtilsTest.kt
@@ -0,0 +1,155 @@
+/*
+ * 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.communal.data.backup
+
+import androidx.room.Room
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.communal.data.db.CommunalDatabase
+import com.android.systemui.communal.data.db.CommunalWidgetDao
+import com.android.systemui.communal.nano.CommunalHubState
+import com.android.systemui.lifecycle.InstantTaskExecutorRule
+import com.google.common.truth.Correspondence
+import com.google.common.truth.Truth.assertThat
+import java.io.FileNotFoundException
+import java.nio.charset.Charset
+import org.junit.After
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class CommunalBackupUtilsTest : SysuiTestCase() {
+ @JvmField @Rule val instantTaskExecutor = InstantTaskExecutorRule()
+
+ private lateinit var database: CommunalDatabase
+ private lateinit var dao: CommunalWidgetDao
+ private lateinit var underTest: CommunalBackupUtils
+
+ @Before
+ fun setup() {
+ database =
+ Room.inMemoryDatabaseBuilder(context, CommunalDatabase::class.java)
+ .allowMainThreadQueries()
+ .build()
+ CommunalDatabase.setInstance(database)
+
+ dao = database.communalWidgetDao()
+ underTest = CommunalBackupUtils(context)
+ }
+
+ @After
+ fun teardown() {
+ database.close()
+ underTest.clear()
+ }
+
+ @Test
+ fun getCommunalHubState_returnsExpectedWidgets() {
+ // Set up database
+ val expectedWidgets =
+ listOf(
+ FakeWidgetMetadata(11, "com.android.fakePackage1/fakeWidget1", 3),
+ FakeWidgetMetadata(12, "com.android.fakePackage2/fakeWidget2", 2),
+ FakeWidgetMetadata(13, "com.android.fakePackage3/fakeWidget3", 1),
+ )
+ expectedWidgets.forEach { dao.addWidget(it.widgetId, it.componentName, it.rank) }
+
+ // Get communal hub state
+ val state = underTest.getCommunalHubState()
+ val actualWidgets = state.widgets.toList()
+
+ // Verify the state contains widgets as expected
+ assertThat(actualWidgets)
+ .comparingElementsUsing(represents)
+ .containsExactlyElementsIn(expectedWidgets)
+ }
+
+ @Test
+ fun write_existingContentIsOverwritten() {
+ // Write old data
+ val dataToWrite = "I am old data. Erase me."
+ underTest.writeBytesToDisk(dataToWrite.toByteArray(Charset.defaultCharset()))
+
+ // Verify old data written
+ var dataRead = underTest.readBytesFromDisk().toString(Charset.defaultCharset())
+ assertThat(dataRead).isEqualTo(dataToWrite)
+
+ // Write new data
+ val newDataToWrite = "I am new data."
+ underTest.writeBytesToDisk(newDataToWrite.toByteArray(Charset.defaultCharset()))
+
+ // Verify new data overwrites old
+ dataRead = underTest.readBytesFromDisk().toString(Charset.defaultCharset())
+ assertThat(dataRead).isEqualTo(newDataToWrite)
+ }
+
+ @Ignore("Ignored until we figure out why it is flaky b/336561027")
+ @Test(expected = FileNotFoundException::class)
+ fun read_fileNotFoundException() {
+ underTest.readBytesFromDisk()
+ }
+
+ @Test(expected = FileNotFoundException::class)
+ fun clear_returnsTrueWhenFileDeleted() {
+ // Write bytes to disk
+ underTest.writeBytesToDisk(byteArrayOf(1, 2, 3))
+
+ assertThat(underTest.clear()).isTrue()
+
+ // Verify a read after that throws a FileNotFoundException
+ underTest.readBytesFromDisk()
+ }
+
+ @Test
+ fun clear_returnsFalseWhenFileDoesNotExist() {
+ assertThat(underTest.clear()).isFalse()
+ }
+
+ @Test
+ fun fileExists() {
+ assertThat(underTest.fileExists()).isFalse()
+
+ underTest.writeBytesToDisk(byteArrayOf(1, 2, 3))
+ assertThat(underTest.fileExists()).isTrue()
+
+ underTest.clear()
+ assertThat(underTest.fileExists()).isFalse()
+ }
+
+ data class FakeWidgetMetadata(val widgetId: Int, val componentName: String, val rank: Int)
+
+ companion object {
+ /**
+ * A comparator for whether a [CommunalHubState.CommunalWidgetItem] represents a
+ * [FakeWidgetMetadata]
+ */
+ val represents: Correspondence<CommunalHubState.CommunalWidgetItem, FakeWidgetMetadata> =
+ Correspondence.from(
+ { actual, expected ->
+ actual?.widgetId == expected?.widgetId &&
+ actual?.componentName == expected?.componentName &&
+ actual?.rank == expected?.rank
+ },
+ "represents",
+ )
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt b/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt
index 20dd913..f77c7a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt
@@ -21,6 +21,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.communal.nano.CommunalHubState
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.lifecycle.InstantTaskExecutorRule
import com.google.common.truth.Truth.assertThat
@@ -224,6 +225,42 @@
.inOrder()
}
+ @Test
+ fun restoreCommunalHubState() =
+ testScope.runTest {
+ // Set up db
+ listOf(widgetInfo1, widgetInfo2, widgetInfo3).forEach { addWidget(it) }
+
+ // Restore db to fake state
+ communalWidgetDao.restoreCommunalHubState(fakeState)
+
+ // Verify db matches new state
+ val expected = mutableMapOf<CommunalItemRank, CommunalWidgetItem>()
+ fakeState.widgets.forEachIndexed { index, fakeWidget ->
+ // Auto-generated uid continues after the initial 3 widgets and starts at 4
+ val uid = index + 4L
+ val rank = CommunalItemRank(uid = uid, rank = fakeWidget.rank)
+ val widget =
+ CommunalWidgetItem(
+ uid = uid,
+ widgetId = fakeWidget.widgetId,
+ componentName = fakeWidget.componentName,
+ itemId = rank.uid,
+ )
+ expected[rank] = widget
+ }
+ val widgets by collectLastValue(communalWidgetDao.getWidgets())
+ assertThat(widgets).containsExactlyEntriesIn(expected)
+ }
+
+ private fun addWidget(metadata: FakeWidgetMetadata, priority: Int? = null) {
+ communalWidgetDao.addWidget(
+ widgetId = metadata.widgetId,
+ provider = metadata.provider,
+ priority = priority ?: metadata.priority,
+ )
+ }
+
data class FakeWidgetMetadata(
val widgetId: Int,
val provider: ComponentName,
@@ -273,5 +310,22 @@
componentName = widgetInfo3.provider.flattenToString(),
itemId = communalItemRankEntry3.uid,
)
+ val fakeState =
+ CommunalHubState().apply {
+ widgets =
+ listOf(
+ CommunalHubState.CommunalWidgetItem().apply {
+ widgetId = 1
+ componentName = "pk_name/fake_widget_1"
+ rank = 1
+ },
+ CommunalHubState.CommunalWidgetItem().apply {
+ widgetId = 2
+ componentName = "pk_name/fake_widget_2"
+ rank = 2
+ },
+ )
+ .toTypedArray()
+ }
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderEventProducerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderEventProducerTest.kt
deleted file mode 100644
index c22d35c..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderEventProducerTest.kt
+++ /dev/null
@@ -1,147 +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.haptics.slider
-
-import android.widget.SeekBar
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import junit.framework.Assert.assertEquals
-import kotlinx.coroutines.test.runTest
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class SeekableSliderEventProducerTest : SysuiTestCase() {
-
- private val seekBar = SeekBar(mContext)
- private val eventProducer = SeekableSliderEventProducer()
- private val eventFlow = eventProducer.produceEvents()
-
- @Test
- fun onStartTrackingTouch_noProgress_trackingTouchEventProduced() = runTest {
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onStartTrackingTouch(seekBar)
-
- assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0F), latest)
- }
-
- @Test
- fun onStopTrackingTouch_noProgress_StoppedTrackingTouchEventProduced() = runTest {
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onStopTrackingTouch(seekBar)
-
- assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0F), latest)
- }
-
- @Test
- fun onProgressChangeByUser_changeByUserEventProduced_withNormalizedProgress() = runTest {
- val progress = 50
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onProgressChanged(seekBar, progress, true)
-
- assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5F), latest)
- }
-
- @Test
- fun onProgressChangeByUser_zeroWidthSlider_changeByUserEventProduced_withMaxProgress() =
- runTest {
- // No-width slider where the min and max values are the same
- seekBar.min = 100
- seekBar.max = 100
- val progress = 50
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onProgressChanged(seekBar, progress, true)
-
- assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 1.0F), latest)
- }
-
- @Test
- fun onProgressChangeByProgram_changeByProgramEventProduced_withNormalizedProgress() = runTest {
- val progress = 50
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onProgressChanged(seekBar, progress, false)
-
- assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, 0.5F), latest)
- }
-
- @Test
- fun onProgressChangeByProgram_zeroWidthSlider_changeByProgramEventProduced_withMaxProgress() =
- runTest {
- // No-width slider where the min and max values are the same
- seekBar.min = 100
- seekBar.max = 100
- val progress = 50
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onProgressChanged(seekBar, progress, false)
-
- assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, 1.0F), latest)
- }
-
- @Test
- fun onStartTrackingTouch_afterProgress_trackingTouchEventProduced_withNormalizedProgress() =
- runTest {
- val progress = 50
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onProgressChanged(seekBar, progress, true)
- eventProducer.onStartTrackingTouch(seekBar)
-
- assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0.5F), latest)
- }
-
- @Test
- fun onStopTrackingTouch_afterProgress_stopTrackingTouchEventProduced_withNormalizedProgress() =
- runTest {
- val progress = 50
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onProgressChanged(seekBar, progress, true)
- eventProducer.onStopTrackingTouch(seekBar)
-
- assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5F), latest)
- }
-
- @Test
- fun onArrowUp_afterStartTrackingTouch_ArrowUpProduced() = runTest {
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onStartTrackingTouch(seekBar)
- eventProducer.onArrowUp()
-
- assertEquals(SliderEvent(SliderEventType.ARROW_UP, 0f), latest)
- }
-
- @Test
- fun onArrowUp_afterChangeByProgram_ArrowUpProduced_withProgress() = runTest {
- val progress = 50
- val latest by collectLastValue(eventFlow)
-
- eventProducer.onProgressChanged(seekBar, progress, false)
- eventProducer.onArrowUp()
-
- assertEquals(SliderEvent(SliderEventType.ARROW_UP, 0.5f), latest)
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderTrackerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt
similarity index 79%
rename from packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderTrackerTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt
index 796d6d9..a09d345 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderTrackerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt
@@ -38,11 +38,11 @@
@SmallTest
@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
-class SeekableSliderTrackerTest : SysuiTestCase() {
+class SliderStateTrackerTest : SysuiTestCase() {
@Mock private lateinit var sliderStateListener: SliderStateListener
private val sliderEventProducer = FakeSliderEventProducer()
- private lateinit var mSeekableSliderTracker: SeekableSliderTracker
+ private lateinit var mSliderStateTracker: SliderStateTracker
@Before
fun setup() {
@@ -55,7 +55,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// THEN the tracker job is active
- assertThat(mSeekableSliderTracker.isTracking).isTrue()
+ assertThat(mSliderStateTracker.isTracking).isTrue()
}
@Test
@@ -65,14 +65,14 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a state in the state machine
- mSeekableSliderTracker.setState(it)
+ mSliderStateTracker.setState(it)
// WHEN the tracker stops tracking the state and listening to events
- mSeekableSliderTracker.stopTracking()
+ mSliderStateTracker.stopTracking()
// THEN The state is idle and the tracker is not active
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
- assertThat(mSeekableSliderTracker.isTracking).isFalse()
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.isTracking).isFalse()
}
}
@@ -83,7 +83,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// THEN The state is idle and the listener is not called to play haptics
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
verifyZeroInteractions(sliderStateListener)
}
@@ -96,9 +96,9 @@
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
// THEN the tracker moves to the wait state and the timer job begins
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.WAIT)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
verifyZeroInteractions(sliderStateListener)
- assertThat(mSeekableSliderTracker.isWaiting).isTrue()
+ assertThat(mSliderStateTracker.isWaiting).isTrue()
}
// Tests on the WAIT state
@@ -117,9 +117,9 @@
advanceTimeBy(config.waitTimeMillis + 10L)
// THEN the tracker moves to the DRAG_HANDLE_ACQUIRED_BY_TOUCH state
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
- assertThat(mSeekableSliderTracker.isWaiting).isFalse()
+ assertThat(mSliderStateTracker.isWaiting).isFalse()
verify(sliderStateListener).onHandleAcquiredByTouch()
verifyNoMoreInteractions(sliderStateListener)
}
@@ -142,9 +142,9 @@
// THEN the tracker moves to the DRAG_HANDLE_ACQUIRED_BY_TOUCH state without the timer job
// being complete
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
- assertThat(mSeekableSliderTracker.isWaiting).isFalse()
+ assertThat(mSliderStateTracker.isWaiting).isFalse()
verify(sliderStateListener).onHandleAcquiredByTouch()
verifyNoMoreInteractions(sliderStateListener)
}
@@ -166,9 +166,9 @@
)
// THEN the tracker moves to the jump-track location selected state
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.JUMP_TRACK_LOCATION_SELECTED)
- assertThat(mSeekableSliderTracker.isWaiting).isFalse()
+ assertThat(mSliderStateTracker.isWaiting).isFalse()
verify(sliderStateListener).onProgressJump(anyFloat())
verifyNoMoreInteractions(sliderStateListener)
}
@@ -190,8 +190,8 @@
)
// THEN the tracker moves to the jump-track location selected state
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED)
- assertThat(mSeekableSliderTracker.isWaiting).isFalse()
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED)
+ assertThat(mSliderStateTracker.isWaiting).isFalse()
verifyNoMoreInteractions(sliderStateListener)
}
@@ -212,8 +212,8 @@
)
// THEN the tracker moves to the JUMP_TRACK_LOCATION_SELECTED state
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED)
- assertThat(mSeekableSliderTracker.isWaiting).isFalse()
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED)
+ assertThat(mSliderStateTracker.isWaiting).isFalse()
verifyNoMoreInteractions(sliderStateListener)
}
@@ -225,15 +225,15 @@
// GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the
// slider
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0.5f))
- assertThat(mSeekableSliderTracker.isWaiting).isTrue()
+ assertThat(mSliderStateTracker.isWaiting).isTrue()
// GIVEN that the tracker stops tracking the state and listening to events
- mSeekableSliderTracker.stopTracking()
+ mSliderStateTracker.stopTracking()
// THEN the tracker moves to the IDLE state without the timer job being complete
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
- assertThat(mSeekableSliderTracker.isWaiting).isFalse()
- assertThat(mSeekableSliderTracker.isTracking).isFalse()
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.isWaiting).isFalse()
+ assertThat(mSliderStateTracker.isTracking).isFalse()
verifyNoMoreInteractions(sliderStateListener)
}
@@ -244,13 +244,13 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a JUMP_TRACK_LOCATION_SELECTED state
- mSeekableSliderTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED)
+ mSliderStateTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED)
// GIVEN a progress event due to dragging the handle
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5f))
// THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
verify(sliderStateListener).onProgress(anyFloat())
verifyNoMoreInteractions(sliderStateListener)
}
@@ -260,14 +260,14 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a JUMP_TRACK_LOCATION_SELECTED state
- mSeekableSliderTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED)
+ mSliderStateTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED)
// GIVEN that the slider stopped tracking touch
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
// THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
verify(sliderStateListener).onHandleReleasedFromTouch()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -276,13 +276,13 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a JUMP_BOOKEND_SELECTED state
- mSeekableSliderTracker.setState(SliderState.JUMP_BOOKEND_SELECTED)
+ mSliderStateTracker.setState(SliderState.JUMP_BOOKEND_SELECTED)
// GIVEN that the slider stopped tracking touch
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5f))
// THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
verify(sliderStateListener).onProgress(anyFloat())
verifyNoMoreInteractions(sliderStateListener)
}
@@ -292,14 +292,14 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a JUMP_BOOKEND_SELECTED state
- mSeekableSliderTracker.setState(SliderState.JUMP_BOOKEND_SELECTED)
+ mSliderStateTracker.setState(SliderState.JUMP_BOOKEND_SELECTED)
// GIVEN that the slider stopped tracking touch
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
// THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
verify(sliderStateListener).onHandleReleasedFromTouch()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -310,7 +310,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a DRAG_HANDLE_ACQUIRED_BY_TOUCH state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
// GIVEN a progress change by the user
val progress = 0.5f
@@ -320,7 +320,7 @@
// THEN the tracker moves to the DRAG_HANDLE_DRAGGING state
verify(sliderStateListener).onProgress(progress)
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -329,14 +329,14 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a DRAG_HANDLE_ACQUIRED_BY_TOUCH state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH)
// GIVEN that the handle stops tracking touch
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
// THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
verify(sliderStateListener).onHandleReleasedFromTouch()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -348,7 +348,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a DRAG_HANDLE_DRAGGING state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
// GIVEN a progress change by the user outside of bookend bounds
val progress = 0.5f
@@ -357,8 +357,7 @@
)
// THEN the tracker does not change state and executes the onProgress call
- assertThat(mSeekableSliderTracker.currentState)
- .isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
verify(sliderStateListener).onProgress(progress)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -370,7 +369,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
// GIVEN a DRAG_HANDLE_DRAGGING state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
// GIVEN a progress change by the user reaching the lower bookend
val progress = config.lowerBookendThreshold - 0.01f
@@ -380,7 +379,7 @@
// THEN the tracker moves to the DRAG_HANDLE_REACHED_BOOKEND state and executes the
// corresponding callback
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
verify(sliderStateListener).onLowerBookend()
verifyNoMoreInteractions(sliderStateListener)
@@ -393,7 +392,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
// GIVEN a DRAG_HANDLE_DRAGGING state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
// GIVEN a progress change by the user reaching the upper bookend
val progress = config.upperBookendThreshold + 0.01f
@@ -403,7 +402,7 @@
// THEN the tracker moves to the DRAG_HANDLE_REACHED_BOOKEND state and executes the
// corresponding callback
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
verify(sliderStateListener).onUpperBookend()
verifyNoMoreInteractions(sliderStateListener)
@@ -414,14 +413,14 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a DRAG_HANDLE_DRAGGING state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING)
// GIVEN that the slider stops tracking touch
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
// THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
verify(sliderStateListener).onHandleReleasedFromTouch()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -434,7 +433,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
// GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
// GIVEN a progress event that falls outside of the lower bookend range
val progress = config.lowerBookendThreshold + 0.01f
@@ -444,8 +443,7 @@
// THEN the tracker moves to the DRAG_HANDLE_DRAGGING state and executes accordingly
verify(sliderStateListener).onProgress(progress)
- assertThat(mSeekableSliderTracker.currentState)
- .isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -455,7 +453,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
// GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
// GIVEN a progress event that falls inside of the lower bookend range
val progress = config.lowerBookendThreshold - 0.01f
@@ -465,7 +463,7 @@
// THEN the tracker stays in the current state and executes accordingly
verify(sliderStateListener).onLowerBookend()
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -477,7 +475,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
// GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
// GIVEN a progress event that falls outside of the upper bookend range
val progress = config.upperBookendThreshold - 0.01f
@@ -487,8 +485,7 @@
// THEN the tracker moves to the DRAG_HANDLE_DRAGGING state and executes accordingly
verify(sliderStateListener).onProgress(progress)
- assertThat(mSeekableSliderTracker.currentState)
- .isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -498,7 +495,7 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
// GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
// GIVEN a progress event that falls inside of the upper bookend range
val progress = config.upperBookendThreshold + 0.01f
@@ -508,7 +505,7 @@
// THEN the tracker stays in the current state and executes accordingly
verify(sliderStateListener).onUpperBookend()
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
verifyNoMoreInteractions(sliderStateListener)
}
@@ -518,37 +515,36 @@
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a DRAG_HANDLE_REACHED_BOOKEND state
- mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
+ mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND)
// GIVEN that the handle stops tracking touch
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f))
// THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state
verify(sliderStateListener).onHandleReleasedFromTouch()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
verifyNoMoreInteractions(sliderStateListener)
}
@Test
- fun onProgressChangeByProgram_atTheMiddle_onIdle_movesToArrowHandleMovedOnce() = runTest {
+ fun onStartedTrackingProgram_atTheMiddle_onIdle_movesToArrowHandleMovedOnce() = runTest {
// GIVEN an initialized tracker in the IDLE state
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
// GIVEN a progress due to an external source that lands at the middle of the slider
val progress = 0.5f
sliderEventProducer.sendEvent(
- SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
+ SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
)
// THEN the state moves to ARROW_HANDLE_MOVED_ONCE and the listener is called to play
// haptics
- assertThat(mSeekableSliderTracker.currentState)
- .isEqualTo(SliderState.ARROW_HANDLE_MOVED_ONCE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.ARROW_HANDLE_MOVED_ONCE)
verify(sliderStateListener).onSelectAndArrow(progress)
}
@Test
- fun onProgressChangeByProgram_atUpperBookend_onIdle_movesToIdle() = runTest {
+ fun onStartedTrackingProgram_atUpperBookend_onIdle_movesToIdle() = runTest {
// GIVEN an initialized tracker in the IDLE state
val config = SeekableSliderTrackerConfig()
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
@@ -556,16 +552,16 @@
// GIVEN a progress due to an external source that lands at the upper bookend
val progress = config.upperBookendThreshold + 0.01f
sliderEventProducer.sendEvent(
- SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
+ SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
)
// THEN the tracker executes upper bookend haptics before moving back to IDLE
verify(sliderStateListener).onUpperBookend()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
}
@Test
- fun onProgressChangeByProgram_atLowerBookend_onIdle_movesToIdle() = runTest {
+ fun onStartedTrackingProgram_atLowerBookend_onIdle_movesToIdle() = runTest {
// GIVEN an initialized tracker in the IDLE state
val config = SeekableSliderTrackerConfig()
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
@@ -573,26 +569,28 @@
// WHEN a progress is recorded due to an external source that lands at the lower bookend
val progress = config.lowerBookendThreshold - 0.01f
sliderEventProducer.sendEvent(
- SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress)
+ SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress)
)
// THEN the tracker executes lower bookend haptics before moving to IDLE
verify(sliderStateListener).onLowerBookend()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
}
@Test
fun onArrowUp_onArrowMovedOnce_movesToIdle() = runTest {
// GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
- mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
+ mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
// WHEN the external stimulus is released
val progress = 0.5f
- sliderEventProducer.sendEvent(SliderEvent(SliderEventType.ARROW_UP, progress))
+ sliderEventProducer.sendEvent(
+ SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress)
+ )
// THEN the tracker moves back to IDLE and there are no haptics
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
verifyZeroInteractions(sliderStateListener)
}
@@ -600,7 +598,7 @@
fun onStartTrackingTouch_onArrowMovedOnce_movesToWait() = runTest {
// GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
- mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
+ mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
// WHEN the slider starts tracking touch
val progress = 0.5f
@@ -608,8 +606,8 @@
// THEN the tracker moves back to WAIT and starts the waiting job. Also, there are no
// haptics
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.WAIT)
- assertThat(mSeekableSliderTracker.isWaiting).isTrue()
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
+ assertThat(mSliderStateTracker.isWaiting).isTrue()
verifyZeroInteractions(sliderStateListener)
}
@@ -617,7 +615,7 @@
fun onProgressChangeByProgram_onArrowMovedOnce_movesToArrowMovesContinuously() = runTest {
// GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
- mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
+ mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE)
// WHEN the slider gets an external progress change
val progress = 0.5f
@@ -627,7 +625,7 @@
// THEN the tracker moves to ARROW_HANDLE_MOVES_CONTINUOUSLY and calls the appropriate
// haptics
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
verify(sliderStateListener).onProgress(progress)
}
@@ -636,14 +634,16 @@
fun onArrowUp_onArrowMovesContinuously_movesToIdle() = runTest {
// GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
- mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+ mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
// WHEN the external stimulus is released
val progress = 0.5f
- sliderEventProducer.sendEvent(SliderEvent(SliderEventType.ARROW_UP, progress))
+ sliderEventProducer.sendEvent(
+ SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress)
+ )
// THEN the tracker moves to IDLE and no haptics are played
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
verifyZeroInteractions(sliderStateListener)
}
@@ -651,15 +651,15 @@
fun onStartTrackingTouch_onArrowMovesContinuously_movesToWait() = runTest {
// GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
- mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+ mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
// WHEN the slider starts tracking touch
val progress = 0.5f
sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress))
// THEN the tracker moves to WAIT and the wait job starts.
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.WAIT)
- assertThat(mSeekableSliderTracker.isWaiting).isTrue()
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT)
+ assertThat(mSliderStateTracker.isWaiting).isTrue()
verifyZeroInteractions(sliderStateListener)
}
@@ -667,7 +667,7 @@
fun onProgressChangeByProgram_onArrowMovesContinuously_preservesState() = runTest {
// GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
- mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+ mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
// WHEN the slider changes progress programmatically at the middle
val progress = 0.5f
@@ -676,7 +676,7 @@
)
// THEN the tracker stays in the same state and haptics are delivered appropriately
- assertThat(mSeekableSliderTracker.currentState)
+ assertThat(mSliderStateTracker.currentState)
.isEqualTo(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
verify(sliderStateListener).onProgress(progress)
}
@@ -686,7 +686,7 @@
// GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
val config = SeekableSliderTrackerConfig()
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
- mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+ mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
// WHEN the slider reaches the lower bookend programmatically
val progress = config.lowerBookendThreshold - 0.01f
@@ -696,7 +696,7 @@
// THEN the tracker executes lower bookend haptics before moving to IDLE
verify(sliderStateListener).onLowerBookend()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
}
@Test
@@ -704,7 +704,7 @@
// GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state
val config = SeekableSliderTrackerConfig()
initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config)
- mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
+ mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY)
// WHEN the slider reaches the lower bookend programmatically
val progress = config.upperBookendThreshold + 0.01f
@@ -714,7 +714,7 @@
// THEN the tracker executes upper bookend haptics before moving to IDLE
verify(sliderStateListener).onUpperBookend()
- assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE)
+ assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE)
}
@OptIn(ExperimentalCoroutinesApi::class)
@@ -722,8 +722,8 @@
scope: CoroutineScope,
config: SeekableSliderTrackerConfig = SeekableSliderTrackerConfig(),
) {
- mSeekableSliderTracker =
- SeekableSliderTracker(sliderStateListener, sliderEventProducer, scope, config)
- mSeekableSliderTracker.startTracking()
+ mSliderStateTracker =
+ SliderStateTracker(sliderStateListener, sliderEventProducer, scope, config)
+ mSliderStateTracker.startTracking()
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractorTest.kt
index dc7f372..472d045 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractorTest.kt
@@ -42,7 +42,6 @@
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.testKosmos
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
@@ -86,8 +85,6 @@
@Before
fun setup() {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
-
primaryBouncerInteractor =
PrimaryBouncerInteractor(
bouncerRepository,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
index 671b09b..3827046 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
@@ -897,6 +897,31 @@
}
@Test
+ fun alternateBouncerToGone() =
+ testScope.runTest {
+ // GIVEN a prior transition has run to ALTERNATE_BOUNCER
+ bouncerRepository.setAlternateVisible(true)
+ runTransitionAndSetWakefulness(
+ KeyguardState.LOCKSCREEN,
+ KeyguardState.ALTERNATE_BOUNCER
+ )
+
+ // GIVEN the keyguard is going away
+ keyguardRepository.setKeyguardGoingAway(true)
+ runCurrent()
+
+ assertThat(transitionRepository)
+ .startedTransition(
+ ownerName = "FromAlternateBouncerTransitionInteractor",
+ from = KeyguardState.ALTERNATE_BOUNCER,
+ to = KeyguardState.GONE,
+ animatorAssertion = { it.isNotNull() },
+ )
+
+ coroutineContext.cancelChildren()
+ }
+
+ @Test
fun alternateBouncerToGlanceableHub() =
testScope.runTest {
// GIVEN a prior transition has run to ALTERNATE_BOUNCER
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt
index e1c2d3f..cb4ab64 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/viewmodel/SeekBarViewModelTest.kt
@@ -29,7 +29,12 @@
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.Classifier
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.media.controls.util.MediaFlags
+import com.android.systemui.media.controls.util.mediaFlags
import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.testKosmos
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.concurrency.FakeRepeatableExecutor
import com.android.systemui.util.time.FakeSystemClock
@@ -56,6 +61,7 @@
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
public class SeekBarViewModelTest : SysuiTestCase() {
+ val kosmos = testKosmos()
private lateinit var viewModel: SeekBarViewModel
private lateinit var fakeExecutor: FakeExecutor
@@ -75,6 +81,7 @@
@Mock private lateinit var mockTransport: MediaController.TransportControls
@Mock private lateinit var falsingManager: FalsingManager
@Mock private lateinit var mockBar: SeekBar
+ @Mock private lateinit var mediaFlags: MediaFlags
private val token1 = MediaSession.Token(1, null)
private val token2 = MediaSession.Token(2, null)
@@ -83,10 +90,18 @@
@Before
fun setUp() {
fakeExecutor = FakeExecutor(FakeSystemClock())
- viewModel = SeekBarViewModel(FakeRepeatableExecutor(fakeExecutor), falsingManager)
+ viewModel =
+ SeekBarViewModel(
+ kosmos.applicationCoroutineScope,
+ kosmos.testDispatcher,
+ FakeRepeatableExecutor(fakeExecutor),
+ falsingManager,
+ mediaFlags,
+ )
viewModel.logSeek = {}
whenever(mockController.sessionToken).thenReturn(token1)
whenever(mockBar.context).thenReturn(context)
+ whenever(mediaFlags.isMediaControlsRefactorEnabled()).thenReturn(false)
// LiveData to run synchronously
ArchTaskExecutor.getInstance().setDelegate(taskExecutor)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt
index 6e0919f..e6c259a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt
@@ -31,10 +31,10 @@
import com.android.internal.util.LatencyTracker
import com.android.systemui.SysuiTestCase
import com.android.systemui.jank.interactionJankMonitor
-import com.android.systemui.kosmos.Kosmos
import com.android.systemui.plugins.NavigationEdgeBackPlugin
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.statusbar.policy.ConfigurationController
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -53,6 +53,7 @@
companion object {
private const val START_X: Float = 0f
}
+ private val kosmos = testKosmos()
private lateinit var mBackPanelController: BackPanelController
private lateinit var testableLooper: TestableLooper
private var triggerThreshold: Float = 0.0f
@@ -61,7 +62,7 @@
@Mock private lateinit var windowManager: WindowManager
@Mock private lateinit var configurationController: ConfigurationController
@Mock private lateinit var latencyTracker: LatencyTracker
- private val interactionJankMonitor = Kosmos().interactionJankMonitor
+ private val interactionJankMonitor by lazy { kosmos.interactionJankMonitor }
@Mock private lateinit var layoutParams: WindowManager.LayoutParams
@Mock private lateinit var backCallback: NavigationEdgeBackPlugin.BackCallback
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt
index 6a22d86..fb91c78 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt
@@ -24,7 +24,7 @@
import com.android.settingslib.RestrictedLockUtils
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingManagerFake
-import com.android.systemui.haptics.slider.SeekableSliderHapticPlugin
+import com.android.systemui.haptics.slider.SeekbarHapticPlugin
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.statusbar.policy.BrightnessMirrorController
@@ -93,7 +93,7 @@
brightnessSliderView,
mFalsingManager,
uiEventLogger,
- SeekableSliderHapticPlugin(vibratorHelper, systemClock),
+ SeekbarHapticPlugin(vibratorHelper, systemClock),
activityStarter,
)
mController.init()
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 fd9daf8..03f5ecf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
@@ -25,23 +25,24 @@
import android.view.View
import android.view.WindowManager
import android.widget.FrameLayout
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.SceneKey
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
+import com.android.systemui.ambient.touch.TouchHandler
+import com.android.systemui.ambient.touch.TouchMonitor
+import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent
import com.android.systemui.communal.data.repository.FakeCommunalRepository
import com.android.systemui.communal.data.repository.fakeCommunalRepository
-import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
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.communal.util.CommunalColors
import com.android.systemui.coroutines.collectLastValue
-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
@@ -51,7 +52,6 @@
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
@@ -60,7 +60,6 @@
import kotlinx.coroutines.ExperimentalCoroutinesApi
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
@@ -87,16 +86,14 @@
@Mock private lateinit var communalViewModel: CommunalViewModel
@Mock private lateinit var powerManager: PowerManager
@Mock private lateinit var dialogFactory: SystemUIDialogFactory
+ @Mock private lateinit var touchMonitor: TouchMonitor
@Mock private lateinit var communalColors: CommunalColors
- private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
- private lateinit var shadeInteractor: ShadeInteractor
- private lateinit var keyguardInteractor: KeyguardInteractor
+ private lateinit var ambientTouchComponentFactory: AmbientTouchComponent.Factory
private lateinit var parentView: FrameLayout
private lateinit var containerView: View
private lateinit var testableLooper: TestableLooper
- private lateinit var communalInteractor: CommunalInteractor
private lateinit var communalRepository: FakeCommunalRepository
private lateinit var underTest: GlanceableHubContainerController
@@ -104,32 +101,37 @@
fun setUp() {
MockitoAnnotations.initMocks(this)
- communalInteractor = kosmos.communalInteractor
communalRepository = kosmos.fakeCommunalRepository
- keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
- keyguardInteractor = kosmos.keyguardInteractor
- shadeInteractor = kosmos.shadeInteractor
- underTest =
- GlanceableHubContainerController(
- communalInteractor,
- communalViewModel,
- dialogFactory,
- keyguardTransitionInteractor,
- keyguardInteractor,
- shadeInteractor,
- powerManager,
- communalColors,
- kosmos.sceneDataSourceDelegator,
- )
+ ambientTouchComponentFactory =
+ object : AmbientTouchComponent.Factory {
+ override fun create(
+ lifecycleOwner: LifecycleOwner,
+ touchHandlers: Set<TouchHandler>
+ ): AmbientTouchComponent =
+ object : AmbientTouchComponent {
+ override fun getTouchMonitor(): TouchMonitor = touchMonitor
+ }
+ }
+
+ with(kosmos) {
+ underTest =
+ GlanceableHubContainerController(
+ communalInteractor,
+ communalViewModel,
+ dialogFactory,
+ keyguardTransitionInteractor,
+ keyguardInteractor,
+ shadeInteractor,
+ powerManager,
+ communalColors,
+ ambientTouchComponentFactory,
+ kosmos.sceneDataSourceDelegator,
+ )
+ }
testableLooper = TestableLooper.get(this)
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(
- R.dimen.communal_bottom_edge_swipe_region_height,
- BOTTOM_SWIPE_REGION_WIDTH
- )
// Make communal available so that communalInteractor.desiredScene accurately reflects
// scene changes instead of just returning Blank.
@@ -161,6 +163,7 @@
shadeInteractor,
powerManager,
communalColors,
+ ambientTouchComponentFactory,
kosmos.sceneDataSourceDelegator,
)
@@ -215,62 +218,6 @@
}
@Test
- fun onTouchEvent_topSwipeWhenCommunalOpen_doesNotIntercept() =
- with(kosmos) {
- testScope.runTest {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
-
- // 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() =
- with(kosmos) {
- testScope.runTest {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
-
- // Touch event in the bottom swipe region is not intercepted.
- assertThat(underTest.onTouchEvent(DOWN_IN_BOTTOM_SWIPE_REGION_EVENT)).isFalse()
- }
- }
-
- @Test
- fun onTouchEvent_topSwipeWhenDreaming_doesNotIntercept() =
- with(kosmos) {
- testScope.runTest {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
-
- // Device is dreaming.
- fakeKeyguardRepository.setDreaming(true)
- runCurrent()
-
- // Touch event in the top swipe region is not intercepted.
- assertThat(underTest.onTouchEvent(DOWN_IN_TOP_SWIPE_REGION_EVENT)).isFalse()
- }
- }
-
- @Test
- fun onTouchEvent_bottomSwipeWhenDreaming_doesNotIntercept() =
- with(kosmos) {
- testScope.runTest {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
-
- // Device is dreaming.
- fakeKeyguardRepository.setDreaming(true)
- runCurrent()
-
- // 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() =
with(kosmos) {
testScope.runTest {
@@ -327,6 +274,141 @@
}
@Test
+ fun lifecycle_initializedAfterConstruction() =
+ with(kosmos) {
+ val underTest =
+ GlanceableHubContainerController(
+ communalInteractor,
+ communalViewModel,
+ dialogFactory,
+ keyguardTransitionInteractor,
+ keyguardInteractor,
+ shadeInteractor,
+ powerManager,
+ communalColors,
+ ambientTouchComponentFactory,
+ kosmos.sceneDataSourceDelegator,
+ )
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.INITIALIZED)
+ }
+
+ @Test
+ fun lifecycle_createdAfterViewCreated() =
+ with(kosmos) {
+ val underTest =
+ GlanceableHubContainerController(
+ communalInteractor,
+ communalViewModel,
+ dialogFactory,
+ keyguardTransitionInteractor,
+ keyguardInteractor,
+ shadeInteractor,
+ powerManager,
+ communalColors,
+ ambientTouchComponentFactory,
+ kosmos.sceneDataSourceDelegator,
+ )
+
+ // Only initView without attaching a view as we don't want the flows to start collecting
+ // yet.
+ underTest.initView(View(context))
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
+ }
+
+ @Test
+ fun lifecycle_startedAfterFlowsUpdate() {
+ // Flows start collecting due to test setup, causing the state to advance to STARTED.
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
+ }
+
+ @Test
+ fun lifecycle_resumedAfterCommunalShows() {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.RESUMED)
+ }
+
+ @Test
+ fun lifecycle_startedAfterCommunalCloses() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.RESUMED)
+
+ // Communal closes.
+ goToScene(CommunalScenes.Blank)
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
+ }
+ }
+
+ @Test
+ fun lifecycle_startedAfterPrimaryBouncerShows() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
+
+ // Bouncer is visible.
+ fakeKeyguardTransitionRepository.sendTransitionSteps(
+ KeyguardState.GLANCEABLE_HUB,
+ KeyguardState.PRIMARY_BOUNCER,
+ testScope
+ )
+ testableLooper.processAllMessages()
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
+ }
+ }
+
+ @Test
+ fun lifecycle_startedAfterAlternateBouncerShows() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
+
+ // Bouncer is visible.
+ fakeKeyguardTransitionRepository.sendTransitionSteps(
+ KeyguardState.GLANCEABLE_HUB,
+ KeyguardState.ALTERNATE_BOUNCER,
+ testScope
+ )
+ testableLooper.processAllMessages()
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
+ }
+ }
+
+ @Test
+ fun lifecycle_createdAfterDisposeView() {
+ // Container view disposed.
+ underTest.disposeView()
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
+ }
+
+ @Test
+ fun lifecycle_startedAfterShadeShows() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
+
+ // Shade shows up.
+ fakeShadeRepository.setQsExpansion(1.0f)
+ testableLooper.processAllMessages()
+
+ assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
+ }
+ }
+
+ @Test
fun editMode_communalAvailable() =
with(kosmos) {
testScope.runTest {
@@ -371,8 +453,6 @@
private const val CONTAINER_WIDTH = 100
private const val CONTAINER_HEIGHT = 100
private const val RIGHT_SWIPE_REGION_WIDTH = 20
- private const val TOP_SWIPE_REGION_WIDTH = 20
- private const val BOTTOM_SWIPE_REGION_WIDTH = 20
/**
* A touch down event right in the middle of the screen, to avoid being in any of the swipe
@@ -389,17 +469,6 @@
)
private val DOWN_IN_RIGHT_SWIPE_REGION_EVENT =
MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, CONTAINER_WIDTH.toFloat(), 0f, 0)
- private val DOWN_IN_TOP_SWIPE_REGION_EVENT =
- MotionEvent.obtain(
- 0L,
- 0L,
- MotionEvent.ACTION_DOWN,
- 0f,
- TOP_SWIPE_REGION_WIDTH.toFloat(),
- 0
- )
- private val DOWN_IN_BOTTOM_SWIPE_REGION_EVENT =
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, CONTAINER_HEIGHT.toFloat(), 0)
private val MOVE_EVENT = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)
private val UP_EVENT = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
index 7a39a0d..d5e88fe 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -444,7 +444,7 @@
SystemClock systemClock = new FakeSystemClock();
mStatusBarStateController = new StatusBarStateControllerImpl(
mUiEventLogger,
- mKosmos.getInteractionJankMonitor(),
+ () -> mKosmos.getInteractionJankMonitor(),
mJavaAdapter,
() -> mShadeInteractor,
() -> mKosmos.getDeviceUnlockedInteractor(),
@@ -598,7 +598,7 @@
mock(HeadsUpManager.class),
new StatusBarStateControllerImpl(
new UiEventLoggerFake(),
- mKosmos.getInteractionJankMonitor(),
+ () -> mKosmos.getInteractionJankMonitor(),
mJavaAdapter,
() -> mShadeInteractor,
() -> mKosmos.getDeviceUnlockedInteractor(),
@@ -802,7 +802,7 @@
mAccessibilityManager,
mLockscreenGestureLogger,
mMetricsLogger,
- mKosmos.getInteractionJankMonitor(),
+ () -> mKosmos.getInteractionJankMonitor(),
mShadeLog,
mDumpManager,
mDeviceEntryFaceAuthInteractor,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
index da09579..d95cc2e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
@@ -500,6 +500,46 @@
}
@Test
+ fun handleExternalTouch_intercepted_sendsOnTouch() {
+ // Accept dispatch and also intercept.
+ whenever(view.dispatchTouchEvent(any())).thenReturn(true)
+ whenever(view.onInterceptTouchEvent(any())).thenReturn(true)
+
+ underTest.handleExternalTouch(DOWN_EVENT)
+ underTest.handleExternalTouch(MOVE_EVENT)
+
+ // Once intercepted, both events are sent to the view.
+ verify(view).onTouchEvent(DOWN_EVENT)
+ verify(view).onTouchEvent(MOVE_EVENT)
+ }
+
+ @Test
+ fun handleExternalTouch_notDispatched_interceptNotCalled() {
+ // Don't accept dispatch
+ whenever(view.dispatchTouchEvent(any())).thenReturn(false)
+
+ underTest.handleExternalTouch(DOWN_EVENT)
+
+ // Interception is not offered.
+ verify(view, never()).onInterceptTouchEvent(any())
+ }
+
+ @Test
+ fun handleExternalTouch_notIntercepted_onTouchNotSent() {
+ // Accept dispatch, but don't dispatch
+ whenever(view.dispatchTouchEvent(any())).thenReturn(true)
+ whenever(view.onInterceptTouchEvent(any())).thenReturn(false)
+
+ underTest.handleExternalTouch(DOWN_EVENT)
+ underTest.handleExternalTouch(MOVE_EVENT)
+
+ // Interception offered for both events, but onTouchEvent is never called.
+ verify(view).onInterceptTouchEvent(DOWN_EVENT)
+ verify(view).onInterceptTouchEvent(MOVE_EVENT)
+ verify(view, never()).onTouchEvent(any())
+ }
+
+ @Test
fun testGetKeyguardMessageArea() =
testScope.runTest {
underTest.keyguardMessageArea
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java
index 77ad17a..0f51878 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java
@@ -31,7 +31,6 @@
import android.view.ViewParent;
import android.view.accessibility.AccessibilityManager;
-import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.keyguard.KeyguardStatusView;
@@ -169,7 +168,6 @@
protected FakeKeyguardRepository mKeyguardRepository = new FakeKeyguardRepository();
protected FakeShadeRepository mShadeRepository = new FakeShadeRepository();
- protected InteractionJankMonitor mInteractionJankMonitor;
protected SysuiStatusBarStateController mStatusBarStateController;
protected ShadeInteractor mShadeInteractor;
@@ -190,7 +188,6 @@
MockitoAnnotations.initMocks(this);
when(mPanelViewControllerLazy.get()).thenReturn(mNotificationPanelViewController);
mStatusBarStateController = mKosmos.getStatusBarStateController();
- mInteractionJankMonitor = mKosmos.getInteractionJankMonitor();
mKosmos.getFakeDeviceProvisioningRepository().setDeviceProvisioned(true);
FakeFeatureFlagsClassic featureFlags = new FakeFeatureFlagsClassic();
@@ -322,7 +319,7 @@
mAccessibilityManager,
mLockscreenGestureLogger,
mMetricsLogger,
- mInteractionJankMonitor,
+ () -> mKosmos.getInteractionJankMonitor(),
mShadeLogger,
mDumpManager,
mock(DeviceEntryFaceAuthInteractor.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorControllerTest.kt
index 811e9bf..3b3f05d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorControllerTest.kt
@@ -8,7 +8,7 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.jank.interactionJankMonitor
-import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
@@ -19,9 +19,9 @@
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.statusbar.policy.HeadsUpManager
import com.android.systemui.statusbar.policy.HeadsUpUtil
+import com.android.systemui.testKosmos
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertTrue
-import kotlinx.coroutines.test.TestScope
import org.junit.Assert.assertNotSame
import org.junit.Assert.assertSame
import org.junit.Before
@@ -48,7 +48,8 @@
private val notificationLaunchAnimationInteractor =
NotificationLaunchAnimationInteractor(NotificationLaunchAnimationRepository())
- private val testScope = TestScope()
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
private val notificationKey: String
get() = notification.entry.sbn.key
@@ -67,7 +68,7 @@
notificationListContainer,
headsUpManager,
notification,
- Kosmos().interactionJankMonitor,
+ kosmos.interactionJankMonitor,
onFinishAnimationCallback
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
index 8c22511..03a8403 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
@@ -95,6 +95,7 @@
@Mock private InflatedSmartReplyState mInflatedSmartReplyState;
@Mock private InflatedSmartReplyViewHolder mInflatedSmartReplies;
@Mock private NotifLayoutInflaterFactory.Provider mNotifLayoutInflaterFactoryProvider;
+ @Mock private HeadsUpStyleProvider mHeadsUpStyleProvider;
@Mock private NotifLayoutInflaterFactory mNotifLayoutInflaterFactory;
private final SmartReplyStateInflater mSmartReplyStateInflater =
@@ -138,6 +139,7 @@
mock(Executor.class),
mSmartReplyStateInflater,
mNotifLayoutInflaterFactoryProvider,
+ mHeadsUpStyleProvider,
mock(NotificationContentInflaterLogger.class));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
index 954335e..f35ec74 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
@@ -199,6 +199,7 @@
mock(Executor.class),
new MockSmartReplyInflater(),
mock(NotifLayoutInflaterFactory.Provider.class),
+ mock(HeadsUpStyleProvider.class),
mock(NotificationContentInflaterLogger.class));
contentBinder.setInflateSynchronously(true);
mBindStage = new RowContentBindStage(contentBinder,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/AmbientStateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/AmbientStateTest.kt
index 4715b33..fb15948 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/AmbientStateTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/AmbientStateTest.kt
@@ -23,6 +23,7 @@
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
+import com.android.systemui.statusbar.policy.AvalancheController
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
@@ -41,6 +42,7 @@
private val bypassController = StackScrollAlgorithm.BypassController { false }
private val statusBarKeyguardViewManager = mock<StatusBarKeyguardViewManager>()
private val largeScreenShadeInterpolator = mock<LargeScreenShadeInterpolator>()
+ private val avalancheController = mock<AvalancheController>()
private lateinit var sut: AmbientState
@@ -53,7 +55,8 @@
sectionProvider,
bypassController,
statusBarKeyguardViewManager,
- largeScreenShadeInterpolator
+ largeScreenShadeInterpolator,
+ avalancheController
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index 89ae9f4..939d055 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -94,6 +94,7 @@
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.policy.AvalancheController;
import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController;
import org.junit.Assert;
@@ -140,6 +141,7 @@
@Mock private NotificationStackSizeCalculator mNotificationStackSizeCalculator;
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock private LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
+ @Mock private AvalancheController mAvalancheController;
@Before
public void setUp() throws Exception {
@@ -153,7 +155,8 @@
mNotificationSectionsManager,
mBypassController,
mStatusBarKeyguardViewManager,
- mLargeScreenShadeInterpolator
+ mLargeScreenShadeInterpolator,
+ mAvalancheController
));
// Register the debug flags we use
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
index 2c2b183..82725d6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
@@ -25,6 +25,7 @@
import com.android.systemui.statusbar.notification.row.ExpandableView
import com.android.systemui.statusbar.notification.shared.NotificationsImprovedHunAnimation
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
+import com.android.systemui.statusbar.policy.AvalancheController
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Expect
import com.google.common.truth.Truth.assertThat
@@ -48,6 +49,7 @@
@JvmField @Rule var expect: Expect = Expect.create()
private val largeScreenShadeInterpolator = mock<LargeScreenShadeInterpolator>()
+ private val avalancheController = mock<AvalancheController>()
private val hostView = FrameLayout(context)
private val stackScrollAlgorithm = StackScrollAlgorithm(context, hostView)
@@ -71,6 +73,7 @@
/* bypassController */ { false },
mStatusBarKeyguardViewManager,
largeScreenShadeInterpolator,
+ avalancheController
)
private val testableResources = mContext.getOrCreateTestableResources()
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 64f19b6..8eea29b 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
@@ -21,11 +21,13 @@
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.log.core.FakeLogBuffer
+import com.android.systemui.res.R
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor
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.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl
@@ -76,7 +78,8 @@
)
underTest =
- DeviceBasedSatelliteViewModel(
+ DeviceBasedSatelliteViewModelImpl(
+ context,
interactor,
testScope.backgroundScope,
airplaneModeRepository,
@@ -124,6 +127,7 @@
assertThat(latest).isNull()
}
+ @OptIn(ExperimentalCoroutinesApi::class)
@Test
fun icon_nullWhenShouldNotShow_isEmergencyOnly() =
testScope.runTest {
@@ -298,4 +302,313 @@
// THEN icon is set because the device lost wifi connection
assertThat(latest).isInstanceOf(Icon::class.java)
}
+
+ @Test
+ fun carrierText_nullWhenShouldNotShow_satelliteNotAllowed() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // GIVEN satellite is not allowed
+ repo.isSatelliteAllowedForCurrentLocation.value = false
+
+ // 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)
+
+ // THEN carrier text is null because we should not be showing it
+ assertThat(latest).isNull()
+ }
+
+ @Test
+ fun carrierText_nullWhenShouldNotShow_notAllOos() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // GIVEN satellite is allowed + connected
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ repo.connectionState.value = SatelliteConnectionState.Connected
+
+ // GIVEN all icons are not OOS
+ val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
+ i1.isInService.value = true
+ i1.isEmergencyOnly.value = false
+
+ // GIVEN apm is disabled
+ airplaneModeRepository.setIsAirplaneMode(false)
+
+ // THEN carrier text is null because we have service
+ assertThat(latest).isNull()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_nullWhenShouldNotShow_isEmergencyOnly() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // GIVEN satellite is allowed + connected
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ repo.connectionState.value = SatelliteConnectionState.Connected
+
+ // 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)
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ // THEN carrier text is set because we don't have service
+ assertThat(latest).isNotNull()
+
+ // GIVEN the connection is emergency only
+ i1.isEmergencyOnly.value = true
+
+ // THEN carrier text is null because we have emergency connection
+ assertThat(latest).isNull()
+ }
+
+ @Test
+ fun carrierText_nullWhenShouldNotShow_apmIsEnabled() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // GIVEN satellite is allowed + connected
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ repo.connectionState.value = SatelliteConnectionState.Connected
+
+ // GIVEN all icons are OOS
+ val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
+ i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
+
+ // GIVEN apm is enabled
+ airplaneModeRepository.setIsAirplaneMode(true)
+
+ // THEN carrier text is null because we should not be showing it
+ assertThat(latest).isNull()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_satelliteIsOn() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // GIVEN satellite is allowed + connected
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ repo.connectionState.value = SatelliteConnectionState.Connected
+
+ // 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)
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ // THEN carrier text is set because we don't have service
+ assertThat(latest).isNotNull()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_hysteresisWhenEnablingText() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // GIVEN satellite is allowed + connected
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ repo.connectionState.value = SatelliteConnectionState.Connected
+
+ // 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)
+
+ // THEN carrier text is null because of the hysteresis
+ assertThat(latest).isNull()
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ // THEN carrier text is set after the delay
+ assertThat(latest).isNotNull()
+
+ // GIVEN apm is enabled
+ airplaneModeRepository.setIsAirplaneMode(true)
+
+ // THEN carrier text is null immediately
+ assertThat(latest).isNull()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_deviceIsProvisioned() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // GIVEN satellite is allowed + connected
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ repo.connectionState.value = SatelliteConnectionState.Connected
+
+ // 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 carrier text 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 carrier text is null because the device is not provisioned
+ assertThat(latest).isNotNull()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_wifiIsActive() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // GIVEN satellite is allowed + connected
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ repo.connectionState.value = SatelliteConnectionState.Connected
+
+ // 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 provisioned
+ deviceProvisionedRepository.setDeviceProvisioned(true)
+
+ // GIVEN wifi network is active
+ wifiRepository.setWifiNetwork(WifiNetworkModel.Active(networkId = 0, level = 1))
+
+ // THEN carrier text is null because the device is connected to wifi
+ assertThat(latest).isNull()
+
+ // GIVEN device loses wifi connection
+ wifiRepository.setWifiNetwork(WifiNetworkModel.Invalid("test"))
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ // THEN carrier text is set because the device lost wifi connection
+ assertThat(latest).isNotNull()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_connectionStateUnknown_null() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // Set up the conditions for satellite to be enabled
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
+ i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
+ airplaneModeRepository.setIsAirplaneMode(false)
+
+ repo.connectionState.value = SatelliteConnectionState.Unknown
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ assertThat(latest).isNull()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_connectionStateOff_null() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // Set up the conditions for satellite to be enabled
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
+ i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
+ airplaneModeRepository.setIsAirplaneMode(false)
+
+ repo.connectionState.value = SatelliteConnectionState.Off
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ assertThat(latest).isNull()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_connectionStateOn_notConnectedString() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // Set up the conditions for satellite to be enabled
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
+ i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
+ airplaneModeRepository.setIsAirplaneMode(false)
+
+ repo.connectionState.value = SatelliteConnectionState.On
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ assertThat(latest)
+ .isEqualTo(context.getString(R.string.satellite_not_connected_carrier_text))
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun carrierText_connectionStateConnected_connectedString() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.carrierText)
+
+ // Set up the conditions for satellite to be enabled
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+ val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
+ i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
+ airplaneModeRepository.setIsAirplaneMode(false)
+
+ repo.connectionState.value = SatelliteConnectionState.Connected
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ assertThat(latest)
+ .isEqualTo(context.getString(R.string.satellite_connected_carrier_text))
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/FakeDeviceBasedSatelliteViewModel.kt
similarity index 62%
copy from packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
copy to packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/FakeDeviceBasedSatelliteViewModel.kt
index c4476fc..f125ef12 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/FakeDeviceBasedSatelliteViewModel.kt
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-package com.android.systemui.volume.panel.component.mediaoutput.shared.model
+package com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel
-import android.media.session.PlaybackState
+import com.android.systemui.common.shared.model.Icon
+import kotlinx.coroutines.flow.MutableStateFlow
-data class SessionWithPlayback(
- val session: MediaDeviceSession,
- val playback: PlaybackState,
-)
+class FakeDeviceBasedSatelliteViewModel : DeviceBasedSatelliteViewModel {
+ override val icon = MutableStateFlow<Icon?>(null)
+ override val carrierText = MutableStateFlow<String?>(null)
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffectTest.kt b/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffectTest.kt
new file mode 100644
index 0000000..8105cc5
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/gloweffect/GlowPieEffectTest.kt
@@ -0,0 +1,129 @@
+/*
+ * 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.surfaceeffects.gloweffect
+
+import android.graphics.Color
+import android.graphics.RenderEffect
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.systemui.animation.AnimatorTestRule
+import com.android.systemui.model.SysUiStateTest
+import com.android.systemui.surfaceeffects.RenderEffectDrawCallback
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+class GlowPieEffectTest : SysUiStateTest() {
+
+ @get:Rule val animatorTestRule = AnimatorTestRule(this)
+
+ @Test
+ fun play_triggersDrawCallback() {
+ var effectFromCallback: RenderEffect? = null
+ val glowPieEffectConfig =
+ GlowPieEffectConfig(
+ centerX = 0f,
+ centerY = 0f,
+ width = 1f,
+ height = 1f,
+ cornerRadius = 0.5f,
+ colors = intArrayOf(Color.RED, Color.GREEN, Color.BLUE)
+ )
+ val drawCallback =
+ object : RenderEffectDrawCallback {
+ override fun onDraw(renderEffect: RenderEffect) {
+ effectFromCallback = renderEffect
+ }
+ }
+ val glowPieEffect = GlowPieEffect(glowPieEffectConfig, drawCallback)
+
+ assertThat(effectFromCallback).isNull()
+
+ glowPieEffect.play()
+
+ animatorTestRule.advanceTimeBy(100L)
+
+ assertThat(effectFromCallback).isNotNull()
+ }
+
+ @Test
+ fun finish_cancelsAnimator() {
+ val glowPieEffectConfig =
+ GlowPieEffectConfig(
+ centerX = 0f,
+ centerY = 0f,
+ width = 1f,
+ height = 1f,
+ cornerRadius = 0.5f,
+ colors = intArrayOf(Color.RED, Color.GREEN, Color.BLUE)
+ )
+ val drawCallback =
+ object : RenderEffectDrawCallback {
+ override fun onDraw(renderEffect: RenderEffect) {}
+ }
+ val glowPieEffect = GlowPieEffect(glowPieEffectConfig, drawCallback)
+
+ glowPieEffect.play()
+ animatorTestRule.advanceTimeBy(100L)
+
+ assertThat(glowPieEffect.mainAnimator.isRunning).isTrue()
+
+ glowPieEffect.finish()
+
+ assertThat(glowPieEffect.mainAnimator.isRunning).isFalse()
+ }
+
+ @Test
+ fun glowPie_progress_computesProgressCorrectly() {
+ val myGlowPieConfig =
+ object : GlowPieEffect.GlowPie {
+ override val startMs: Float = 0f
+ override val endMs: Float = GlowPieEffect.DURATION_MS.toFloat()
+ override val startAngle: Float = 0f
+ override val endAngle: Float = 6f * GlowPieEffect.PI
+ override val alphaFadeStartMs: Float = 0f
+ override val alphaFadeEndMs: Float = GlowPieEffect.DURATION_MS.toFloat()
+ override var progress: Float = 0f
+ override var time: Float = 0f
+ }
+
+ val playTime = GlowPieEffect.DURATION_MS.toFloat() * 0.5f
+ val tolerance = 1e-4f
+ myGlowPieConfig.updateProgress(playTime)
+
+ assertThat(myGlowPieConfig.time).isWithin(tolerance).of(playTime)
+ assertThat(myGlowPieConfig.progress).isWithin(tolerance).of(0.5f)
+ assertThat(myGlowPieConfig.angle()).isWithin(tolerance).of(-3.5f * GlowPieEffect.PI)
+ assertThat(myGlowPieConfig.bottomThreshold())
+ .isWithin(tolerance)
+ .of((1f - GlowPieEffect.FEATHER) * 0.5f)
+ assertThat(myGlowPieConfig.topThreshold())
+ .isWithin(tolerance)
+ .of((1f + GlowPieEffect.FEATHER) * 0.5f)
+ assertThat(myGlowPieConfig.alpha()).isWithin(tolerance).of(0.5f)
+
+ myGlowPieConfig.resetProgress()
+
+ assertThat(myGlowPieConfig.time).isEqualTo(0f)
+ assertThat(myGlowPieConfig.progress).isEqualTo(0f)
+ }
+}
diff --git a/packages/SystemUI/tests/utils/src/android/os/LooperKosmos.kt b/packages/SystemUI/tests/utils/src/android/os/LooperKosmos.kt
index a8ca9bfc..4303365 100644
--- a/packages/SystemUI/tests/utils/src/android/os/LooperKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/android/os/LooperKosmos.kt
@@ -22,7 +22,12 @@
import com.android.systemui.kosmos.testCase
val Kosmos.looper by Fixture {
- checkNotNull(TestableLooper.get(testCase).looper) {
- "TestableLooper is returning null, make sure the test class is annotated with RunWithLooper"
+ val testableLooper = TestableLooper.get(testCase)
+ checkNotNull(testableLooper) {
+ "TestableLooper is null, make sure the test class is annotated with RunWithLooper"
+ }
+ checkNotNull(testableLooper.looper) {
+ "TestableLooper.getLooper() is returning null, make sure the test class is annotated " +
+ "with RunWithLooper"
}
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestDependency.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestDependency.kt
index 7bb4218..4e6a7a9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestDependency.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestDependency.kt
@@ -4,7 +4,6 @@
import android.os.Looper
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.animation.fakeDialogTransitionAnimator
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.broadcast.FakeBroadcastDispatcher
import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger
@@ -39,10 +38,7 @@
// Ravenwood doesn't yet provide UI animations, so we sidestep this global configuration
// step; any tests that rely on it are already being excluded under Ravenwood
if (!SysuiTestCase.isRavenwoodTest()) {
- dependency.injectTestDependency(
- DialogTransitionAnimator::class.java,
- fakeDialogTransitionAnimator()
- )
+ dependency.injectMockDependency(DialogTransitionAnimator::class.java)
}
// Many tests end up creating a BroadcastDispatcher. Instead, give them a fake that will
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/animation/DialogTransitionAnimatorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/animation/DialogTransitionAnimatorKosmos.kt
index ed291d1..77cb167 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/animation/DialogTransitionAnimatorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/animation/DialogTransitionAnimatorKosmos.kt
@@ -16,7 +16,10 @@
package com.android.systemui.animation
+import com.android.systemui.jank.interactionJankMonitor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
-val Kosmos.dialogTransitionAnimator by Fixture { fakeDialogTransitionAnimator() }
+val Kosmos.dialogTransitionAnimator by Fixture {
+ fakeDialogTransitionAnimator(interactionJankMonitor = interactionJankMonitor)
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeDialogTransitionAnimator.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeDialogTransitionAnimator.kt
index 7c5bb12..48b72d0 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeDialogTransitionAnimator.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeDialogTransitionAnimator.kt
@@ -15,15 +15,15 @@
package com.android.systemui.animation
import com.android.internal.jank.InteractionJankMonitor
-import org.mockito.Mockito.mock
+import com.android.systemui.jank.interactionJankMonitor
/** A [DialogTransitionAnimator] to be used in tests. */
@JvmOverloads
fun fakeDialogTransitionAnimator(
isUnlocked: Boolean = true,
isShowingAlternateAuthOnUnlock: Boolean = false,
- interactionJankMonitor: InteractionJankMonitor = mock(InteractionJankMonitor::class.java),
isPredictiveBackQsDialogAnim: Boolean = false,
+ interactionJankMonitor: InteractionJankMonitor,
): DialogTransitionAnimator {
return DialogTransitionAnimator(
callback =
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFacePropertyRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFacePropertyRepository.kt
index 8a95136..65eb338 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFacePropertyRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFacePropertyRepository.kt
@@ -20,6 +20,7 @@
import android.graphics.Point
import com.android.systemui.biometrics.shared.model.LockoutMode
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.shared.model.DevicePosture
import dagger.Binds
import dagger.Module
import javax.inject.Inject
@@ -42,6 +43,8 @@
override val cameraInfo: StateFlow<CameraInfo?>
get() = currentCameraInfo
+ override val supportedPostures: List<DevicePosture> = listOf(DevicePosture.CLOSED)
+
fun setLockoutMode(userId: Int, mode: LockoutMode) {
lockoutModesForUser[userId] = mode
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/BluetoothAdapterKosmos.kt
similarity index 71%
copy from packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/BluetoothAdapterKosmos.kt
index c4476fc..854548c 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/BluetoothAdapterKosmos.kt
@@ -14,11 +14,10 @@
* limitations under the License.
*/
-package com.android.systemui.volume.panel.component.mediaoutput.shared.model
+package com.android.systemui.bluetooth
-import android.media.session.PlaybackState
+import android.bluetooth.BluetoothAdapter
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
-data class SessionWithPlayback(
- val session: MediaDeviceSession,
- val playback: PlaybackState,
-)
+var Kosmos.bluetoothAdapter: BluetoothAdapter by Kosmos.Fixture { mock {} }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/CachedBluetoothDeviceManagerKosmos.kt
similarity index 67%
copy from packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/CachedBluetoothDeviceManagerKosmos.kt
index c4476fc..07f0995 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/CachedBluetoothDeviceManagerKosmos.kt
@@ -14,11 +14,10 @@
* limitations under the License.
*/
-package com.android.systemui.volume.panel.component.mediaoutput.shared.model
+package com.android.systemui.bluetooth
-import android.media.session.PlaybackState
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
-data class SessionWithPlayback(
- val session: MediaDeviceSession,
- val playback: PlaybackState,
-)
+var Kosmos.cachedBluetoothDeviceManager: CachedBluetoothDeviceManager by Kosmos.Fixture { mock {} }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/VolumeKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/LocalBluetoothManagerKosmos.kt
similarity index 63%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/volume/VolumeKosmos.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/LocalBluetoothManagerKosmos.kt
index 5e1f85c..eef89e7 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/VolumeKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bluetooth/LocalBluetoothManagerKosmos.kt
@@ -14,11 +14,14 @@
* limitations under the License.
*/
-package com.android.systemui.volume
+package com.android.systemui.bluetooth
-import com.android.settingslib.volume.domain.interactor.AudioModeInteractor
+import com.android.settingslib.bluetooth.LocalBluetoothManager
import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.volume.data.repository.FakeAudioRepository
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
-val Kosmos.audioRepository by Kosmos.Fixture { FakeAudioRepository() }
-val Kosmos.audioModeInteractor by Kosmos.Fixture { AudioModeInteractor(audioRepository) }
+var Kosmos.localBluetoothManager: LocalBluetoothManager? by
+ Kosmos.Fixture {
+ mock { whenever(cachedDeviceManager).thenReturn(cachedBluetoothDeviceManager) }
+ }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/data/repository/FakeKeyguardBouncerRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/data/repository/FakeKeyguardBouncerRepository.kt
index 8010261..baaf604 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/data/repository/FakeKeyguardBouncerRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/data/repository/FakeKeyguardBouncerRepository.kt
@@ -1,6 +1,6 @@
package com.android.systemui.bouncer.data.repository
-import com.android.systemui.biometrics.shared.SideFpsControllerRefactor
+import com.android.keyguard.KeyguardSecurityModel
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants
import com.android.systemui.bouncer.shared.model.BouncerDismissActionModel
import com.android.systemui.bouncer.shared.model.BouncerShowMessageModel
@@ -11,7 +11,6 @@
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -52,8 +51,8 @@
override var lastAlternateBouncerVisibleTime: Long = 0L
private val _isAlternateBouncerUIAvailable = MutableStateFlow<Boolean>(false)
override val alternateBouncerUIAvailable = _isAlternateBouncerUIAvailable.asStateFlow()
- private val _sideFpsShowing: MutableStateFlow<Boolean> = MutableStateFlow(false)
- override val sideFpsShowing: StateFlow<Boolean> = _sideFpsShowing.asStateFlow()
+ override val lastShownSecurityMode: MutableStateFlow<KeyguardSecurityModel.SecurityMode> =
+ MutableStateFlow(KeyguardSecurityModel.SecurityMode.Invalid)
override var bouncerDismissActionModel: BouncerDismissActionModel? = null
override fun setPrimaryScrimmed(isScrimmed: Boolean) {
@@ -116,10 +115,8 @@
_isBackButtonEnabled.value = isBackButtonEnabled
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- override fun setSideFpsShowing(isShowing: Boolean) {
- SideFpsControllerRefactor.assertInLegacyMode()
- _sideFpsShowing.value = isShowing
+ override fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode) {
+ lastShownSecurityMode.value = securityMode
}
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt
index 4ed6fe2..329c0f1 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt
@@ -46,6 +46,10 @@
_communalWidgets.value = _communalWidgets.value.filter { it.appWidgetId != widgetId }
}
+ override fun restoreWidgets(oldToNewWidgetIdMap: Map<Int, Int>) {}
+
+ override fun abortRestoreWidgets() {}
+
private fun onConfigured(id: Int, providerInfo: AppWidgetProviderInfo, priority: Int) {
_communalWidgets.value += listOf(CommunalWidgetContentModel(id, providerInfo, priority))
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerFlagParameterization.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerFlagParameterization.kt
index 4e24233..e2a1fe4 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerFlagParameterization.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerFlagParameterization.kt
@@ -58,3 +58,8 @@
*/
fun List<FlagsParameterization>.andSceneContainer(): List<FlagsParameterization> =
flatMap { it.andSceneContainer() }.toList()
+
+/** Parameterizes only the scene container flag. */
+fun parameterizeSceneContainerFlag(): List<FlagsParameterization> {
+ return FlagsParameterization.allCombinationsOf().andSceneContainer()
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/jank/InteractionJankMonitorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/jank/InteractionJankMonitorKosmos.kt
index e2b5869..f0f1cc0 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/jank/InteractionJankMonitorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/jank/InteractionJankMonitorKosmos.kt
@@ -17,23 +17,40 @@
package com.android.systemui.jank
import android.os.HandlerThread
+import android.os.fakeExecutorHandler
+import android.view.View
import com.android.internal.jank.InteractionJankMonitor
-import com.android.internal.jank.InteractionJankMonitor.Configuration.Builder
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
-import com.android.systemui.util.mockito.any
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.spy
+import org.mockito.Mockito
val Kosmos.interactionJankMonitor by
Fixture<InteractionJankMonitor> {
- spy(InteractionJankMonitor(HandlerThread("InteractionJankMonitor-Kosmos"))).apply {
- doReturn(true).`when`(this).shouldMonitor()
- doReturn(true).`when`(this).begin(any(), anyInt())
- doReturn(true).`when`(this).begin(any<Builder>())
- doReturn(true).`when`(this).end(anyInt())
- doReturn(true).`when`(this).cancel(anyInt())
- doReturn(true).`when`(this).cancel(anyInt(), anyInt())
- }
+ val worker =
+ Mockito.mock(HandlerThread::class.java).also { worker ->
+ Mockito.doAnswer {
+ fakeExecutorHandler.also { handler ->
+ Mockito.doAnswer {
+ // TODO(b/333927129): Should return `android.os.looper` instead
+ null
+ }
+ .`when`(handler)
+ .looper
+ }
+ }
+ .`when`(worker)
+ .threadHandler
+ }
+
+ // Return a `spy` so that tests can verify method calls
+ Mockito.spy(
+ object : InteractionJankMonitor(worker) {
+ override fun shouldMonitor(): Boolean = true
+ override fun begin(builder: Configuration.Builder): Boolean = true
+ override fun begin(v: View?, cujType: Int): Boolean = true
+ override fun end(cujType: Int): Boolean = true
+ override fun cancel(cujType: Int): Boolean = true
+ override fun cancel(cujType: Int, reason: Int) = true
+ }
+ )
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
similarity index 99%
rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
index af785c2..450f08f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
@@ -28,7 +28,7 @@
import com.google.common.truth.Truth
import com.google.common.truth.Truth.assertAbout
import junit.framework.Assert.assertEquals
-import kotlin.test.fail
+import org.junit.Assert.fail
import org.mockito.Mockito
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
index 162f278..d4b7937 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
@@ -22,6 +22,7 @@
import android.os.fakeExecutorHandler
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.bouncerRepository
+import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
import com.android.systemui.bouncer.domain.interactor.simBouncerInteractor
import com.android.systemui.classifier.falsingCollector
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
@@ -30,8 +31,8 @@
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.concurrency.fakeExecutor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
-import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.globalactions.domain.interactor.globalActionsInteractor
import com.android.systemui.haptics.qs.qsLongPressEffect
import com.android.systemui.jank.interactionJankMonitor
@@ -41,6 +42,7 @@
import com.android.systemui.keyguard.domain.interactor.fromLockscreenTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.fromPrimaryBouncerTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.model.sceneContainerPlugin
import com.android.systemui.plugins.statusbar.statusBarStateController
@@ -50,6 +52,8 @@
import com.android.systemui.scene.sceneContainerConfig
import com.android.systemui.scene.shared.model.sceneDataSource
import com.android.systemui.settings.brightness.domain.interactor.brightnessMirrorShowingInteractor
+import com.android.systemui.shade.data.repository.shadeRepository
+import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.shadeController
import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor
import com.android.systemui.statusbar.phone.screenOffAnimationController
@@ -69,7 +73,6 @@
val testDispatcher by lazy { kosmos.testDispatcher }
val testScope by lazy { kosmos.testScope }
- val fakeFeatureFlags by lazy { kosmos.fakeFeatureFlagsClassic }
val fakeExecutor by lazy { kosmos.fakeExecutor }
val fakeExecutorHandler by lazy { kosmos.fakeExecutorHandler }
val configurationRepository by lazy { kosmos.fakeConfigurationRepository }
@@ -77,6 +80,8 @@
val bouncerRepository by lazy { kosmos.bouncerRepository }
val communalRepository by lazy { kosmos.fakeCommunalRepository }
val keyguardRepository by lazy { kosmos.fakeKeyguardRepository }
+ val keyguardBouncerRepository by lazy { kosmos.fakeKeyguardBouncerRepository }
+ val keyguardInteractor by lazy { kosmos.keyguardInteractor }
val keyguardTransitionRepository by lazy { kosmos.fakeKeyguardTransitionRepository }
val keyguardTransitionInteractor by lazy { kosmos.keyguardTransitionInteractor }
val powerRepository by lazy { kosmos.fakePowerRepository }
@@ -91,6 +96,7 @@
val falsingCollector by lazy { kosmos.falsingCollector }
val powerInteractor by lazy { kosmos.powerInteractor }
val deviceEntryInteractor by lazy { kosmos.deviceEntryInteractor }
+ val deviceEntryUdfpsInteractor by lazy { kosmos.deviceEntryUdfpsInteractor }
val deviceUnlockedInteractor by lazy { kosmos.deviceUnlockedInteractor }
val communalInteractor by lazy { kosmos.communalInteractor }
val sceneContainerPlugin by lazy { kosmos.sceneContainerPlugin }
@@ -110,6 +116,8 @@
val brightnessMirrorShowingInteractor by lazy { kosmos.brightnessMirrorShowingInteractor }
val qsLongPressEffect by lazy { kosmos.qsLongPressEffect }
val shadeController by lazy { kosmos.shadeController }
+ val shadeRepository by lazy { kosmos.shadeRepository }
+ val shadeInteractor by lazy { kosmos.shadeInteractor }
init {
kosmos.applicationContext = testCase.context
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelKosmos.kt
index 9a181cd..6eae28f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelKosmos.kt
@@ -24,7 +24,7 @@
import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor
import com.android.systemui.media.controls.util.mediaFlags
import com.android.systemui.media.controls.util.mediaUiEventLogger
-import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
+import com.android.systemui.statusbar.notification.collection.provider.visualStabilityProvider
val Kosmos.mediaCarouselViewModel by
Kosmos.Fixture {
@@ -32,7 +32,7 @@
applicationScope = applicationCoroutineScope,
applicationContext = applicationContext,
backgroundDispatcher = testDispatcher,
- visualStabilityProvider = VisualStabilityProvider(),
+ visualStabilityProvider = visualStabilityProvider,
interactor = mediaCarouselInteractor,
controlInteractorFactory = mediaControlInteractorFactory,
recommendationsViewModel = mediaRecommendationsViewModel,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/statusbar/StatusBarStateControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/statusbar/StatusBarStateControllerKosmos.kt
index 695e594..3762497 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/statusbar/StatusBarStateControllerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/statusbar/StatusBarStateControllerKosmos.kt
@@ -31,7 +31,7 @@
Kosmos.Fixture {
StatusBarStateControllerImpl(
uiEventLogger,
- interactionJankMonitor,
+ { interactionJankMonitor },
mock(),
{ shadeInteractor },
{ deviceUnlockedInteractor },
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/FakeWindowRootViewComponent.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/FakeWindowRootViewComponent.kt
similarity index 95%
rename from packages/SystemUI/tests/src/com/android/systemui/scene/FakeWindowRootViewComponent.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/scene/FakeWindowRootViewComponent.kt
index 63a05d7..6ac3a62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/FakeWindowRootViewComponent.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/FakeWindowRootViewComponent.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.
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerStartableKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerStartableKosmos.kt
index 8f6171d..c7cf934 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerStartableKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerStartableKosmos.kt
@@ -16,6 +16,7 @@
package com.android.systemui.scene.domain.interactor
+import com.android.internal.logging.uiEventLogger
import com.android.systemui.authentication.domain.interactor.authenticationInteractor
import com.android.systemui.bouncer.domain.interactor.bouncerInteractor
import com.android.systemui.bouncer.domain.interactor.simBouncerInteractor
@@ -63,5 +64,6 @@
occlusionInteractor = sceneContainerOcclusionInteractor,
faceUnlockInteractor = deviceEntryFaceAuthInteractor,
shadeInteractor = shadeInteractor,
+ uiEventLogger = uiEventLogger,
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProviderKosmos.kt
similarity index 72%
copy from packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProviderKosmos.kt
index c4476fc..9a5f126 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProviderKosmos.kt
@@ -14,11 +14,8 @@
* limitations under the License.
*/
-package com.android.systemui.volume.panel.component.mediaoutput.shared.model
+package com.android.systemui.statusbar.notification.collection.provider
-import android.media.session.PlaybackState
+import com.android.systemui.kosmos.Kosmos
-data class SessionWithPlayback(
- val session: MediaDeviceSession,
- val playback: PlaybackState,
-)
+val Kosmos.visualStabilityProvider by Kosmos.Fixture { VisualStabilityProvider() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/AmbientStateKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/AmbientStateKosmos.kt
index 7f6f698..383e31d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/AmbientStateKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/AmbientStateKosmos.kt
@@ -33,5 +33,6 @@
/*bypassController=*/ stackScrollAlgorithmBypassController,
/*statusBarKeyguardViewManager=*/ statusBarKeyguardViewManager,
/*largeScreenShadeInterpolator=*/ largeScreenShadeInterpolator,
+ /*avalancheController=*/ avalancheController,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmKosmos.kt
index 67343c95..e20ce27 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmKosmos.kt
@@ -18,6 +18,7 @@
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.statusbar.policy.AvalancheController
import com.android.systemui.util.mockito.mock
var Kosmos.stackScrollAlgorithmSectionProvider by Fixture {
@@ -27,3 +28,7 @@
var Kosmos.stackScrollAlgorithmBypassController by Fixture {
mock<StackScrollAlgorithm.BypassController>()
}
+
+var Kosmos.avalancheController by Fixture {
+ mock<AvalancheController>()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/AudioRepositoryKosmos.kt
similarity index 72%
copy from packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/AudioRepositoryKosmos.kt
index c4476fc..5cf214a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/AudioRepositoryKosmos.kt
@@ -14,11 +14,8 @@
* limitations under the License.
*/
-package com.android.systemui.volume.panel.component.mediaoutput.shared.model
+package com.android.systemui.volume.data.repository
-import android.media.session.PlaybackState
+import com.android.systemui.kosmos.Kosmos
-data class SessionWithPlayback(
- val session: MediaDeviceSession,
- val playback: PlaybackState,
-)
+val Kosmos.audioRepository by Kosmos.Fixture { FakeAudioRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt
index 4788624..617fc52 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt
@@ -30,16 +30,14 @@
class FakeAudioRepository : AudioRepository {
private val mutableMode = MutableStateFlow(0)
- override val mode: StateFlow<Int>
- get() = mutableMode.asStateFlow()
+ override val mode: StateFlow<Int> = mutableMode.asStateFlow()
private val mutableRingerMode = MutableStateFlow(RingerMode(0))
- override val ringerMode: StateFlow<RingerMode>
- get() = mutableRingerMode.asStateFlow()
+ override val ringerMode: StateFlow<RingerMode> = mutableRingerMode.asStateFlow()
private val mutableCommunicationDevice = MutableStateFlow<AudioDeviceInfo?>(null)
- override val communicationDevice: StateFlow<AudioDeviceInfo?>
- get() = mutableCommunicationDevice.asStateFlow()
+ override val communicationDevice: StateFlow<AudioDeviceInfo?> =
+ mutableCommunicationDevice.asStateFlow()
private val models: MutableMap<AudioStream, MutableStateFlow<AudioStreamModel>> = mutableMapOf()
private val lastAudibleVolumes: MutableMap<AudioStream, Int> = mutableMapOf()
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/VolumeKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/AudioModeInteractorKosmos.kt
similarity index 81%
rename from packages/SystemUI/tests/utils/src/com/android/systemui/volume/VolumeKosmos.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/AudioModeInteractorKosmos.kt
index 5e1f85c..99354be 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/VolumeKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/AudioModeInteractorKosmos.kt
@@ -14,11 +14,10 @@
* limitations under the License.
*/
-package com.android.systemui.volume
+package com.android.systemui.volume.domain.interactor
import com.android.settingslib.volume.domain.interactor.AudioModeInteractor
import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.volume.data.repository.FakeAudioRepository
+import com.android.systemui.volume.data.repository.audioRepository
-val Kosmos.audioRepository by Kosmos.Fixture { FakeAudioRepository() }
val Kosmos.audioModeInteractor by Kosmos.Fixture { AudioModeInteractor(audioRepository) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorKosmos.kt
new file mode 100644
index 0000000..1b18ff5
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorKosmos.kt
@@ -0,0 +1,40 @@
+/*
+ * 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.volume.domain.interactor
+
+import com.android.systemui.bluetooth.bluetoothAdapter
+import com.android.systemui.bluetooth.localBluetoothManager
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.volume.data.repository.audioRepository
+import com.android.systemui.volume.localMediaRepositoryFactory
+import com.android.systemui.volume.mediaOutputInteractor
+
+val Kosmos.audioOutputInteractor by
+ Kosmos.Fixture {
+ AudioOutputInteractor(
+ audioRepository,
+ audioModeInteractor,
+ testScope.backgroundScope,
+ testScope.testScheduler,
+ localBluetoothManager,
+ bluetoothAdapter,
+ deviceIconInteractor,
+ mediaOutputInteractor,
+ localMediaRepositoryFactory,
+ )
+ }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/DeviceIconInteractorKosmos.kt
similarity index 70%
copy from packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/DeviceIconInteractorKosmos.kt
index c4476fc..0a27c2a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/DeviceIconInteractorKosmos.kt
@@ -14,11 +14,10 @@
* limitations under the License.
*/
-package com.android.systemui.volume.panel.component.mediaoutput.shared.model
+package com.android.systemui.volume.domain.interactor
-import android.media.session.PlaybackState
+import android.content.applicationContext
+import com.android.systemui.kosmos.Kosmos
-data class SessionWithPlayback(
- val session: MediaDeviceSession,
- val playback: PlaybackState,
-)
+var Kosmos.deviceIconInteractor: DeviceIconInteractor by
+ Kosmos.Fixture { DeviceIconInteractor(applicationContext) }
diff --git a/ravenwood/texts/ravenwood-annotation-allowed-classes.txt b/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
index 9b4d378..243e224 100644
--- a/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
+++ b/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
@@ -266,6 +266,8 @@
android.telephony.ModemActivityInfo
android.telephony.ServiceState
+android.os.connectivity.WifiActivityEnergyInfo
+
com.android.server.LocalServices
com.android.internal.util.BitUtils
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig
index eb2ef29..0448f6d 100644
--- a/services/accessibility/accessibility.aconfig
+++ b/services/accessibility/accessibility.aconfig
@@ -118,6 +118,16 @@
}
flag {
+ name: "manager_avoid_receiver_timeout"
+ namespace: "accessibility"
+ description: "Avoid broadcast receiver timeout by offloading potentially slow operations to the background thread."
+ bug: "333890389"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "pinch_zoom_zero_min_span"
namespace: "accessibility"
description: "Whether to set min span of ScaleGestureDetector to zero."
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index fc0fb5b..ad869a1 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -994,43 +994,10 @@
"context=" + context + ";intent=" + intent);
}
- String action = intent.getAction();
- if (Intent.ACTION_USER_SWITCHED.equals(action)) {
- switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
- } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) {
- unlockUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
- } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
- removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
- } else if (Intent.ACTION_SETTING_RESTORED.equals(action)) {
- final String which = intent.getStringExtra(Intent.EXTRA_SETTING_NAME);
- if (Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES.equals(which)) {
- synchronized (mLock) {
- restoreEnabledAccessibilityServicesLocked(
- intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE),
- intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE),
- intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT,
- 0));
- }
- } else if (ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED.equals(which)) {
- synchronized (mLock) {
- restoreLegacyDisplayMagnificationNavBarIfNeededLocked(
- intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE),
- intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT,
- 0));
- }
- } else if (Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS.equals(which)) {
- synchronized (mLock) {
- restoreAccessibilityButtonTargetsLocked(
- intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE),
- intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE));
- }
- } else if (Settings.Secure.ACCESSIBILITY_QS_TARGETS.equals(which)) {
- if (!android.view.accessibility.Flags.a11yQsShortcut()) {
- return;
- }
- restoreAccessibilityQsTargets(
- intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE));
- }
+ if (com.android.server.accessibility.Flags.managerAvoidReceiverTimeout()) {
+ BackgroundThread.getHandler().post(() -> processBroadcast(intent));
+ } else {
+ processBroadcast(intent);
}
}
}, UserHandle.ALL, intentFilter, null, null);
@@ -2033,6 +2000,19 @@
mA11yWindowManager.onTouchInteractionEnd();
}
+ private void processBroadcast(Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_USER_SWITCHED.equals(action)) {
+ switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
+ } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) {
+ unlockUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
+ } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
+ removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
+ } else if (Intent.ACTION_SETTING_RESTORED.equals(action)) {
+ restoreSetting(intent);
+ }
+ }
+
@VisibleForTesting
void switchUser(int userId) {
mMagnificationController.updateUserIdIfNeeded(userId);
@@ -2125,6 +2105,38 @@
getMagnificationController().onUserRemoved(userId);
}
+ private void restoreSetting(Intent intent) {
+ final String which = intent.getStringExtra(Intent.EXTRA_SETTING_NAME);
+ if (Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES.equals(which)) {
+ synchronized (mLock) {
+ restoreEnabledAccessibilityServicesLocked(
+ intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE),
+ intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE),
+ intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT,
+ 0));
+ }
+ } else if (ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED.equals(which)) {
+ synchronized (mLock) {
+ restoreLegacyDisplayMagnificationNavBarIfNeededLocked(
+ intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE),
+ intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT,
+ 0));
+ }
+ } else if (Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS.equals(which)) {
+ synchronized (mLock) {
+ restoreAccessibilityButtonTargetsLocked(
+ intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE),
+ intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE));
+ }
+ } else if (Settings.Secure.ACCESSIBILITY_QS_TARGETS.equals(which)) {
+ if (!android.view.accessibility.Flags.a11yQsShortcut()) {
+ return;
+ }
+ restoreAccessibilityQsTargets(
+ intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE));
+ }
+ }
+
// Called only during settings restore; currently supports only the owner user
// TODO: http://b/22388012
void restoreEnabledAccessibilityServicesLocked(String oldSetting, String newSetting,
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index 5e566aa..522aa67 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -202,6 +202,7 @@
// Default max API calls per reset interval for generated preview API rate limiting.
private static final int DEFAULT_GENERATED_PREVIEW_MAX_CALLS_PER_INTERVAL = 2;
+ private static final String PENDING_DELETED_IDS_ATTR = "pending_deleted_ids";
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
@@ -228,6 +229,11 @@
onPackageBroadcastReceived(intent, getSendingUserId());
updateWidgetPackageSuspensionMaskedState(intent, false, getSendingUserId());
break;
+ case Intent.ACTION_PACKAGE_RESTARTED:
+ case Intent.ACTION_PACKAGE_UNSTOPPED:
+ if (!android.content.pm.Flags.stayStopped()) return;
+ updateWidgetPackageStoppedMaskedState(intent);
+ break;
default:
onPackageBroadcastReceived(intent, getSendingUserId());
break;
@@ -396,7 +402,10 @@
packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
packageFilter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
+ packageFilter.addAction(Intent.ACTION_PACKAGE_RESTARTED);
+ packageFilter.addAction(Intent.ACTION_PACKAGE_UNSTOPPED);
packageFilter.addDataScheme("package");
+ packageFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL,
packageFilter, null, mCallbackHandler);
@@ -581,14 +590,19 @@
changed |= provider.setMaskedByQuietProfileLocked(quietProfile);
try {
boolean suspended;
+ boolean stopped;
try {
suspended = mPackageManager.isPackageSuspendedForUser(
provider.id.componentName.getPackageName(), provider.getUserId());
+ stopped = mPackageManager.isPackageStoppedForUser(
+ provider.id.componentName.getPackageName(), provider.getUserId());
} catch (IllegalArgumentException ex) {
// Package not found.
suspended = false;
+ stopped = false;
}
changed |= provider.setMaskedBySuspendedPackageLocked(suspended);
+ changed |= provider.setMaskedByStoppedPackageLocked(stopped);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to query application info", e);
}
@@ -636,6 +650,82 @@
}
/**
+ * Update the masked state for a stopped or unstopped package.
+ */
+ private void updateWidgetPackageStoppedMaskedState(@NonNull Intent intent) {
+ final int providerUid = intent.getIntExtra(Intent.EXTRA_UID, Process.INVALID_UID);
+ final Uri uri = intent.getData();
+ if (providerUid == Process.INVALID_UID || uri == null) {
+ return;
+ }
+
+ final String packageName = uri.getSchemeSpecificPart();
+ if (packageName == null) {
+ return;
+ }
+
+ boolean isStopped;
+ try {
+ isStopped = mPackageManager.isPackageStoppedForUser(packageName,
+ UserHandle.getUserId(providerUid));
+ } catch (Exception e) {
+ Slog.e(TAG, "Failed to query package stopped state", e);
+ return;
+ }
+
+ if (DEBUG) {
+ Slog.i(TAG, "Updating package stopped masked state for uid " + providerUid + " package "
+ + packageName + " isStopped " + isStopped);
+ }
+ synchronized (mLock) {
+ final int count = mProviders.size();
+ for (int i = 0; i < count; i++) {
+ Provider provider = mProviders.get(i);
+ if (providerUid != provider.id.uid
+ || !packageName.equals(provider.id.componentName.getPackageName())) {
+ continue;
+ }
+ if (provider.setMaskedByStoppedPackageLocked(isStopped)) {
+ if (provider.isMaskedLocked()) {
+ maskWidgetsViewsLocked(provider, null);
+ cancelBroadcastsLocked(provider);
+ } else {
+ unmaskWidgetsViewsLocked(provider);
+ final int widgetCount = provider.widgets.size();
+ if (widgetCount > 0) {
+ final int[] widgetIds = new int[widgetCount];
+ for (int j = 0; j < widgetCount; j++) {
+ widgetIds[j] = provider.widgets.get(j).appWidgetId;
+ }
+ registerForBroadcastsLocked(provider, widgetIds);
+ sendUpdateIntentLocked(provider, widgetIds, /* interactive= */ false);
+ }
+
+ final int pendingIdsCount = provider.pendingDeletedWidgetIds.size();
+ if (pendingIdsCount > 0) {
+ if (DEBUG) {
+ Slog.i(TAG, "Sending missed deleted broadcasts for "
+ + provider.id.componentName + " "
+ + provider.pendingDeletedWidgetIds);
+ }
+ for (int j = 0; j < pendingIdsCount; j++) {
+ sendDeletedIntentLocked(provider.id.componentName,
+ provider.id.getProfile(),
+ provider.pendingDeletedWidgetIds.get(j));
+ }
+ provider.pendingDeletedWidgetIds.clear();
+ if (widgetCount == 0) {
+ sendDisabledIntentLocked(provider);
+ }
+ saveGroupStateAsync(provider.id.getProfile().getIdentifier());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
* Mask the target widget belonging to the specified provider, or all active widgets
* of the provider if target widget == null.
*/
@@ -648,11 +738,11 @@
R.layout.work_widget_mask_view);
ApplicationInfo appInfo = provider.info.providerInfo.applicationInfo;
final int appUserId = provider.getUserId();
- boolean showBadge;
+ boolean showBadge = false;
final long identity = Binder.clearCallingIdentity();
try {
- final Intent onClickIntent;
+ Intent onClickIntent = null;
if (provider.maskedByQuietProfile) {
showBadge = true;
@@ -676,7 +766,7 @@
appInfo.packageName, suspendingPackage, dialogInfo, null, null,
appUserId);
}
- } else /* provider.maskedByLockedProfile */ {
+ } else if (provider.maskedByLockedProfile) {
showBadge = true;
onClickIntent = mKeyguardManager
.createConfirmDeviceCredentialIntent(null, null, appUserId);
@@ -684,6 +774,8 @@
onClickIntent.setFlags(
FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
}
+ } else if (provider.maskedByStoppedPackage) {
+ showBadge = mUserManager.hasBadge(appUserId);
}
Icon icon = appInfo.icon != 0
@@ -697,7 +789,14 @@
for (int j = 0; j < widgetCount; j++) {
Widget widget = provider.widgets.get(j);
if (targetWidget != null && targetWidget != widget) continue;
- if (onClickIntent != null) {
+ if (provider.maskedByStoppedPackage) {
+ Intent intent = createUpdateIntentLocked(provider,
+ new int[] { widget.appWidgetId });
+ views.setOnClickPendingIntent(android.R.id.background,
+ PendingIntent.getBroadcast(mContext, widget.appWidgetId,
+ intent, PendingIntent.FLAG_UPDATE_CURRENT
+ | PendingIntent.FLAG_IMMUTABLE));
+ } else if (onClickIntent != null) {
views.setOnClickPendingIntent(android.R.id.background,
PendingIntent.getActivity(mContext, widget.appWidgetId, onClickIntent,
PendingIntent.FLAG_UPDATE_CURRENT
@@ -1950,15 +2049,23 @@
if (provider != null) {
provider.widgets.remove(widget);
if (!provider.zombie) {
- // send the broacast saying that this appWidgetId has been deleted
- sendDeletedIntentLocked(widget);
+ // If the package is not stopped, send the broadcast saying that this appWidgetId
+ // has been deleted. Otherwise, save the ID and send the broadcast when the package
+ // is unstopped.
+ if (!provider.maskedByStoppedPackage) {
+ sendDeletedIntentLocked(widget);
+ } else {
+ provider.pendingDeletedWidgetIds.add(widget.appWidgetId);
+ }
if (provider.widgets.isEmpty()) {
// cancel the future updates
cancelBroadcastsLocked(provider);
- // send the broacast saying that the provider is not in use any more
- sendDisabledIntentLocked(provider);
+ // send the broadcast saying that the provider is not in use any more
+ if (!provider.maskedByStoppedPackage) {
+ sendDisabledIntentLocked(provider);
+ }
}
}
}
@@ -2033,8 +2140,9 @@
final HashSet<Integer> ids = mRemoteViewsServicesAppWidgets.get(key);
if (ids.remove(widget.appWidgetId)) {
// If we have removed the last app widget referencing this service, then we
- // should destroy it and remove it from this set
- if (ids.isEmpty()) {
+ // should destroy it and remove it from this set. This is skipped for widgets whose
+ // provider is in a stopped package, to avoid waking up the package.
+ if (ids.isEmpty() && !widget.provider.maskedByStoppedPackage) {
destroyRemoteViewsService(key.second.getIntent(), widget);
it.remove();
}
@@ -2544,18 +2652,29 @@
private void sendUpdateIntentLocked(Provider provider, int[] appWidgetIds,
boolean interactive) {
- Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
- intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
- intent.setComponent(provider.id.componentName);
+ Intent intent = createUpdateIntentLocked(provider, appWidgetIds);
sendBroadcastAsUser(intent, provider.id.getProfile(), interactive);
}
+ private Intent createUpdateIntentLocked(Provider provider, int[] appWidgetIds) {
+ Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
+ intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
+ intent.setComponent(provider.id.componentName);
+ return intent;
+ }
+
private void sendDeletedIntentLocked(Widget widget) {
+ sendDeletedIntentLocked(widget.provider.id.componentName, widget.provider.id.getProfile(),
+ widget.appWidgetId);
+ }
+
+ private void sendDeletedIntentLocked(ComponentName provider, UserHandle profile,
+ int appWidgetId) {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_DELETED);
- intent.setComponent(widget.provider.id.componentName);
- intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widget.appWidgetId);
+ intent.setComponent(provider);
+ intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
// Cleanup after deletion isn't an interactive UX case
- sendBroadcastAsUser(intent, widget.provider.id.getProfile(), false);
+ sendBroadcastAsUser(intent, profile, false);
}
private void sendDisabledIntentLocked(Provider provider) {
@@ -2684,6 +2803,14 @@
if (persistsProviderInfo && p.mInfoParsed) {
AppWidgetXmlUtil.writeAppWidgetProviderInfoLocked(out, p.info);
}
+ final int pendingIdsCount = p.pendingDeletedWidgetIds.size();
+ if (pendingIdsCount > 0) {
+ final List<String> idStrings = new ArrayList<>();
+ for (int i = 0; i < pendingIdsCount; i++) {
+ idStrings.add(String.valueOf(p.pendingDeletedWidgetIds.get(i)));
+ }
+ out.attribute(null, PENDING_DELETED_IDS_ATTR, String.join(",", idStrings));
+ }
out.endTag(null, "p");
}
@@ -3022,7 +3149,7 @@
continue;
}
- if (provider.widgets.size() > 0) {
+ if (provider.widgets.size() > 0 && !provider.maskedByStoppedPackage) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
"appwidget init " + provider.id.componentName.getPackageName());
provider.widgets.forEach(widget -> {
@@ -3440,6 +3567,16 @@
legacyProviderIndex);
provider.tag = providerTag;
provider.infoTag = parser.getAttributeValue(null, "info_tag");
+
+ final String pendingDeletedIds = parser.getAttributeValue(null,
+ PENDING_DELETED_IDS_ATTR);
+ if (pendingDeletedIds != null && !pendingDeletedIds.isEmpty()) {
+ final String[] idStrings = pendingDeletedIds.split(",");
+ for (int i = 0; i < idStrings.length; i++) {
+ provider.pendingDeletedWidgetIds.add(
+ Integer.parseInt(idStrings[i]));
+ }
+ }
} else if ("h".equals(tag)) {
legacyHostIndex++;
Host host = new Host();
@@ -4443,6 +4580,11 @@
boolean maskedByLockedProfile;
boolean maskedByQuietProfile;
boolean maskedBySuspendedPackage;
+ // This provider's package has been stopped
+ boolean maskedByStoppedPackage;
+ // Widget IDs for which we haven't yet sent DELETED broadcasts because the package was
+ // stopped.
+ IntArray pendingDeletedWidgetIds = new IntArray();
boolean mInfoParsed = false;
@@ -4598,8 +4740,15 @@
return masked != oldState;
}
+ public boolean setMaskedByStoppedPackageLocked(boolean masked) {
+ boolean oldState = maskedByStoppedPackage;
+ maskedByStoppedPackage = masked;
+ return masked != oldState;
+ }
+
public boolean isMaskedLocked() {
- return maskedByQuietProfile || maskedByLockedProfile || maskedBySuspendedPackage;
+ return maskedByQuietProfile || maskedByLockedProfile || maskedBySuspendedPackage
+ || maskedByStoppedPackage;
}
public boolean shouldBePersisted() {
diff --git a/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
index 7f64786..9a73a2d 100644
--- a/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
+++ b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
@@ -30,7 +30,6 @@
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static com.android.server.contextualsearch.flags.Flags.enableExcludePersistentUi;
-
import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT;
import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE;
@@ -65,6 +64,7 @@
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.ShellCallback;
+import android.os.SystemClock;
import android.util.Log;
import android.util.Slog;
import android.view.IWindowManager;
@@ -246,6 +246,9 @@
if (DEBUG_USER) Log.d(TAG, "Launch component: " + launchIntent.getComponent());
launchIntent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION
| FLAG_ACTIVITY_NO_USER_ACTION);
+ launchIntent.putExtra(
+ ContextualSearchManager.EXTRA_INVOCATION_TIME_MS,
+ SystemClock.uptimeMillis());
launchIntent.putExtra(ContextualSearchManager.EXTRA_ENTRYPOINT, entrypoint);
launchIntent.putExtra(ContextualSearchManager.EXTRA_TOKEN, mToken);
boolean isAssistDataAllowed = mAtmInternal.isAssistDataAllowed();
diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java
index 271d552..37c2d26 100644
--- a/services/core/java/com/android/server/RescueParty.java
+++ b/services/core/java/com/android/server/RescueParty.java
@@ -494,10 +494,10 @@
private static void executeRescueLevelInternalOld(Context context, int level, @Nullable
String failedPackage) throws Exception {
- if (level <= LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS) {
- // Disabling flag resets on master branch for trunk stable launch.
- // TODO(b/287618292): Re-enable them after the trunk stable is launched and we
- // figured out a way to reset flags without interfering with trunk development.
+ // Note: DeviceConfig reset is disabled currently and would be enabled using the flag,
+ // after we have figured out a way to reset flags without interfering with trunk
+ // development. TODO: b/287618292 For enabling flag resets.
+ if (!Flags.allowRescuePartyFlagResets() && level <= LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS) {
return;
}
@@ -572,12 +572,16 @@
level, levelToString(level));
switch (level) {
case RESCUE_LEVEL_SCOPED_DEVICE_CONFIG_RESET:
- // Temporary disable deviceConfig reset
- // resetDeviceConfig(context, /*isScoped=*/true, failedPackage);
+ // Enable deviceConfig reset behind flag
+ if (Flags.allowRescuePartyFlagResets()) {
+ resetDeviceConfig(context, /*isScoped=*/true, failedPackage);
+ }
break;
case RESCUE_LEVEL_ALL_DEVICE_CONFIG_RESET:
- // Temporary disable deviceConfig reset
- // resetDeviceConfig(context, /*isScoped=*/false, failedPackage);
+ // Enable deviceConfig reset behind flag
+ if (Flags.allowRescuePartyFlagResets()) {
+ resetDeviceConfig(context, /*isScoped=*/false, failedPackage);
+ }
break;
case RESCUE_LEVEL_WARM_REBOOT:
executeWarmReboot(context, level, failedPackage);
diff --git a/services/core/java/com/android/server/SensitiveContentProtectionManagerService.java b/services/core/java/com/android/server/SensitiveContentProtectionManagerService.java
index 6c7546e..64bca33 100644
--- a/services/core/java/com/android/server/SensitiveContentProtectionManagerService.java
+++ b/services/core/java/com/android/server/SensitiveContentProtectionManagerService.java
@@ -17,6 +17,7 @@
package com.android.server;
import static android.permission.flags.Flags.sensitiveContentImprovements;
+import static android.permission.flags.Flags.sensitiveContentMetricsBugfix;
import static android.permission.flags.Flags.sensitiveNotificationAppProtection;
import static android.provider.Settings.Global.DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS;
import static android.view.flags.Flags.sensitiveContentAppProtection;
@@ -93,7 +94,7 @@
private boolean mProjectionActive = false;
private static class MediaProjectionSession {
- private final int mUid;
+ private final int mUid; // UID of app that started projection session
private final long mSessionId;
private final boolean mIsExempted;
private final ArraySet<String> mAllSeenNotificationKeys = new ArraySet<>();
@@ -320,6 +321,12 @@
}
mProjectionActive = true;
+
+ if (sensitiveContentMetricsBugfix()) {
+ mWindowManager.setBlockScreenCaptureForAppsSessionId(
+ mMediaProjectionSession.mSessionId);
+ }
+
if (sensitiveNotificationAppProtection()) {
updateAppsThatShouldBlockScreenCapture();
}
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index bd67cf420..2d1aba4 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -425,6 +425,8 @@
private int[] mSCBMReason;
private boolean[] mSCBMStarted;
+ private boolean[] mCarrierRoamingNtnMode = null;
+
/**
* Per-phone map of precise data connection state. The key of the map is the pair of transport
* type and APN setting. This is the cache to prevent redundant callbacks to the listeners.
@@ -723,6 +725,7 @@
mECBMStarted = copyOf(mECBMStarted, mNumPhones);
mSCBMReason = copyOf(mSCBMReason, mNumPhones);
mSCBMStarted = copyOf(mSCBMStarted, mNumPhones);
+ mCarrierRoamingNtnMode = copyOf(mCarrierRoamingNtnMode, mNumPhones);
// ds -> ss switch.
if (mNumPhones < oldNumPhones) {
cutListToSize(mCellInfo, mNumPhones);
@@ -781,6 +784,7 @@
mECBMStarted[i] = false;
mSCBMReason[i] = TelephonyManager.STOP_REASON_UNKNOWN;
mSCBMStarted[i] = false;
+ mCarrierRoamingNtnMode[i] = false;
}
}
}
@@ -854,6 +858,7 @@
mECBMStarted = new boolean[numPhones];
mSCBMReason = new int[numPhones];
mSCBMStarted = new boolean[numPhones];
+ mCarrierRoamingNtnMode = new boolean[numPhones];
for (int i = 0; i < numPhones; i++) {
mCallState[i] = TelephonyManager.CALL_STATE_IDLE;
@@ -897,6 +902,7 @@
mECBMStarted[i] = false;
mSCBMReason[i] = TelephonyManager.STOP_REASON_UNKNOWN;
mSCBMStarted[i] = false;
+ mCarrierRoamingNtnMode[i] = false;
}
mAppOps = mContext.getSystemService(AppOpsManager.class);
@@ -1126,20 +1132,17 @@
return;
}
- int phoneId = -1;
int subscriptionId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
- if(Flags.preventSystemServerAndPhoneDeadlock()) {
- // Legacy applications pass SubscriptionManager.DEFAULT_SUB_ID,
- // force all illegal subId to SubscriptionManager.DEFAULT_SUB_ID
- if (!SubscriptionManager.isValidSubscriptionId(subId)) {
- if (DBG) {
- log("invalid subscription id, use default id");
- }
- } else { //APP specify subID
- subscriptionId = subId;
+ // Legacy applications pass SubscriptionManager.DEFAULT_SUB_ID,
+ // force all illegal subId to SubscriptionManager.DEFAULT_SUB_ID
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ if (DBG) {
+ log("invalid subscription id, use default id");
}
- phoneId = getPhoneIdFromSubId(subscriptionId);
+ } else { //APP specify subID
+ subscriptionId = subId;
}
+ int phoneId = getPhoneIdFromSubId(subscriptionId);
synchronized (mRecords) {
// register
@@ -1160,23 +1163,8 @@
r.renounceFineLocationAccess = renounceFineLocationAccess;
r.callerUid = Binder.getCallingUid();
r.callerPid = Binder.getCallingPid();
-
- if(!Flags.preventSystemServerAndPhoneDeadlock()) {
- // Legacy applications pass SubscriptionManager.DEFAULT_SUB_ID,
- // force all illegal subId to SubscriptionManager.DEFAULT_SUB_ID
- if (!SubscriptionManager.isValidSubscriptionId(subId)) {
- if (DBG) {
- log("invalid subscription id, use default id");
- }
- r.subId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
- } else {//APP specify subID
- r.subId = subId;
- }
- r.phoneId = getPhoneIdFromSubId(r.subId);
- } else {
- r.subId = subscriptionId;
- r.phoneId = phoneId;
- }
+ r.subId = subscriptionId;
+ r.phoneId = phoneId;
r.eventList = events;
if (DBG) {
@@ -1523,6 +1511,14 @@
remove(r.binder);
}
}
+ if (events.contains(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED)) {
+ try {
+ r.callback.onCarrierRoamingNtnModeChanged(
+ mCarrierRoamingNtnMode[r.phoneId]);
+ } catch (RemoteException ex) {
+ remove(r.binder);
+ }
+ }
}
}
}
@@ -1914,14 +1910,8 @@
}
private void notifyCarrierNetworkChangeWithPermission(int subId, boolean active) {
- int phoneId = -1;
- if(Flags.preventSystemServerAndPhoneDeadlock()) {
- phoneId = getPhoneIdFromSubId(subId);
- }
+ int phoneId = getPhoneIdFromSubId(subId);
synchronized (mRecords) {
- if(!Flags.preventSystemServerAndPhoneDeadlock()) {
- phoneId = getPhoneIdFromSubId(subId);
- }
mCarrierNetworkChangeState[phoneId] = active;
if (VDBG) {
@@ -3512,6 +3502,41 @@
handleRemoveListLocked();
}
+ /**
+ * Notify external listeners that carrier roaming non-terrestrial network mode changed.
+ * @param subId subscription ID.
+ * @param active {@code true} If the device is connected to carrier roaming
+ * non-terrestrial network or was connected within the
+ * {CarrierConfigManager#KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT}
+ * duration, {code false} otherwise.
+ */
+ public void notifyCarrierRoamingNtnModeChanged(int subId, boolean active) {
+ if (!checkNotifyPermission("notifyCarrierRoamingNtnModeChanged")) {
+ return;
+ }
+
+ if (VDBG) {
+ log("notifyCarrierRoamingNtnModeChanged: subId=" + subId + " active=" + active);
+ }
+
+ synchronized (mRecords) {
+ int phoneId = getPhoneIdFromSubId(subId);
+ mCarrierRoamingNtnMode[phoneId] = active;
+ for (Record r : mRecords) {
+ if (r.matchTelephonyCallbackEvent(
+ TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED)
+ && idMatch(r, subId, phoneId)) {
+ try {
+ r.callback.onCarrierRoamingNtnModeChanged(active);
+ } catch (RemoteException ex) {
+ mRemoveList.add(r.binder);
+ }
+ }
+ }
+ handleRemoveListLocked();
+ }
+ }
+
@NeverCompile // Avoid size overhead of debugging code.
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index c3a3bf7..eec22c9 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -2422,8 +2422,6 @@
getTimeLimitedFgsType(foregroundServiceType);
final TimeLimitedFgsInfo fgsTypeInfo = fgsInfo.get(timeLimitedFgsType);
if (fgsTypeInfo != null) {
- // TODO(b/330399444): check to see if all time book-keeping for
- // time limited types should use elapsedRealtime instead of uptime
final long before24Hr = Math.max(0,
SystemClock.elapsedRealtime() - (24 * 60 * 60 * 1000));
final long lastTimeOutAt = fgsTypeInfo.getTimeLimitExceededAt();
@@ -3757,7 +3755,7 @@
}
traceInstant("FGS start: ", sr);
- final long nowUptime = SystemClock.uptimeMillis();
+ final long nowRealtime = SystemClock.elapsedRealtime();
// Fetch/create/update the fgs info for the time-limited type.
SparseArray<TimeLimitedFgsInfo> fgsInfo = mTimeLimitedFgsInfo.get(sr.appInfo.uid);
@@ -3768,10 +3766,10 @@
final int timeLimitedFgsType = getTimeLimitedFgsType(sr.foregroundServiceType);
TimeLimitedFgsInfo fgsTypeInfo = fgsInfo.get(timeLimitedFgsType);
if (fgsTypeInfo == null) {
- fgsTypeInfo = sr.createTimeLimitedFgsInfo(nowUptime);
+ fgsTypeInfo = sr.createTimeLimitedFgsInfo(nowRealtime);
fgsInfo.put(timeLimitedFgsType, fgsTypeInfo);
}
- fgsTypeInfo.setLastFgsStartTime(nowUptime);
+ fgsTypeInfo.setLastFgsStartTime(nowRealtime);
// We'll cancel the previous ANR timer and start a fresh one below.
mFGSAnrTimer.cancel(sr);
@@ -3845,14 +3843,14 @@
final TimeLimitedFgsInfo fgsTypeInfo = fgsInfo.get(fgsType);
if (fgsTypeInfo != null) {
// Update total runtime for the time-limited fgs type and mark it as timed out.
- final long nowUptime = SystemClock.uptimeMillis();
+ final long nowRealtime = SystemClock.elapsedRealtime();
fgsTypeInfo.updateTotalRuntime();
- fgsTypeInfo.setTimeLimitExceededAt(nowUptime);
+ fgsTypeInfo.setTimeLimitExceededAt(nowRealtime);
logFGSStateChangeLocked(sr,
FOREGROUND_SERVICE_STATE_CHANGED__STATE__TIMED_OUT,
- nowUptime > fgsTypeInfo.getLastFgsStartTime()
- ? (int) (nowUptime - fgsTypeInfo.getLastFgsStartTime()) : 0,
+ nowRealtime > fgsTypeInfo.getLastFgsStartTime()
+ ? (int) (nowRealtime - fgsTypeInfo.getLastFgsStartTime()) : 0,
FGS_STOP_REASON_UNKNOWN,
FGS_TYPE_POLICY_CHECK_UNKNOWN,
FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA,
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 6286263..cf09cfb 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -14606,6 +14606,53 @@
public Intent registerReceiverWithFeature(IApplicationThread caller, String callerPackage,
String callerFeatureId, String receiverId, IIntentReceiver receiver,
IntentFilter filter, String permission, int userId, int flags) {
+ traceRegistrationBegin(receiverId, receiver, filter, userId);
+ try {
+ return registerReceiverWithFeatureTraced(caller, callerPackage, callerFeatureId,
+ receiverId, receiver, filter, permission, userId, flags);
+ } finally {
+ traceRegistrationEnd();
+ }
+ }
+
+ private static void traceRegistrationBegin(String receiverId, IIntentReceiver receiver,
+ IntentFilter filter, int userId) {
+ if (!Flags.traceReceiverRegistration()) {
+ return;
+ }
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ final StringBuilder sb = new StringBuilder("registerReceiver: ");
+ sb.append(Binder.getCallingUid()); sb.append('/');
+ sb.append(receiverId == null ? "null" : receiverId); sb.append('/');
+ final int actionsCount = filter.countActions();
+ if (actionsCount > 0) {
+ for (int i = 0; i < actionsCount; ++i) {
+ sb.append(filter.getAction(i));
+ if (i != actionsCount - 1) sb.append(',');
+ }
+ } else {
+ sb.append("null");
+ }
+ sb.append('/');
+ sb.append('u'); sb.append(userId); sb.append('/');
+ sb.append(receiver == null ? "null" : receiver.asBinder());
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, sb.toString());
+ }
+ }
+
+ private static void traceRegistrationEnd() {
+ if (!Flags.traceReceiverRegistration()) {
+ return;
+ }
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ }
+ }
+
+ private Intent registerReceiverWithFeatureTraced(IApplicationThread caller,
+ String callerPackage, String callerFeatureId, String receiverId,
+ IIntentReceiver receiver, IntentFilter filter, String permission,
+ int userId, int flags) {
enforceNotIsolatedCaller("registerReceiver");
ArrayList<StickyBroadcast> stickyBroadcasts = null;
ProcessRecord callerApp = null;
@@ -14921,6 +14968,35 @@
}
public void unregisterReceiver(IIntentReceiver receiver) {
+ traceUnregistrationBegin(receiver);
+ try {
+ unregisterReceiverTraced(receiver);
+ } finally {
+ traceUnregistrationEnd();
+ }
+ }
+
+ private static void traceUnregistrationBegin(IIntentReceiver receiver) {
+ if (!Flags.traceReceiverRegistration()) {
+ return;
+ }
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ TextUtils.formatSimple("unregisterReceiver: %d/%s", Binder.getCallingUid(),
+ receiver == null ? "null" : receiver.asBinder()));
+ }
+ }
+
+ private static void traceUnregistrationEnd() {
+ if (!Flags.traceReceiverRegistration()) {
+ return;
+ }
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ }
+ }
+
+ private void unregisterReceiverTraced(IIntentReceiver receiver) {
if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Unregister receiver: " + receiver);
final long origId = Binder.clearCallingIdentity();
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index f98799d..4f84149 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -133,6 +133,7 @@
import com.android.server.power.stats.PowerStatsStore;
import com.android.server.power.stats.PowerStatsUidResolver;
import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes;
+import com.android.server.power.stats.WifiPowerStatsProcessor;
import com.android.server.power.stats.wakeups.CpuWakeupStats;
import java.io.File;
@@ -412,6 +413,8 @@
com.android.internal.R.integer.config_defaultPowerStatsThrottlePeriodCpu);
final long powerStatsThrottlePeriodMobileRadio = context.getResources().getInteger(
com.android.internal.R.integer.config_defaultPowerStatsThrottlePeriodMobileRadio);
+ final long powerStatsThrottlePeriodWifi = context.getResources().getInteger(
+ com.android.internal.R.integer.config_defaultPowerStatsThrottlePeriodWifi);
mBatteryStatsConfig =
new BatteryStatsImpl.BatteryStatsConfig.Builder()
.setResetOnUnplugHighBatteryLevel(resetOnUnplugHighBatteryLevel)
@@ -422,6 +425,9 @@
.setPowerStatsThrottlePeriodMillis(
BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
powerStatsThrottlePeriodMobileRadio)
+ .setPowerStatsThrottlePeriodMillis(
+ BatteryConsumer.POWER_COMPONENT_WIFI,
+ powerStatsThrottlePeriodWifi)
.build();
mPowerStatsUidResolver = new PowerStatsUidResolver();
mStats = new BatteryStatsImpl(mBatteryStatsConfig, Clock.SYSTEM_CLOCK, mMonotonicClock,
@@ -480,6 +486,7 @@
AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
.setProcessor(
new CpuPowerStatsProcessor(mPowerProfile, mCpuScalingPolicies));
+
config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)
.trackDeviceStates(
AggregatedPowerStatsConfig.STATE_POWER,
@@ -490,9 +497,21 @@
AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
.setProcessor(
new MobileRadioPowerStatsProcessor(mPowerProfile));
+
config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_PHONE,
BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)
.setProcessor(new PhoneCallPowerStatsProcessor());
+
+ config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_WIFI)
+ .trackDeviceStates(
+ AggregatedPowerStatsConfig.STATE_POWER,
+ AggregatedPowerStatsConfig.STATE_SCREEN)
+ .trackUidStates(
+ AggregatedPowerStatsConfig.STATE_POWER,
+ AggregatedPowerStatsConfig.STATE_SCREEN,
+ AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
+ .setProcessor(
+ new WifiPowerStatsProcessor(mPowerProfile));
return config;
}
@@ -518,14 +537,22 @@
public void systemServicesReady() {
mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_CPU,
Flags.streamlinedBatteryStats());
- mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
- Flags.streamlinedConnectivityBatteryStats());
mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(
BatteryConsumer.POWER_COMPONENT_CPU,
Flags.streamlinedBatteryStats());
+
+ mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
+ Flags.streamlinedConnectivityBatteryStats());
mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(
BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
Flags.streamlinedConnectivityBatteryStats());
+
+ mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_WIFI,
+ Flags.streamlinedConnectivityBatteryStats());
+ mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(
+ BatteryConsumer.POWER_COMPONENT_WIFI,
+ Flags.streamlinedConnectivityBatteryStats());
+
mWorker.systemServicesReady();
mStats.systemServicesReady(mContext);
mCpuWakeupStats.systemServicesReady();
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index fa6b54b..211f952 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -2371,6 +2371,14 @@
return;
}
+ if (opt.shouldNotFreeze()) {
+ if (DEBUG_FREEZER) {
+ Slog.d(TAG_AM, "Skipping freeze because process is marked "
+ + "should not be frozen");
+ }
+ return;
+ }
+
if (pid == 0 || opt.isFrozen()) {
// Already frozen or not a real process, either one being
// launched or one being killed
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 045d137..065f3bd 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -30,9 +30,9 @@
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import android.annotation.ElapsedRealtimeLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.UptimeMillisLong;
import android.app.BackgroundStartPrivileges;
import android.app.IApplicationThread;
import android.app.Notification;
@@ -677,46 +677,46 @@
* Data container class to help track certain fgs info for time-restricted types.
*/
static class TimeLimitedFgsInfo {
- @UptimeMillisLong
+ @ElapsedRealtimeLong
private long mFirstFgsStartTime;
- @UptimeMillisLong
+ @ElapsedRealtimeLong
private long mLastFgsStartTime;
- @UptimeMillisLong
+ @ElapsedRealtimeLong
private long mTimeLimitExceededAt = Long.MIN_VALUE;
private long mTotalRuntime = 0;
- TimeLimitedFgsInfo(@UptimeMillisLong long startTime) {
+ TimeLimitedFgsInfo(@ElapsedRealtimeLong long startTime) {
mFirstFgsStartTime = startTime;
mLastFgsStartTime = startTime;
}
- @UptimeMillisLong
+ @ElapsedRealtimeLong
public long getFirstFgsStartTime() {
return mFirstFgsStartTime;
}
- public void setLastFgsStartTime(@UptimeMillisLong long startTime) {
+ public void setLastFgsStartTime(@ElapsedRealtimeLong long startTime) {
mLastFgsStartTime = startTime;
}
- @UptimeMillisLong
+ @ElapsedRealtimeLong
public long getLastFgsStartTime() {
return mLastFgsStartTime;
}
public void updateTotalRuntime() {
- mTotalRuntime += SystemClock.uptimeMillis() - mLastFgsStartTime;
+ mTotalRuntime += SystemClock.elapsedRealtime() - mLastFgsStartTime;
}
public long getTotalRuntime() {
return mTotalRuntime;
}
- public void setTimeLimitExceededAt(@UptimeMillisLong long timeLimitExceededAt) {
+ public void setTimeLimitExceededAt(@ElapsedRealtimeLong long timeLimitExceededAt) {
mTimeLimitExceededAt = timeLimitExceededAt;
}
- @UptimeMillisLong
+ @ElapsedRealtimeLong
public long getTimeLimitExceededAt() {
return mTimeLimitExceededAt;
}
@@ -1858,8 +1858,8 @@
/**
* Called when a time-limited FGS starts.
*/
- public TimeLimitedFgsInfo createTimeLimitedFgsInfo(long nowUptime) {
- return new TimeLimitedFgsInfo(nowUptime);
+ public TimeLimitedFgsInfo createTimeLimitedFgsInfo(@ElapsedRealtimeLong long nowRealtime) {
+ return new TimeLimitedFgsInfo(nowRealtime);
}
/**
diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig
index e1ccf4d..19be5f9 100644
--- a/services/core/java/com/android/server/am/flags.aconfig
+++ b/services/core/java/com/android/server/am/flags.aconfig
@@ -95,3 +95,14 @@
bug: "315468967"
is_fixed_read_only: true
}
+
+flag {
+ namespace: "backstage_power"
+ name: "trace_receiver_registration"
+ description: "Add tracing for broadcast receiver registration and un-registration"
+ bug: "336385821"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index b8bfeda..e59de6a 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -2773,15 +2773,15 @@
}
code = AppOpsManager.opToSwitch(code);
UidState uidState = getUidStateLocked(uid, false);
- if (uidState != null
- && mAppOpsCheckingService.getUidMode(
- uidState.uid, getPersistentId(virtualDeviceId), code)
- != AppOpsManager.opToDefaultMode(code)) {
- final int rawMode =
- mAppOpsCheckingService.getUidMode(
- uidState.uid, getPersistentId(virtualDeviceId), code);
- return raw ? rawMode : uidState.evalMode(code, rawMode);
+ if (uidState != null) {
+ int rawUidMode = mAppOpsCheckingService.getUidMode(
+ uidState.uid, getPersistentId(virtualDeviceId), code);
+
+ if (rawUidMode != AppOpsManager.opToDefaultMode(code)) {
+ return raw ? rawUidMode : uidState.evalMode(code, rawUidMode);
+ }
}
+
Op op = getOpLocked(code, uid, packageName, null, false, pvr.bypass, /* edit */ false);
if (op == null) {
return AppOpsManager.opToDefaultMode(code);
@@ -3682,26 +3682,24 @@
isRestricted = isOpRestrictedLocked(uid, code, packageName, attributionTag,
virtualDeviceId, pvr.bypass, false);
final int switchCode = AppOpsManager.opToSwitch(code);
+
+ int rawUidMode;
if (isOpAllowedForUid(uid)) {
// Op is always allowed for the UID, do nothing.
// If there is a non-default per UID policy (we set UID op mode only if
// non-default) it takes over, otherwise use the per package policy.
- } else if (mAppOpsCheckingService.getUidMode(
- uidState.uid, getPersistentId(virtualDeviceId), switchCode)
+ } else if ((rawUidMode =
+ mAppOpsCheckingService.getUidMode(
+ uidState.uid, getPersistentId(virtualDeviceId), switchCode))
!= AppOpsManager.opToDefaultMode(switchCode)) {
- final int uidMode =
- uidState.evalMode(
- code,
- mAppOpsCheckingService.getUidMode(
- uidState.uid,
- getPersistentId(virtualDeviceId),
- switchCode));
+ final int uidMode = uidState.evalMode(code, rawUidMode);
if (!shouldStartForMode(uidMode, startIfModeDefault)) {
if (DEBUG) {
Slog.d(TAG, "startOperation: uid reject #" + uidMode + " for code "
+ switchCode + " (" + code + ") uid " + uid + " package "
- + packageName + " flags: " + AppOpsManager.flagsToString(flags));
+ + packageName + " flags: "
+ + AppOpsManager.flagsToString(flags));
}
attributedOp.rejected(uidState.getState(), flags);
scheduleOpStartedIfNeededLocked(code, uid, packageName, attributionTag,
@@ -3710,8 +3708,8 @@
return new SyncNotedAppOp(uidMode, code, attributionTag, packageName);
}
} else {
- final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, uid, true)
- : op;
+ final Op switchOp =
+ switchCode != code ? getOpLocked(ops, switchCode, uid, true) : op;
final int mode =
switchOp.uidState.evalMode(
switchOp.op,
@@ -3721,9 +3719,12 @@
UserHandle.getUserId(switchOp.uid)));
if (mode != AppOpsManager.MODE_ALLOWED
&& (!startIfModeDefault || mode != MODE_DEFAULT)) {
- if (DEBUG) Slog.d(TAG, "startOperation: reject #" + mode + " for code "
- + switchCode + " (" + code + ") uid " + uid + " package "
- + packageName + " flags: " + AppOpsManager.flagsToString(flags));
+ if (DEBUG) {
+ Slog.d(TAG, "startOperation: reject #" + mode + " for code "
+ + switchCode + " (" + code + ") uid " + uid + " package "
+ + packageName + " flags: "
+ + AppOpsManager.flagsToString(flags));
+ }
attributedOp.rejected(uidState.getState(), flags);
scheduleOpStartedIfNeededLocked(code, uid, packageName, attributionTag,
virtualDeviceId, flags, mode, startType, attributionFlags,
@@ -3731,6 +3732,7 @@
return new SyncNotedAppOp(mode, code, attributionTag, packageName);
}
}
+
if (DEBUG) Slog.d(TAG, "startOperation: allowing code " + code + " uid " + uid
+ " package " + packageName + " restricted: " + isRestricted
+ " flags: " + AppOpsManager.flagsToString(flags));
diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java
index 38fa79f..e2c4b46 100644
--- a/services/core/java/com/android/server/audio/SpatializerHelper.java
+++ b/services/core/java/com/android/server/audio/SpatializerHelper.java
@@ -88,6 +88,10 @@
/*package*/ static final SparseIntArray SPAT_MODE_FOR_DEVICE_TYPE = new SparseIntArray(14) {
{
append(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, Spatialization.Mode.TRANSAURAL);
+ // Speaker safe is considered compatible with spatial audio because routing media usage
+ // to speaker safe only happens in transient situations and should not affect app
+ // decisions to play spatial audio content.
+ append(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER_SAFE, Spatialization.Mode.TRANSAURAL);
append(AudioDeviceInfo.TYPE_WIRED_HEADSET, Spatialization.Mode.BINAURAL);
append(AudioDeviceInfo.TYPE_WIRED_HEADPHONES, Spatialization.Mode.BINAURAL);
// assumption for A2DP: mostly headsets
@@ -805,7 +809,7 @@
private boolean isDeviceCompatibleWithSpatializationModes(@NonNull AudioDeviceAttributes ada) {
// modeForDevice will be neither transaural or binaural for devices that do not support
- // spatial audio. For instance mono devices like earpiece, speaker safe or sco must
+ // spatial audio. For instance mono devices like earpiece or sco must
// not be included.
final byte modeForDevice = (byte) SPAT_MODE_FOR_DEVICE_TYPE.get(ada.getType(),
/*default when type not found*/ -1);
diff --git a/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java b/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java
index 3d20efc..f5a2f34 100644
--- a/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java
+++ b/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java
@@ -16,12 +16,10 @@
package com.android.server.biometrics.sensors;
-import static com.android.systemui.shared.Flags.sidefpsControllerRefactor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.biometrics.BiometricRequestConstants;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.hardware.fingerprint.IUdfpsOverlayControllerCallback;
import android.os.RemoteException;
@@ -45,22 +43,6 @@
@NonNull private final Optional<IUdfpsOverlayController> mUdfpsOverlayController;
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @NonNull private final Optional<ISidefpsController> mSidefpsController;
-
- /**
- * Create an overlay controller for each modality.
- *
- * @param udfpsOverlayController under display fps or null if not present on device
- * @param sidefpsController side fps or null if not present on device
- */
- public SensorOverlays(
- @Nullable IUdfpsOverlayController udfpsOverlayController,
- @Nullable ISidefpsController sidefpsController) {
- mUdfpsOverlayController = Optional.ofNullable(udfpsOverlayController);
- mSidefpsController = Optional.ofNullable(sidefpsController);
- }
-
/**
* Create an overlay controller for each modality.
*
@@ -68,8 +50,6 @@
*/
public SensorOverlays(@Nullable IUdfpsOverlayController udfpsOverlayController) {
mUdfpsOverlayController = Optional.ofNullable(udfpsOverlayController);
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- mSidefpsController = Optional.empty();
}
/**
@@ -81,16 +61,6 @@
*/
public void show(int sensorId, @BiometricRequestConstants.RequestReason int reason,
@NonNull AcquisitionClient<?> client) {
- if (!sidefpsControllerRefactor()) {
- if (mSidefpsController.isPresent()) {
- try {
- mSidefpsController.get().show(sensorId, reason);
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception when showing the side-fps overlay", e);
- }
- }
- }
-
if (mUdfpsOverlayController.isPresent()) {
final IUdfpsOverlayControllerCallback callback =
new IUdfpsOverlayControllerCallback.Stub() {
@@ -115,16 +85,6 @@
* @param sensorId sensor id
*/
public void hide(int sensorId) {
- if (!sidefpsControllerRefactor()) {
- if (mSidefpsController.isPresent()) {
- try {
- mSidefpsController.get().hide(sensorId);
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception when hiding the side-fps overlay", e);
- }
- }
- }
-
if (mUdfpsOverlayController.isPresent()) {
try {
mUdfpsOverlayController.get().hideUdfpsOverlay(sensorId);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index deda93c7..4c86f57 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -57,7 +57,6 @@
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Binder;
import android.os.Build;
@@ -974,17 +973,6 @@
}
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL)
- @Override
- public void setSidefpsController(@NonNull ISidefpsController controller) {
- super.setSidefpsController_enforcePermission();
-
- for (ServiceProvider provider : mRegistry.getProviders()) {
- provider.setSidefpsController(controller);
- }
- }
-
@android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL)
@Override
public void onPowerPressed() {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
index c2d1169..a6cf2f4 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
@@ -28,7 +28,6 @@
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
@@ -137,13 +136,6 @@
void onPowerPressed();
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- /**
- * Sets side-fps controller
- * @param controller side-fps controller
- */
- void setSidefpsController(@NonNull ISidefpsController controller);
-
@NonNull
ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
@NonNull String opPackageName);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
index acc086b..f9f56ee 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
@@ -22,8 +22,6 @@
import static android.hardware.fingerprint.FingerprintManager.getAcquiredString;
import static android.hardware.fingerprint.FingerprintManager.getErrorString;
-import static com.android.systemui.shared.Flags.sidefpsControllerRefactor;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.TaskStackListener;
@@ -35,6 +33,7 @@
import android.hardware.biometrics.BiometricManager.Authenticators;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.biometrics.common.ICancellationSignal;
+import android.hardware.biometrics.common.OperationState;
import android.hardware.biometrics.events.AuthenticationAcquiredInfo;
import android.hardware.biometrics.events.AuthenticationErrorInfo;
import android.hardware.biometrics.events.AuthenticationFailedInfo;
@@ -46,7 +45,6 @@
import android.hardware.fingerprint.FingerprintAuthenticateOptions;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.os.RemoteException;
@@ -111,8 +109,6 @@
boolean isStrongBiometric,
@Nullable TaskStackListener taskStackListener,
@Nullable IUdfpsOverlayController udfpsOverlayController,
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Nullable ISidefpsController sidefpsController,
@NonNull AuthenticationStateListeners authenticationStateListeners,
boolean allowBackgroundAuthentication,
@NonNull FingerprintSensorPropertiesInternal sensorProps,
@@ -137,11 +133,7 @@
false /* shouldVibrate */,
biometricStrength);
setRequestId(requestId);
- if (sidefpsControllerRefactor()) {
- mSensorOverlays = new SensorOverlays(udfpsOverlayController);
- } else {
- mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController);
- }
+ mSensorOverlays = new SensorOverlays(udfpsOverlayController);
mAuthenticationStateListeners = authenticationStateListeners;
mIsStrongBiometric = isStrongBiometric;
mSensorProps = sensorProps;
@@ -198,11 +190,9 @@
getRequestReason(), mIsStrongBiometric, getTargetUserId()).build()
);
}
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
- .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
+ .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
+ );
} else {
mState = STATE_STARTED_PAUSED_ATTEMPTED;
if (reportBiometricAuthAttempts()) {
@@ -287,23 +277,18 @@
resetIgnoreDisplayTouches();
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
- .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
+ .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
+ );
}
@Override
protected void startHalOperation() {
resetIgnoreDisplayTouches();
mSensorOverlays.show(getSensorId(), getRequestReason(), this);
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStarted(new AuthenticationStartedInfo
- .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
- );
- }
-
+ mAuthenticationStateListeners.onAuthenticationStarted(new AuthenticationStartedInfo
+ .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
+ );
try {
doAuthenticate();
} catch (RemoteException e) {
@@ -344,6 +329,12 @@
if (session.hasContextMethods()) {
try {
session.getSession().onContextChanged(ctx);
+ // TODO(b/317414324): Deprecate setIgnoreDisplayTouches
+ if (ctx.operationState != null && ctx.operationState.getTag()
+ == OperationState.fingerprintOperationState) {
+ session.getSession().setIgnoreDisplayTouches(ctx.operationState
+ .getFingerprintOperationState().isHardwareIgnoringTouches);
+ }
} catch (RemoteException e) {
Slog.e(TAG, "Unable to notify context changed", e);
}
@@ -362,11 +353,9 @@
protected void stopHalOperation() {
resetIgnoreDisplayTouches();
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
- .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
+ .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
+ );
unsubscribeBiometricContext();
if (mCancellationSignal != null) {
@@ -468,11 +457,9 @@
resetIgnoreDisplayTouches();
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
- .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
+ .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
+ );
mCallback.onClientFinished(this, false /* success */);
}
@@ -505,11 +492,9 @@
resetIgnoreDisplayTouches();
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
- .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
+ .Builder(BiometricSourceType.FINGERPRINT, getRequestReason()).build()
+ );
mCallback.onClientFinished(this, false /* success */);
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
index b6c33ba..36af5db 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
@@ -16,8 +16,6 @@
package com.android.server.biometrics.sensors.fingerprint.aidl;
-import static com.android.systemui.shared.Flags.sidefpsControllerRefactor;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -77,12 +75,7 @@
setRequestId(requestId);
mAuthenticationStateListeners = authenticationStateListeners;
mIsStrongBiometric = isStrongBiometric;
- if (sidefpsControllerRefactor()) {
- mSensorOverlays = new SensorOverlays(udfpsOverlayController);
- } else {
- mSensorOverlays = new SensorOverlays(
- udfpsOverlayController, null /* sideFpsController */);
- }
+ mSensorOverlays = new SensorOverlays(udfpsOverlayController);
mOptions = options;
}
@@ -96,12 +89,10 @@
protected void stopHalOperation() {
resetIgnoreDisplayTouches();
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(
- new AuthenticationStoppedInfo.Builder(BiometricSourceType.FINGERPRINT,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(
+ new AuthenticationStoppedInfo.Builder(BiometricSourceType.FINGERPRINT,
+ BiometricRequestConstants.REASON_AUTH_KEYGUARD).build()
+ );
unsubscribeBiometricContext();
if (mCancellationSignal != null) {
@@ -119,25 +110,19 @@
resetIgnoreDisplayTouches();
mSensorOverlays.show(getSensorId(), BiometricRequestConstants.REASON_AUTH_KEYGUARD,
this);
-
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStarted(
- new AuthenticationStartedInfo.Builder(BiometricSourceType.FINGERPRINT,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD).build()
- );
- }
-
+ mAuthenticationStateListeners.onAuthenticationStarted(
+ new AuthenticationStartedInfo.Builder(BiometricSourceType.FINGERPRINT,
+ BiometricRequestConstants.REASON_AUTH_KEYGUARD).build()
+ );
try {
doDetectInteraction();
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception when requesting finger detect", e);
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(
- new AuthenticationStoppedInfo.Builder(BiometricSourceType.FINGERPRINT,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(
+ new AuthenticationStoppedInfo.Builder(BiometricSourceType.FINGERPRINT,
+ BiometricRequestConstants.REASON_AUTH_KEYGUARD).build()
+ );
mCallback.onClientFinished(this, false /* success */);
}
}
@@ -154,14 +139,12 @@
} catch (RemoteException e) {
Slog.e(TAG, "Unable to start detect interaction", e);
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(
- new AuthenticationStoppedInfo.Builder(
- BiometricSourceType.FINGERPRINT,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD
- ).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(
+ new AuthenticationStoppedInfo.Builder(
+ BiometricSourceType.FINGERPRINT,
+ BiometricRequestConstants.REASON_AUTH_KEYGUARD
+ ).build()
+ );
mCallback.onClientFinished(this, false /* success */);
}
}, ctx -> {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
index 3d170db..3a72d7e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
@@ -22,8 +22,6 @@
import static android.hardware.fingerprint.FingerprintManager.getAcquiredString;
import static android.hardware.fingerprint.FingerprintManager.getErrorString;
-import static com.android.systemui.shared.Flags.sidefpsControllerRefactor;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -43,7 +41,6 @@
import android.hardware.fingerprint.FingerprintEnrollOptions;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.hardware.keymaster.HardwareAuthToken;
import android.os.IBinder;
@@ -106,8 +103,6 @@
@NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext,
@NonNull FingerprintSensorPropertiesInternal sensorProps,
@Nullable IUdfpsOverlayController udfpsOverlayController,
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Nullable ISidefpsController sidefpsController,
@NonNull AuthenticationStateListeners authenticationStateListeners,
int maxTemplatesPerUser, @FingerprintManager.EnrollReason int enrollReason,
@NonNull FingerprintEnrollOptions options) {
@@ -118,11 +113,7 @@
BiometricFingerprintConstants.reasonToMetric(options.getEnrollReason()));
setRequestId(requestId);
mSensorProps = sensorProps;
- if (sidefpsControllerRefactor()) {
- mSensorOverlays = new SensorOverlays(udfpsOverlayController);
- } else {
- mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController);
- }
+ mSensorOverlays = new SensorOverlays(udfpsOverlayController);
mAuthenticationStateListeners = authenticationStateListeners;
mMaxTemplatesPerUser = maxTemplatesPerUser;
@@ -161,13 +152,11 @@
if (remaining == 0) {
resetIgnoreDisplayTouches();
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(
- new AuthenticationStoppedInfo.Builder(
- BiometricSourceType.FINGERPRINT,
- getRequestReasonFromFingerprintEnrollReason(mEnrollReason)).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(
+ new AuthenticationStoppedInfo.Builder(
+ BiometricSourceType.FINGERPRINT,
+ getRequestReasonFromFingerprintEnrollReason(mEnrollReason)).build()
+ );
}
}
@@ -224,12 +213,10 @@
resetIgnoreDisplayTouches();
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(
- new AuthenticationStoppedInfo.Builder(BiometricSourceType.FINGERPRINT,
- getRequestReasonFromFingerprintEnrollReason(mEnrollReason)).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(
+ new AuthenticationStoppedInfo.Builder(BiometricSourceType.FINGERPRINT,
+ getRequestReasonFromFingerprintEnrollReason(mEnrollReason)).build()
+ );
}
@Override
@@ -243,12 +230,10 @@
resetIgnoreDisplayTouches();
mSensorOverlays.show(getSensorId(),
getRequestReasonFromFingerprintEnrollReason(mEnrollReason), this);
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStarted(new AuthenticationStartedInfo
- .Builder(BiometricSourceType.FINGERPRINT,
- getRequestReasonFromFingerprintEnrollReason(mEnrollReason)).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStarted(new AuthenticationStartedInfo
+ .Builder(BiometricSourceType.FINGERPRINT,
+ getRequestReasonFromFingerprintEnrollReason(mEnrollReason)).build()
+ );
BiometricNotificationUtils.cancelBadCalibrationNotification(getContext());
try {
@@ -294,12 +279,10 @@
protected void stopHalOperation() {
resetIgnoreDisplayTouches();
mSensorOverlays.hide(getSensorId());
- if (sidefpsControllerRefactor()) {
- mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
- .Builder(BiometricSourceType.FINGERPRINT,
- getRequestReasonFromFingerprintEnrollReason(mEnrollReason)).build()
- );
- }
+ mAuthenticationStateListeners.onAuthenticationStopped(new AuthenticationStoppedInfo
+ .Builder(BiometricSourceType.FINGERPRINT,
+ getRequestReasonFromFingerprintEnrollReason(mEnrollReason)).build()
+ );
unsubscribeBiometricContext();
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index f485a65..6874c71 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -43,7 +43,6 @@
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Binder;
import android.os.Build;
@@ -131,8 +130,6 @@
@NonNull private final BiometricHandlerProvider mBiometricHandlerProvider;
@Nullable private IFingerprint mDaemon;
@Nullable private IUdfpsOverlayController mUdfpsOverlayController;
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Nullable private ISidefpsController mSidefpsController;
private final AuthSessionCoordinator mAuthSessionCoordinator;
@Nullable private AuthenticationStatsCollector mAuthenticationStatsCollector;
@Nullable private IVirtualHal mVhal;
@@ -509,8 +506,8 @@
BiometricsProtoEnums.CLIENT_UNKNOWN, mAuthenticationStatsCollector),
mBiometricContext,
mFingerprintSensors.get(sensorId).getSensorProperties(),
- mUdfpsOverlayController, mSidefpsController,
- mAuthenticationStateListeners, maxTemplatesPerUser, enrollReason, options);
+ mUdfpsOverlayController, mAuthenticationStateListeners, maxTemplatesPerUser,
+ enrollReason, options);
scheduleForSensor(sensorId, client, mBiometricStateCallback);
});
return id;
@@ -565,8 +562,8 @@
mAuthenticationStatsCollector),
mBiometricContext, isStrongBiometric,
mTaskStackListener,
- mUdfpsOverlayController, mSidefpsController,
- mAuthenticationStateListeners, allowBackgroundAuthentication,
+ mUdfpsOverlayController, mAuthenticationStateListeners,
+ allowBackgroundAuthentication,
mFingerprintSensors.get(sensorId).getSensorProperties(),
Utils.getCurrentStrength(sensorId),
lockoutTracker);
@@ -801,12 +798,6 @@
}
}
- // TODO(b/288175061): remove with Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
- @Override
- public void setSidefpsController(@NonNull ISidefpsController controller) {
- mSidefpsController = controller;
- }
-
@Override
public void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto,
boolean clearSchedulerBuffer) {
diff --git a/services/core/java/com/android/server/display/BrightnessRangeController.java b/services/core/java/com/android/server/display/BrightnessRangeController.java
index dc0e80c..9b37418 100644
--- a/services/core/java/com/android/server/display/BrightnessRangeController.java
+++ b/services/core/java/com/android/server/display/BrightnessRangeController.java
@@ -19,7 +19,6 @@
import android.hardware.display.BrightnessInfo;
import android.os.Handler;
import android.os.IBinder;
-import android.os.PowerManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.brightness.clamper.HdrClamper;
@@ -148,9 +147,7 @@
float getHdrBrightnessValue() {
float hdrBrightness = mHbmController.getHdrBrightnessValue();
- float brightnessMax = mUseHdrClamper ? mHdrClamper.getMaxBrightness()
- : PowerManager.BRIGHTNESS_MAX;
- return Math.min(hdrBrightness, brightnessMax);
+ return mUseHdrClamper ? mHdrClamper.clamp(hdrBrightness) : hdrBrightness;
}
float getTransitionPoint() {
diff --git a/services/core/java/com/android/server/display/DisplayBrightnessState.java b/services/core/java/com/android/server/display/DisplayBrightnessState.java
index e3e3be2..baa154d 100644
--- a/services/core/java/com/android/server/display/DisplayBrightnessState.java
+++ b/services/core/java/com/android/server/display/DisplayBrightnessState.java
@@ -45,6 +45,7 @@
private final float mCustomAnimationRate;
private final BrightnessEvent mBrightnessEvent;
+ private final int mBrightnessAdjustmentFlag;
private DisplayBrightnessState(Builder builder) {
mBrightness = builder.getBrightness();
@@ -58,6 +59,7 @@
mCustomAnimationRate = builder.getCustomAnimationRate();
mShouldUpdateScreenBrightnessSetting = builder.shouldUpdateScreenBrightnessSetting();
mBrightnessEvent = builder.getBrightnessEvent();
+ mBrightnessAdjustmentFlag = builder.getBrightnessAdjustmentFlag();
}
/**
@@ -138,6 +140,14 @@
return mBrightnessEvent;
}
+ /**
+ * Gets the flag representing the reason for the brightness adjustment. This can be
+ * automatic(e.g. because of the change in the lux), or user initiated(e.g. moving the slider)
+ */
+ public int getBrightnessAdjustmentFlag() {
+ return mBrightnessAdjustmentFlag;
+ }
+
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder("DisplayBrightnessState:");
@@ -157,6 +167,7 @@
.append(mShouldUpdateScreenBrightnessSetting);
stringBuilder.append("\n mBrightnessEvent:")
.append(Objects.toString(mBrightnessEvent, "null"));
+ stringBuilder.append("\n mBrightnessAdjustmentFlag:").append(mBrightnessAdjustmentFlag);
return stringBuilder.toString();
}
@@ -187,7 +198,8 @@
&& mCustomAnimationRate == otherState.getCustomAnimationRate()
&& mShouldUpdateScreenBrightnessSetting
== otherState.shouldUpdateScreenBrightnessSetting()
- && Objects.equals(mBrightnessEvent, otherState.getBrightnessEvent());
+ && Objects.equals(mBrightnessEvent, otherState.getBrightnessEvent())
+ && mBrightnessAdjustmentFlag == otherState.getBrightnessAdjustmentFlag();
}
@Override
@@ -195,7 +207,7 @@
return Objects.hash(mBrightness, mSdrBrightness, mBrightnessReason,
mShouldUseAutoBrightness, mIsSlowChange, mMaxBrightness, mMinBrightness,
mCustomAnimationRate,
- mShouldUpdateScreenBrightnessSetting, mBrightnessEvent);
+ mShouldUpdateScreenBrightnessSetting, mBrightnessEvent, mBrightnessAdjustmentFlag);
}
/**
@@ -222,6 +234,8 @@
private BrightnessEvent mBrightnessEvent;
+ public int mBrightnessAdjustmentFlag = 0;
+
/**
* Create a builder starting with the values from the specified {@link
* DisplayBrightnessState}.
@@ -242,6 +256,7 @@
builder.setShouldUpdateScreenBrightnessSetting(
state.shouldUpdateScreenBrightnessSetting());
builder.setBrightnessEvent(state.getBrightnessEvent());
+ builder.setBrightnessAdjustmentFlag(state.getBrightnessAdjustmentFlag());
return builder;
}
@@ -418,7 +433,6 @@
return new DisplayBrightnessState(this);
}
-
/**
* This is used to get the BrightnessEvent object from its builder
*/
@@ -434,5 +448,21 @@
mBrightnessEvent = brightnessEvent;
return this;
}
+
+ /**
+ * This is used to get the brightness adjustment flag from its builder
+ */
+ public int getBrightnessAdjustmentFlag() {
+ return mBrightnessAdjustmentFlag;
+ }
+
+
+ /**
+ * This is used to set the brightness adjustment flag
+ */
+ public Builder setBrightnessAdjustmentFlag(int brightnessAdjustmentFlag) {
+ mBrightnessAdjustmentFlag = brightnessAdjustmentFlag;
+ return this;
+ }
}
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index e88ace1..c5d8686 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -1345,6 +1345,7 @@
boolean slowChange = displayBrightnessState.isSlowChange();
// custom transition duration
float customAnimationRate = displayBrightnessState.getCustomAnimationRate();
+ int brightnessAdjustmentFlags = displayBrightnessState.getBrightnessAdjustmentFlag();
final boolean userSetBrightnessChanged =
mDisplayBrightnessController.getIsUserSetScreenBrightnessUpdated();
if (displayBrightnessState.getBrightnessEvent() != null) {
@@ -1392,15 +1393,10 @@
displayBrightnessState.shouldUpdateScreenBrightnessSetting();
float currentBrightnessSetting = mDisplayBrightnessController.getCurrentBrightness();
// Apply auto-brightness.
- int brightnessAdjustmentFlags = 0;
// All the conditions inside this if block will be moved to AutomaticBrightnessStrategy
if (mFlags.isRefactorDisplayPowerControllerEnabled()
&& displayBrightnessState.getBrightnessReason().getReason()
== BrightnessReason.REASON_AUTOMATIC) {
- brightnessAdjustmentFlags =
- mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentReasonsFlags();
- updateScreenBrightnessSetting = currentBrightnessSetting != brightnessState;
- mBrightnessReasonTemp.setReason(BrightnessReason.REASON_AUTOMATIC);
if (mScreenOffBrightnessSensorController != null) {
mScreenOffBrightnessSensorController.setLightSensorEnabled(false);
}
diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
index 8b3e4a4..6a88a76 100644
--- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
+++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
@@ -146,7 +146,8 @@
synchronized (mLock) {
mDisplayBrightnessStrategy = mDisplayBrightnessStrategySelector.selectStrategy(
constructStrategySelectionRequest(displayPowerRequest, targetDisplayState));
- state = mDisplayBrightnessStrategy.updateBrightness(displayPowerRequest);
+ state = mDisplayBrightnessStrategy
+ .updateBrightness(constructStrategyExecutionRequest(displayPowerRequest));
}
// This is a temporary measure until AutomaticBrightnessStrategy works as a traditional
@@ -550,4 +551,10 @@
return new StrategySelectionRequest(displayPowerRequest, targetDisplayState,
lastUserSetScreenBrightness, userSetBrightnessChanged);
}
+
+ private StrategyExecutionRequest constructStrategyExecutionRequest(
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ float currentScreenBrightness = getCurrentBrightness();
+ return new StrategyExecutionRequest(displayPowerRequest, currentScreenBrightness);
+ }
}
diff --git a/services/core/java/com/android/server/display/brightness/StrategyExecutionRequest.java b/services/core/java/com/android/server/display/brightness/StrategyExecutionRequest.java
new file mode 100644
index 0000000..82c0bbf
--- /dev/null
+++ b/services/core/java/com/android/server/display/brightness/StrategyExecutionRequest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.display.brightness;
+
+import android.hardware.display.DisplayManagerInternal;
+
+import java.util.Objects;
+
+/**
+ * A wrapper class to encapsulate the request to execute the selected strategy
+ */
+public final class StrategyExecutionRequest {
+ // The request to change the associated display's state and brightness
+ private final DisplayManagerInternal.DisplayPowerRequest mDisplayPowerRequest;
+
+ private final float mCurrentScreenBrightness;
+
+ public StrategyExecutionRequest(DisplayManagerInternal.DisplayPowerRequest displayPowerRequest,
+ float currentScreenBrightness) {
+ mDisplayPowerRequest = displayPowerRequest;
+ mCurrentScreenBrightness = currentScreenBrightness;
+ }
+
+ public DisplayManagerInternal.DisplayPowerRequest getDisplayPowerRequest() {
+ return mDisplayPowerRequest;
+ }
+
+ public float getCurrentScreenBrightness() {
+ return mCurrentScreenBrightness;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof StrategyExecutionRequest)) {
+ return false;
+ }
+ StrategyExecutionRequest other = (StrategyExecutionRequest) obj;
+ return Objects.equals(mDisplayPowerRequest, other.getDisplayPowerRequest())
+ && mCurrentScreenBrightness == other.getCurrentScreenBrightness();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mDisplayPowerRequest, mCurrentScreenBrightness);
+ }
+}
diff --git a/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java b/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
index f1cb66c..902daa4 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
@@ -59,6 +59,11 @@
private boolean mAutoBrightnessEnabled = false;
+ /**
+ * Indicates that maxBrightness is changed, and we should use slow transition
+ */
+ private boolean mUseSlowTransition = false;
+
public HdrClamper(BrightnessClamperController.ClamperChangeListener clamperChangeListener,
Handler handler) {
this(clamperChangeListener, handler, new Injector());
@@ -72,6 +77,7 @@
mDebouncer = () -> {
mTransitionRate = mDesiredTransitionRate;
mMaxBrightness = mDesiredMaxBrightness;
+ mUseSlowTransition = true;
mClamperChangeListener.onChanged();
};
mHdrListener = injector.getHdrListener((visible) -> {
@@ -80,14 +86,24 @@
}, handler);
}
- // Called in same looper: mHandler.getLooper()
+ /**
+ * Applies clamping
+ * Called in same looper: mHandler.getLooper()
+ */
+ public float clamp(float brightness) {
+ return Math.min(brightness, mMaxBrightness);
+ }
+
+ @VisibleForTesting
public float getMaxBrightness() {
return mMaxBrightness;
}
// Called in same looper: mHandler.getLooper()
public float getTransitionRate() {
- return mTransitionRate;
+ float expectedTransitionRate = mUseSlowTransition ? mTransitionRate : -1;
+ mUseSlowTransition = false;
+ return expectedTransitionRate;
}
/**
@@ -173,7 +189,8 @@
mMaxBrightness = PowerManager.BRIGHTNESS_MAX;
mDesiredMaxBrightness = PowerManager.BRIGHTNESS_MAX;
mDesiredTransitionRate = -1f;
- mTransitionRate = 1f;
+ mTransitionRate = -1f;
+ mUseSlowTransition = false;
mClamperChangeListener.onChanged();
}
diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
index 4be7332..5c4fa842 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
@@ -20,7 +20,6 @@
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.display.BrightnessConfiguration;
-import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;
import android.os.UserHandle;
import android.provider.Settings;
@@ -32,6 +31,7 @@
import com.android.server.display.brightness.BrightnessEvent;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -96,13 +96,21 @@
// want to re-evaluate the auto-brightness state
private boolean mIsConfigured;
- public AutomaticBrightnessStrategy(Context context, int displayId) {
+ private Injector mInjector;
+
+ @VisibleForTesting
+ AutomaticBrightnessStrategy(Context context, int displayId, Injector injector) {
super(context, displayId);
mContext = context;
mDisplayId = displayId;
mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
mPendingAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
mTemporaryAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+ mInjector = (injector == null) ? new RealInjector() : injector;
+ }
+
+ public AutomaticBrightnessStrategy(Context context, int displayId) {
+ this(context, displayId, null);
}
/**
@@ -252,10 +260,10 @@
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
BrightnessReason brightnessReason = new BrightnessReason();
brightnessReason.setReason(BrightnessReason.REASON_AUTOMATIC);
- BrightnessEvent brightnessEvent = new BrightnessEvent(mDisplayId);
+ BrightnessEvent brightnessEvent = mInjector.getBrightnessEvent(mDisplayId);
float brightness = getAutomaticScreenBrightness(brightnessEvent);
return new DisplayBrightnessState.Builder()
.setBrightness(brightness)
@@ -265,6 +273,9 @@
.setIsSlowChange(hasAppliedAutoBrightness()
&& !getAutoBrightnessAdjustmentChanged())
.setBrightnessEvent(brightnessEvent)
+ .setBrightnessAdjustmentFlag(mAutoBrightnessAdjustmentReasonsFlags)
+ .setShouldUpdateScreenBrightnessSetting(
+ brightness != strategyExecutionRequest.getCurrentScreenBrightness())
.build();
}
@@ -360,13 +371,6 @@
}
/**
- * Gets the auto-brightness adjustment flag change reason
- */
- public int getAutoBrightnessAdjustmentReasonsFlags() {
- return mAutoBrightnessAdjustmentReasonsFlags;
- }
-
- /**
* Returns if the auto brightness has been applied
*/
public boolean hasAppliedAutoBrightness() {
@@ -497,4 +501,15 @@
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f, UserHandle.USER_CURRENT);
return Float.isNaN(adj) ? 0.0f : BrightnessUtils.clampBrightnessAdjustment(adj);
}
+
+ @VisibleForTesting
+ interface Injector {
+ BrightnessEvent getBrightnessEvent(int displayId);
+ }
+
+ static class RealInjector implements Injector {
+ public BrightnessEvent getBrightnessEvent(int displayId) {
+ return new BrightnessEvent(displayId);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/display/brightness/strategy/BoostBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/BoostBrightnessStrategy.java
index 9c1acea..009a47a 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/BoostBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/BoostBrightnessStrategy.java
@@ -16,12 +16,12 @@
package com.android.server.display.brightness.strategy;
-import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -37,7 +37,7 @@
// Set the brightness to the maximum value when display brightness boost is requested
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
// Todo(b/241308599): Introduce a validator class and add validations before setting
// the brightness
DisplayBrightnessState displayBrightnessState =
diff --git a/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategy.java
index 61dd6d5..e96b83a 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategy.java
@@ -17,9 +17,9 @@
package com.android.server.display.brightness.strategy;
import android.annotation.NonNull;
-import android.hardware.display.DisplayManagerInternal;
import com.android.server.display.DisplayBrightnessState;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -33,10 +33,10 @@
/**
* Decides the DisplayBrightnessState that the system should change to.
*
- * @param displayPowerRequest The request to evaluate the updated brightness
+ * @param strategyExecutionRequest The request to evaluate the updated brightness
*/
DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest);
+ StrategyExecutionRequest strategyExecutionRequest);
/**
* Returns the name of the Strategy
diff --git a/services/core/java/com/android/server/display/brightness/strategy/DozeBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/DozeBrightnessStrategy.java
index 1f7efd1..2b493f3 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/DozeBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/DozeBrightnessStrategy.java
@@ -16,11 +16,10 @@
package com.android.server.display.brightness.strategy;
-import android.hardware.display.DisplayManagerInternal;
-
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -32,11 +31,12 @@
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
// Todo(b/241308599): Introduce a validator class and add validations before setting
// the brightness
return BrightnessUtils.constructDisplayBrightnessState(BrightnessReason.REASON_DOZE,
- displayPowerRequest.dozeScreenBrightness, displayPowerRequest.dozeScreenBrightness,
+ strategyExecutionRequest.getDisplayPowerRequest().dozeScreenBrightness,
+ strategyExecutionRequest.getDisplayPowerRequest().dozeScreenBrightness,
getName());
}
diff --git a/services/core/java/com/android/server/display/brightness/strategy/FollowerBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/FollowerBrightnessStrategy.java
index baac276..5a07ce2 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/FollowerBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/FollowerBrightnessStrategy.java
@@ -16,12 +16,12 @@
package com.android.server.display.brightness.strategy;
-import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -49,7 +49,7 @@
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
// Todo(b/241308599): Introduce a validator class and add validations before setting
// the brightness
return BrightnessUtils.constructDisplayBrightnessState(BrightnessReason.REASON_FOLLOWER,
diff --git a/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
index dfd47a3..9dc6cff 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
@@ -16,12 +16,12 @@
package com.android.server.display.brightness.strategy;
-import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -32,7 +32,7 @@
public class InvalidBrightnessStrategy implements DisplayBrightnessStrategy {
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
return BrightnessUtils.constructDisplayBrightnessState(BrightnessReason.REASON_UNKNOWN,
PowerManager.BRIGHTNESS_INVALID_FLOAT, PowerManager.BRIGHTNESS_INVALID_FLOAT,
getName());
diff --git a/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
index 60e5eb0..b46873a 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
@@ -16,11 +16,11 @@
package com.android.server.display.brightness.strategy;
-import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import com.android.server.display.feature.DisplayManagerFlags;
@@ -42,7 +42,7 @@
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
float offloadBrightness = mOffloadScreenBrightness;
if (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()) {
// We reset the offload brightness to invalid so that there is no stale value lingering
diff --git a/services/core/java/com/android/server/display/brightness/strategy/OverrideBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/OverrideBrightnessStrategy.java
index 9605a88..a2982b1 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/OverrideBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/OverrideBrightnessStrategy.java
@@ -16,11 +16,10 @@
package com.android.server.display.brightness.strategy;
-import android.hardware.display.DisplayManagerInternal;
-
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -31,12 +30,13 @@
public class OverrideBrightnessStrategy implements DisplayBrightnessStrategy {
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
// Todo(b/241308599): Introduce a validator class and add validations before setting
// the brightness
return BrightnessUtils.constructDisplayBrightnessState(BrightnessReason.REASON_OVERRIDE,
- displayPowerRequest.screenBrightnessOverride,
- displayPowerRequest.screenBrightnessOverride, getName());
+ strategyExecutionRequest.getDisplayPowerRequest().screenBrightnessOverride,
+ strategyExecutionRequest.getDisplayPowerRequest()
+ .screenBrightnessOverride, getName());
}
@Override
diff --git a/services/core/java/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategy.java
index c9dc298..6a3162c 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategy.java
@@ -16,12 +16,12 @@
package com.android.server.display.brightness.strategy;
-import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -32,7 +32,7 @@
public class ScreenOffBrightnessStrategy implements DisplayBrightnessStrategy {
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
// Todo(b/241308599): Introduce a validator class and add validations before setting
// the brightness
return BrightnessUtils.constructDisplayBrightnessState(BrightnessReason.REASON_SCREEN_OFF,
diff --git a/services/core/java/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategy.java
index 6a691d1..6b8817a 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategy.java
@@ -16,12 +16,12 @@
package com.android.server.display.brightness.strategy;
-import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import java.io.PrintWriter;
@@ -43,7 +43,7 @@
// WindowManager or based on the display state.
@Override
public DisplayBrightnessState updateBrightness(
- DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+ StrategyExecutionRequest strategyExecutionRequest) {
// Todo(b/241308599): Introduce a validator class and add validations before setting
// the brightness
DisplayBrightnessState displayBrightnessState =
diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java
index 0e8a5fb..a818eab 100644
--- a/services/core/java/com/android/server/dreams/DreamController.java
+++ b/services/core/java/com/android/server/dreams/DreamController.java
@@ -249,6 +249,16 @@
mCurrentDream.mAppTask = appTask;
}
+ void setDreamHasFocus(boolean hasFocus) {
+ if (mCurrentDream != null) {
+ mCurrentDream.mDreamHasFocus = hasFocus;
+ }
+ }
+
+ boolean dreamHasFocus() {
+ return mCurrentDream != null && mCurrentDream.mDreamHasFocus;
+ }
+
/**
* Sends a user activity signal to PowerManager to stop the screen from turning off immediately
* if there hasn't been any user interaction in a while.
@@ -271,6 +281,21 @@
stopDreamInstance(immediate, reason, mCurrentDream);
}
+ public boolean bringDreamToFront() {
+ if (mCurrentDream == null || mCurrentDream.mService == null) {
+ return false;
+ }
+
+ try {
+ mCurrentDream.mService.comeToFront();
+ return true;
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error asking dream to come to the front", e);
+ }
+
+ return false;
+ }
+
/**
* Stops the given dream instance.
*
@@ -426,6 +451,7 @@
private String mStopReason;
private long mDreamStartTime;
public boolean mWakingGently;
+ public boolean mDreamHasFocus;
private final Runnable mStopPreviousDreamsIfNeeded = this::stopPreviousDreamsIfNeeded;
private final Runnable mReleaseWakeLockIfNeeded = this::releaseWakeLockIfNeeded;
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index 42c9e08..fc63494 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -20,6 +20,7 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.service.dreams.Flags.dreamTracksFocus;
import static com.android.server.wm.ActivityInterceptorCallback.DREAM_MANAGER_ORDERED_ID;
@@ -406,8 +407,10 @@
/** Whether dreaming can start given user settings and the current dock/charge state. */
private boolean canStartDreamingInternal(boolean isScreenOn) {
synchronized (mLock) {
- // Can't start dreaming if we are already dreaming.
- if (isScreenOn && isDreamingInternal()) {
+ // Can't start dreaming if we are already dreaming and the dream has focus. If we are
+ // dreaming but the dream does not have focus, then the dream can be brought to the
+ // front so it does have focus.
+ if (isScreenOn && isDreamingInternal() && dreamHasFocus()) {
return false;
}
@@ -442,11 +445,20 @@
}
}
+ private boolean dreamHasFocus() {
+ // Dreams always had focus before they were able to track it.
+ return !dreamTracksFocus() || mController.dreamHasFocus();
+ }
+
protected void requestStartDreamFromShell() {
requestDreamInternal();
}
private void requestDreamInternal() {
+ if (isDreamingInternal() && !dreamHasFocus() && mController.bringDreamToFront()) {
+ return;
+ }
+
// Ask the power manager to nap. It will eventually call back into
// startDream() if/when it is appropriate to start dreaming.
// Because napping could cause the screen to turn off immediately if the dream
@@ -1128,6 +1140,16 @@
});
}
+ @Override
+ public void onDreamFocusChanged(boolean hasFocus) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mController.setDreamHasFocus(hasFocus);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
boolean canLaunchDreamActivity(String dreamPackageName, String packageName,
int callingUid) {
if (dreamPackageName == null || packageName == null) {
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManager.java
index b18871c..a0dbfa0 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManager.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubTransactionManager.java
@@ -28,6 +28,7 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Random;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -77,9 +78,12 @@
private final AtomicInteger mNextAvailableId = new AtomicInteger();
/**
- * The next available message sequence number
+ * The next available message sequence number. We choose a random
+ * number to start with to avoid collisions and limit the bound to
+ * half of the max value to avoid overflow.
*/
- private final AtomicInteger mNextAvailableMessageSequenceNumber = new AtomicInteger();
+ private final AtomicInteger mNextAvailableMessageSequenceNumber =
+ new AtomicInteger(new Random().nextInt(Integer.MAX_VALUE / 2));
/*
* An executor and the future object for scheduling timeout timers
diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
index db83d4b..a7fd750 100644
--- a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
+++ b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
@@ -233,7 +233,7 @@
return false;
}
boolean bindDueToManagerScan =
- mIsManagerScanning && Flags.enablePreventionOfManagerScansWhenNoAppsScan();
+ mIsManagerScanning && !Flags.enablePreventionOfManagerScansWhenNoAppsScan();
if (!getSessionInfos().isEmpty() || bindDueToManagerScan) {
// We bind if any manager is scanning (regardless of whether an app is scanning) to give
// the opportunity for providers to publish routing sessions that were established
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index e50189b..869b89a 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -3411,7 +3411,14 @@
for (RouterRecord activeRouterRecord : activeRouterRecords) {
RouteDiscoveryPreference preference = activeRouterRecord.mDiscoveryPreference;
preferredFeatures.addAll(preference.getPreferredFeatures());
- if (activeRouterRecord.isActivelyScanning()) {
+
+ boolean isRouterRecordActivelyScanning =
+ Flags.enablePreventionOfManagerScansWhenNoAppsScan()
+ ? (activeRouterRecord.isActivelyScanning() || shouldForceActiveScan)
+ && !preference.getPreferredFeatures().isEmpty()
+ : activeRouterRecord.isActivelyScanning();
+
+ if (isRouterRecordActivelyScanning) {
activeScan = true;
activelyScanningPackages.add(activeRouterRecord.mPackageName);
}
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 3d68555..a3c5d2d 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -66,7 +66,6 @@
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
-import android.os.DeadObjectException;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -90,7 +89,6 @@
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
@@ -191,6 +189,9 @@
private final ForegroundServiceDelegationOptions mForegroundServiceDelegationOptions;
private final Object mLock = new Object();
+ // This field is partially guarded by mLock. Writes and non-atomic iterations (for example:
+ // index-based-iterations) must be guarded by mLock. But it is safe to acquire an iterator
+ // without acquiring mLock.
private final CopyOnWriteArrayList<ISessionControllerCallbackHolder>
mControllerCallbackHolders = new CopyOnWriteArrayList<>();
@@ -886,24 +887,9 @@
}
playbackState = mPlaybackState;
}
- Collection<ISessionControllerCallbackHolder> deadCallbackHolders = null;
- for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
- try {
- holder.mCallback.onPlaybackStateChanged(playbackState);
- } catch (DeadObjectException e) {
- if (deadCallbackHolders == null) {
- deadCallbackHolders = new ArrayList<>();
- }
- deadCallbackHolders.add(holder);
- logCallbackException("Removing dead callback in pushPlaybackStateUpdate", holder,
- e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushPlaybackStateUpdate", holder, e);
- }
- }
- if (deadCallbackHolders != null) {
- removeControllerHoldersSafely(deadCallbackHolders);
- }
+ performOnCallbackHolders(
+ "pushPlaybackStateUpdate",
+ holder -> holder.mCallback.onPlaybackStateChanged(playbackState));
}
private void pushMetadataUpdate() {
@@ -914,23 +900,8 @@
}
metadata = mMetadata;
}
- Collection<ISessionControllerCallbackHolder> deadCallbackHolders = null;
- for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
- try {
- holder.mCallback.onMetadataChanged(metadata);
- } catch (DeadObjectException e) {
- if (deadCallbackHolders == null) {
- deadCallbackHolders = new ArrayList<>();
- }
- deadCallbackHolders.add(holder);
- logCallbackException("Removing dead callback in pushMetadataUpdate", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushMetadataUpdate", holder, e);
- }
- }
- if (deadCallbackHolders != null) {
- removeControllerHoldersSafely(deadCallbackHolders);
- }
+ performOnCallbackHolders(
+ "pushMetadataUpdate", holder -> holder.mCallback.onMetadataChanged(metadata));
}
private void pushQueueUpdate() {
@@ -941,31 +912,18 @@
}
toSend = mQueue == null ? null : new ArrayList<>(mQueue);
}
- Collection<ISessionControllerCallbackHolder> deadCallbackHolders = null;
- for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
- ParceledListSlice<QueueItem> parcelableQueue = null;
- if (toSend != null) {
- parcelableQueue = new ParceledListSlice<>(toSend);
- // Limit the size of initial Parcel to prevent binder buffer overflow
- // as onQueueChanged is an async binder call.
- parcelableQueue.setInlineCountLimit(1);
- }
-
- try {
- holder.mCallback.onQueueChanged(parcelableQueue);
- } catch (DeadObjectException e) {
- if (deadCallbackHolders == null) {
- deadCallbackHolders = new ArrayList<>();
- }
- deadCallbackHolders.add(holder);
- logCallbackException("Removing dead callback in pushQueueUpdate", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushQueueUpdate", holder, e);
- }
- }
- if (deadCallbackHolders != null) {
- removeControllerHoldersSafely(deadCallbackHolders);
- }
+ performOnCallbackHolders(
+ "pushQueueUpdate",
+ holder -> {
+ ParceledListSlice<QueueItem> parcelableQueue = null;
+ if (toSend != null) {
+ parcelableQueue = new ParceledListSlice<>(toSend);
+ // Limit the size of initial Parcel to prevent binder buffer overflow
+ // as onQueueChanged is an async binder call.
+ parcelableQueue.setInlineCountLimit(1);
+ }
+ holder.mCallback.onQueueChanged(parcelableQueue);
+ });
}
private void pushQueueTitleUpdate() {
@@ -976,23 +934,8 @@
}
queueTitle = mQueueTitle;
}
- Collection<ISessionControllerCallbackHolder> deadCallbackHolders = null;
- for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
- try {
- holder.mCallback.onQueueTitleChanged(queueTitle);
- } catch (DeadObjectException e) {
- if (deadCallbackHolders == null) {
- deadCallbackHolders = new ArrayList<>();
- }
- deadCallbackHolders.add(holder);
- logCallbackException("Removing dead callback in pushQueueTitleUpdate", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushQueueTitleUpdate", holder, e);
- }
- }
- if (deadCallbackHolders != null) {
- removeControllerHoldersSafely(deadCallbackHolders);
- }
+ performOnCallbackHolders(
+ "pushQueueTitleUpdate", holder -> holder.mCallback.onQueueTitleChanged(queueTitle));
}
private void pushExtrasUpdate() {
@@ -1003,23 +946,8 @@
}
extras = mExtras;
}
- Collection<ISessionControllerCallbackHolder> deadCallbackHolders = null;
- for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
- try {
- holder.mCallback.onExtrasChanged(extras);
- } catch (DeadObjectException e) {
- if (deadCallbackHolders == null) {
- deadCallbackHolders = new ArrayList<>();
- }
- deadCallbackHolders.add(holder);
- logCallbackException("Removing dead callback in pushExtrasUpdate", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushExtrasUpdate", holder, e);
- }
- }
- if (deadCallbackHolders != null) {
- removeControllerHoldersSafely(deadCallbackHolders);
- }
+ performOnCallbackHolders(
+ "pushExtrasUpdate", holder -> holder.mCallback.onExtrasChanged(extras));
}
private void pushVolumeUpdate() {
@@ -1030,23 +958,8 @@
}
info = getVolumeAttributes();
}
- Collection<ISessionControllerCallbackHolder> deadCallbackHolders = null;
- for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
- try {
- holder.mCallback.onVolumeInfoChanged(info);
- } catch (DeadObjectException e) {
- if (deadCallbackHolders == null) {
- deadCallbackHolders = new ArrayList<>();
- }
- deadCallbackHolders.add(holder);
- logCallbackException("Removing dead callback in pushVolumeUpdate", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushVolumeUpdate", holder, e);
- }
- }
- if (deadCallbackHolders != null) {
- removeControllerHoldersSafely(deadCallbackHolders);
- }
+ performOnCallbackHolders(
+ "pushVolumeUpdate", holder -> holder.mCallback.onVolumeInfoChanged(info));
}
private void pushEvent(String event, Bundle data) {
@@ -1055,23 +968,7 @@
return;
}
}
- Collection<ISessionControllerCallbackHolder> deadCallbackHolders = null;
- for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
- try {
- holder.mCallback.onEvent(event, data);
- } catch (DeadObjectException e) {
- if (deadCallbackHolders == null) {
- deadCallbackHolders = new ArrayList<>();
- }
- deadCallbackHolders.add(holder);
- logCallbackException("Removing dead callback in pushEvent", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushEvent", holder, e);
- }
- }
- if (deadCallbackHolders != null) {
- removeControllerHoldersSafely(deadCallbackHolders);
- }
+ performOnCallbackHolders("pushEvent", holder -> holder.mCallback.onEvent(event, data));
}
private void pushSessionDestroyed() {
@@ -1082,20 +979,37 @@
return;
}
}
+ performOnCallbackHolders(
+ "pushSessionDestroyed",
+ holder -> {
+ holder.mCallback.asBinder().unlinkToDeath(holder.mDeathMonitor, 0);
+ holder.mCallback.onSessionDestroyed();
+ });
+ // After notifying clear all listeners
+ synchronized (mLock) {
+ mControllerCallbackHolders.clear();
+ }
+ }
+
+ private interface ControllerCallbackCall {
+
+ void performOn(ISessionControllerCallbackHolder holder) throws RemoteException;
+ }
+
+ private void performOnCallbackHolders(String operationName, ControllerCallbackCall call) {
+ ArrayList<ISessionControllerCallbackHolder> deadCallbackHolders = new ArrayList<>();
for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
try {
- holder.mCallback.asBinder().unlinkToDeath(holder.mDeathMonitor, 0);
- holder.mCallback.onSessionDestroyed();
- } catch (NoSuchElementException e) {
- logCallbackException("error unlinking to binder death", holder, e);
- } catch (DeadObjectException e) {
- logCallbackException("Removing dead callback in pushSessionDestroyed", holder, e);
- } catch (RemoteException e) {
- logCallbackException("unexpected exception in pushSessionDestroyed", holder, e);
+ call.performOn(holder);
+ } catch (RemoteException | NoSuchElementException exception) {
+ deadCallbackHolders.add(holder);
+ logCallbackException(
+ "Exception while executing: " + operationName, holder, exception);
}
}
- // After notifying clear all listeners
- removeControllerHoldersSafely(null);
+ synchronized (mLock) {
+ mControllerCallbackHolders.removeAll(deadCallbackHolders);
+ }
}
private PlaybackState getStateWithUpdatedPosition() {
@@ -1143,17 +1057,6 @@
return -1;
}
- private void removeControllerHoldersSafely(
- Collection<ISessionControllerCallbackHolder> holders) {
- synchronized (mLock) {
- if (holders == null) {
- mControllerCallbackHolders.clear();
- } else {
- mControllerCallbackHolders.removeAll(holders);
- }
- }
- }
-
private PlaybackInfo getVolumeAttributes() {
int volumeType;
AudioAttributes attributes;
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 74adf5e..f981d79 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -215,12 +215,6 @@
private final MediaCommunicationManager.SessionCallback mSession2TokenCallback =
new MediaCommunicationManager.SessionCallback() {
@Override
- // TODO (b/324266224): Deprecate this method once other overload is published.
- public void onSession2TokenCreated(Session2Token token) {
- addSession(token, Process.INVALID_PID);
- }
-
- @Override
public void onSession2TokenCreated(Session2Token token, int pid) {
addSession(token, pid);
}
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index e75d0a3..38c95f7 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -502,8 +502,8 @@
pw.println(prefix + "uid=" + getSbn().getUid() + " userId=" + getSbn().getUserId());
pw.println(prefix + "opPkg=" + getSbn().getOpPkg());
pw.println(prefix + "icon=" + notification.getSmallIcon());
- pw.println(prefix + "flags=0x" + Integer.toHexString(notification.flags));
- pw.println(prefix + "originalFlags=0x" + Integer.toHexString(mOriginalFlags));
+ pw.println(prefix + "flags=" + Notification.flagsToString(notification.flags));
+ pw.println(prefix + "originalFlags=" + Notification.flagsToString(mOriginalFlags));
pw.println(prefix + "pri=" + notification.priority);
pw.println(prefix + "key=" + getSbn().getKey());
pw.println(prefix + "seen=" + mStats.hasSeen());
@@ -538,8 +538,7 @@
pw.println(prefix + "mInterruptionTimeMs=" + mInterruptionTimeMs);
pw.println(prefix + "mSuppressedVisualEffects= " + mSuppressedVisualEffects);
if (mPreChannelsNotification) {
- pw.println(prefix + String.format("defaults=0x%08x flags=0x%08x",
- notification.defaults, notification.flags));
+ pw.println(prefix + "defaults=" + Notification.defaultsToString(notification.defaults));
pw.println(prefix + "n.sound=" + notification.sound);
pw.println(prefix + "n.audioStreamType=" + notification.audioStreamType);
pw.println(prefix + "n.audioAttributes=" + notification.audioAttributes);
diff --git a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
index 8f6aa95..99401a1 100644
--- a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
+++ b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
@@ -207,8 +207,9 @@
return;
}
ensureRemoteIntelligenceServiceInitialized();
+ int callerUid = Binder.getCallingUid();
mRemoteOnDeviceIntelligenceService.run(
- service -> service.getFeature(Binder.getCallingUid(), id, featureCallback));
+ service -> service.getFeature(callerUid, id, featureCallback));
}
@Override
@@ -227,8 +228,9 @@
return;
}
ensureRemoteIntelligenceServiceInitialized();
+ int callerUid = Binder.getCallingUid();
mRemoteOnDeviceIntelligenceService.run(
- service -> service.listFeatures(Binder.getCallingUid(),
+ service -> service.listFeatures(callerUid,
listFeaturesCallback));
}
@@ -250,8 +252,9 @@
return;
}
ensureRemoteIntelligenceServiceInitialized();
+ int callerUid = Binder.getCallingUid();
mRemoteOnDeviceIntelligenceService.run(
- service -> service.getFeatureDetails(Binder.getCallingUid(), feature,
+ service -> service.getFeatureDetails(callerUid, feature,
featureDetailsCallback));
}
@@ -272,8 +275,9 @@
PersistableBundle.EMPTY);
}
ensureRemoteIntelligenceServiceInitialized();
+ int callerUid = Binder.getCallingUid();
mRemoteOnDeviceIntelligenceService.run(
- service -> service.requestFeatureDownload(Binder.getCallingUid(), feature,
+ service -> service.requestFeatureDownload(callerUid, feature,
wrapCancellationFuture(cancellationSignalFuture),
downloadCallback));
}
@@ -301,9 +305,9 @@
PersistableBundle.EMPTY);
}
ensureRemoteInferenceServiceInitialized();
-
+ int callerUid = Binder.getCallingUid();
result = mRemoteInferenceService.post(
- service -> service.requestTokenInfo(Binder.getCallingUid(), feature,
+ service -> service.requestTokenInfo(callerUid, feature,
request,
wrapCancellationFuture(cancellationSignalFuture),
wrapWithValidation(tokenInfoCallback)));
@@ -340,8 +344,9 @@
PersistableBundle.EMPTY);
}
ensureRemoteInferenceServiceInitialized();
+ int callerUid = Binder.getCallingUid();
result = mRemoteInferenceService.post(
- service -> service.processRequest(Binder.getCallingUid(), feature,
+ service -> service.processRequest(callerUid, feature,
request,
requestType,
wrapCancellationFuture(cancellationSignalFuture),
@@ -379,8 +384,9 @@
PersistableBundle.EMPTY);
}
ensureRemoteInferenceServiceInitialized();
+ int callerUid = Binder.getCallingUid();
result = mRemoteInferenceService.post(
- service -> service.processRequestStreaming(Binder.getCallingUid(),
+ service -> service.processRequestStreaming(callerUid,
feature,
request, requestType,
wrapCancellationFuture(cancellationSignalFuture),
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java
index fd16221..b2c6c49 100644
--- a/services/core/java/com/android/server/pm/DeletePackageHelper.java
+++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java
@@ -461,7 +461,7 @@
final int userId = user == null ? UserHandle.USER_ALL : user.getIdentifier();
// Remember which users are affected, before the installed states are modified
- outInfo.mRemovedUsers = (systemApp || userId == UserHandle.USER_ALL)
+ outInfo.mRemovedUsers = userId == UserHandle.USER_ALL
? ps.queryUsersInstalledOrHasData(allUserHandles)
: new int[]{userId};
outInfo.populateBroadcastUsers(ps);
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index e3261bd..bb6708a 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -2005,26 +2005,27 @@
public void setUserAdmin(@UserIdInt int userId) {
checkManageUserAndAcrossUsersFullPermission("set user admin");
mUserJourneyLogger.logUserJourneyBegin(userId, USER_JOURNEY_GRANT_ADMIN);
- UserInfo info;
+ UserData user;
synchronized (mPackagesLock) {
synchronized (mUsersLock) {
- info = getUserInfoLU(userId);
- }
- if (info == null) {
- // Exit if no user found with that id,
- mUserJourneyLogger.logNullUserJourneyError(USER_JOURNEY_GRANT_ADMIN,
+ user = getUserDataLU(userId);
+ if (user == null) {
+ // Exit if no user found with that id,
+ mUserJourneyLogger.logNullUserJourneyError(USER_JOURNEY_GRANT_ADMIN,
getCurrentUserId(), userId, /* userType */ "", /* userFlags */ -1);
- return;
- } else if (info.isAdmin()) {
- // Exit if the user is already an Admin.
- mUserJourneyLogger.logUserJourneyFinishWithError(getCurrentUserId(), info,
- USER_JOURNEY_GRANT_ADMIN, ERROR_CODE_USER_ALREADY_AN_ADMIN);
- return;
+ return;
+ } else if (user.info.isAdmin()) {
+ // Exit if the user is already an Admin.
+ mUserJourneyLogger.logUserJourneyFinishWithError(getCurrentUserId(),
+ user.info, USER_JOURNEY_GRANT_ADMIN,
+ ERROR_CODE_USER_ALREADY_AN_ADMIN);
+ return;
+ }
+ user.info.flags ^= UserInfo.FLAG_ADMIN;
+ writeUserLP(user);
}
- info.flags ^= UserInfo.FLAG_ADMIN;
- writeUserLP(getUserDataLU(info.id));
}
- mUserJourneyLogger.logUserJourneyFinishWithError(getCurrentUserId(), info,
+ mUserJourneyLogger.logUserJourneyFinishWithError(getCurrentUserId(), user.info,
USER_JOURNEY_GRANT_ADMIN, ERROR_CODE_UNSPECIFIED);
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 20c5b5f..28254d0 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -462,8 +462,8 @@
}
@Override
- public int getNumRegisteredAttributionSources(int uid) {
- return mAttributionSourceRegistry.getNumRegisteredAttributionSources(uid);
+ public int getRegisteredAttributionSourceCount(int uid) {
+ return mAttributionSourceRegistry.getRegisteredAttributionSourceCount(uid);
}
@Override
@@ -943,7 +943,7 @@
}
}
- public int getNumRegisteredAttributionSources(int uid) {
+ public int getRegisteredAttributionSourceCount(int uid) {
mContext.enforceCallingOrSelfPermission(UPDATE_APP_OPS_STATS,
"getting the number of registered AttributionSources requires "
+ "UPDATE_APP_OPS_STATS");
@@ -952,14 +952,13 @@
System.gc();
System.gc();
synchronized (mLock) {
- int[] numForUid = { 0 };
- mAttributions.forEach((key, value) -> {
- if (value.getUid() == uid) {
- numForUid[0]++;
+ int numForUid = 0;
+ for (Map.Entry<IBinder, AttributionSource> entry : mAttributions.entrySet()) {
+ if (entry.getValue().getUid() == uid) {
+ numForUid++;
}
-
- });
- return numForUid[0];
+ }
+ return numForUid;
}
}
diff --git a/services/core/java/com/android/server/power/hint/Android.bp b/services/core/java/com/android/server/power/hint/Android.bp
index d7dd902..6dadf8f 100644
--- a/services/core/java/com/android/server/power/hint/Android.bp
+++ b/services/core/java/com/android/server/power/hint/Android.bp
@@ -11,3 +11,10 @@
name: "power_hint_flags_lib",
aconfig_declarations: "power_hint_flags",
}
+
+java_aconfig_library {
+ name: "power_hint_flags_lib_host",
+ aconfig_declarations: "power_hint_flags",
+ host_supported: true,
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
index 54cb9c9..49c4000 100644
--- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
+++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
@@ -19,6 +19,7 @@
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.os.BatteryStats.Uid.NUM_PROCESS_STATE;
+import static android.os.BatteryStats.Uid.NUM_WIFI_BATCHED_SCAN_BINS;
import static android.os.BatteryStatsManager.NUM_WIFI_STATES;
import static android.os.BatteryStatsManager.NUM_WIFI_SUPPL_STATES;
@@ -292,7 +293,25 @@
private int[] mCpuPowerBracketMap;
private final CpuPowerStatsCollector mCpuPowerStatsCollector;
private final MobileRadioPowerStatsCollector mMobileRadioPowerStatsCollector;
+ private final WifiPowerStatsCollector mWifiPowerStatsCollector;
private final SparseBooleanArray mPowerStatsCollectorEnabled = new SparseBooleanArray();
+ private final WifiPowerStatsCollector.WifiStatsRetriever mWifiStatsRetriever =
+ new WifiPowerStatsCollector.WifiStatsRetriever() {
+ @Override
+ public void retrieveWifiScanTimes(Callback callback) {
+ synchronized (BatteryStatsImpl.this) {
+ retrieveWifiScanTimesLocked(callback);
+ }
+ }
+
+ @Override
+ public long getWifiActiveDuration() {
+ synchronized (BatteryStatsImpl.this) {
+ return getGlobalWifiRunningTime(mClock.elapsedRealtime() * 1000,
+ STATS_SINCE_CHARGED) / 1000;
+ }
+ }
+ };
public LongSparseArray<SamplingTimer> getKernelMemoryStats() {
return mKernelMemoryStats;
@@ -501,6 +520,8 @@
TimeUnit.MINUTES.toMillis(1));
setPowerStatsThrottlePeriodMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
TimeUnit.HOURS.toMillis(1));
+ setPowerStatsThrottlePeriodMillis(BatteryConsumer.POWER_COMPONENT_WIFI,
+ TimeUnit.HOURS.toMillis(1));
}
/**
@@ -1885,11 +1906,12 @@
}
private class PowerStatsCollectorInjector implements CpuPowerStatsCollector.Injector,
- MobileRadioPowerStatsCollector.Injector {
+ MobileRadioPowerStatsCollector.Injector, WifiPowerStatsCollector.Injector {
private PackageManager mPackageManager;
private PowerStatsCollector.ConsumedEnergyRetriever mConsumedEnergyRetriever;
private NetworkStatsManager mNetworkStatsManager;
private TelephonyManager mTelephonyManager;
+ private WifiManager mWifiManager;
void setContext(Context context) {
mPackageManager = context.getPackageManager();
@@ -1897,6 +1919,7 @@
LocalServices.getService(PowerStatsInternal.class));
mNetworkStatsManager = context.getSystemService(NetworkStatsManager.class);
mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ mWifiManager = context.getSystemService(WifiManager.class);
}
@Override
@@ -1950,11 +1973,26 @@
}
@Override
+ public Supplier<NetworkStats> getWifiNetworkStatsSupplier() {
+ return () -> readWifiNetworkStatsLocked(mNetworkStatsManager);
+ }
+
+ @Override
+ public WifiPowerStatsCollector.WifiStatsRetriever getWifiStatsRetriever() {
+ return mWifiStatsRetriever;
+ }
+
+ @Override
public TelephonyManager getTelephonyManager() {
return mTelephonyManager;
}
@Override
+ public WifiManager getWifiManager() {
+ return mWifiManager;
+ }
+
+ @Override
public LongSupplier getCallDurationSupplier() {
return () -> mPhoneOnTimer.getTotalTimeLocked(mClock.elapsedRealtime() * 1000,
STATS_SINCE_CHARGED);
@@ -6354,7 +6392,11 @@
HistoryItem.STATE2_WIFI_ON_FLAG);
mWifiOn = true;
mWifiOnTimer.startRunningLocked(elapsedRealtimeMs);
- scheduleSyncExternalStatsLocked("wifi-off", ExternalStatsSync.UPDATE_WIFI);
+ if (mWifiPowerStatsCollector.isEnabled()) {
+ mWifiPowerStatsCollector.schedule();
+ } else {
+ scheduleSyncExternalStatsLocked("wifi-off", ExternalStatsSync.UPDATE_WIFI);
+ }
}
}
@@ -6365,7 +6407,11 @@
HistoryItem.STATE2_WIFI_ON_FLAG);
mWifiOn = false;
mWifiOnTimer.stopRunningLocked(elapsedRealtimeMs);
- scheduleSyncExternalStatsLocked("wifi-on", ExternalStatsSync.UPDATE_WIFI);
+ if (mWifiPowerStatsCollector.isEnabled()) {
+ mWifiPowerStatsCollector.schedule();
+ } else {
+ scheduleSyncExternalStatsLocked("wifi-on", ExternalStatsSync.UPDATE_WIFI);
+ }
}
}
@@ -6757,8 +6803,11 @@
.noteWifiRunningLocked(elapsedRealtimeMs);
}
}
-
- scheduleSyncExternalStatsLocked("wifi-running", ExternalStatsSync.UPDATE_WIFI);
+ if (mWifiPowerStatsCollector.isEnabled()) {
+ mWifiPowerStatsCollector.schedule();
+ } else {
+ scheduleSyncExternalStatsLocked("wifi-running", ExternalStatsSync.UPDATE_WIFI);
+ }
} else {
Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running");
}
@@ -6827,7 +6876,11 @@
}
}
- scheduleSyncExternalStatsLocked("wifi-stopped", ExternalStatsSync.UPDATE_WIFI);
+ if (mWifiPowerStatsCollector.isEnabled()) {
+ mWifiPowerStatsCollector.schedule();
+ } else {
+ scheduleSyncExternalStatsLocked("wifi-stopped", ExternalStatsSync.UPDATE_WIFI);
+ }
} else {
Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running");
}
@@ -6842,7 +6895,11 @@
}
mWifiState = wifiState;
mWifiStateTimer[wifiState].startRunningLocked(elapsedRealtimeMs);
- scheduleSyncExternalStatsLocked("wifi-state", ExternalStatsSync.UPDATE_WIFI);
+ if (mWifiPowerStatsCollector.isEnabled()) {
+ mWifiPowerStatsCollector.schedule();
+ } else {
+ scheduleSyncExternalStatsLocked("wifi-state", ExternalStatsSync.UPDATE_WIFI);
+ }
}
}
@@ -6965,6 +7022,25 @@
.noteWifiBatchedScanStoppedLocked(elapsedRealtimeMs);
}
+ private void retrieveWifiScanTimesLocked(
+ WifiPowerStatsCollector.WifiStatsRetriever.Callback callback) {
+ long elapsedTimeUs = mClock.elapsedRealtime() * 1000;
+ for (int i = mUidStats.size() - 1; i >= 0; i--) {
+ int uid = mUidStats.keyAt(i);
+ Uid uidStats = mUidStats.valueAt(i);
+ long scanTimeUs = uidStats.getWifiScanTime(elapsedTimeUs, STATS_SINCE_CHARGED);
+ long batchScanTimeUs = 0;
+ for (int bucket = 0; bucket < NUM_WIFI_BATCHED_SCAN_BINS; bucket++) {
+ batchScanTimeUs += uidStats.getWifiBatchedScanTime(bucket, elapsedTimeUs,
+ STATS_SINCE_CHARGED);
+ }
+ if (scanTimeUs != 0 || batchScanTimeUs != 0) {
+ callback.onWifiScanTime(uid, (scanTimeUs + 500) / 1000,
+ (batchScanTimeUs + 500) / 1000);
+ }
+ }
+ }
+
private int mWifiMulticastNesting = 0;
@GuardedBy("this")
@@ -11101,6 +11177,11 @@
BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO));
mMobileRadioPowerStatsCollector.addConsumer(this::recordPowerStats);
+ mWifiPowerStatsCollector = new WifiPowerStatsCollector(
+ mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod(
+ BatteryConsumer.POWER_COMPONENT_WIFI));
+ mWifiPowerStatsCollector.addConsumer(this::recordPowerStats);
+
mStartCount++;
initTimersAndCounters();
mOnBattery = mOnBatteryInternal = false;
@@ -12095,10 +12176,10 @@
}
}
if (lastEntry != null) {
- delta.mRxBytes = entry.getRxBytes() - lastEntry.getRxBytes();
- delta.mRxPackets = entry.getRxPackets() - lastEntry.getRxPackets();
- delta.mTxBytes = entry.getTxBytes() - lastEntry.getTxBytes();
- delta.mTxPackets = entry.getTxPackets() - lastEntry.getTxPackets();
+ delta.mRxBytes = Math.max(0, entry.getRxBytes() - lastEntry.getRxBytes());
+ delta.mRxPackets = Math.max(0, entry.getRxPackets() - lastEntry.getRxPackets());
+ delta.mTxBytes = Math.max(0, entry.getTxBytes() - lastEntry.getTxBytes());
+ delta.mTxPackets = Math.max(0, entry.getTxPackets() - lastEntry.getTxPackets());
} else {
delta.mRxBytes = entry.getRxBytes();
delta.mRxPackets = entry.getRxPackets();
@@ -12119,6 +12200,10 @@
public void updateWifiState(@Nullable final WifiActivityEnergyInfo info,
final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs,
@NonNull NetworkStatsManager networkStatsManager) {
+ if (mWifiPowerStatsCollector.isEnabled()) {
+ return;
+ }
+
if (DEBUG_ENERGY) {
synchronized (mWifiNetworkLock) {
Slog.d(TAG, "Updating wifi stats: " + Arrays.toString(mWifiIfaces));
@@ -14507,6 +14592,10 @@
mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO));
mMobileRadioPowerStatsCollector.schedule();
+ mWifiPowerStatsCollector.setEnabled(
+ mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_WIFI));
+ mWifiPowerStatsCollector.schedule();
+
mSystemReady = true;
}
@@ -14521,6 +14610,8 @@
return mCpuPowerStatsCollector;
case BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO:
return mMobileRadioPowerStatsCollector;
+ case BatteryConsumer.POWER_COMPONENT_WIFI:
+ return mWifiPowerStatsCollector;
}
return null;
}
@@ -16056,6 +16147,7 @@
public void schedulePowerStatsSampleCollection() {
mCpuPowerStatsCollector.forceSchedule();
mMobileRadioPowerStatsCollector.forceSchedule();
+ mWifiPowerStatsCollector.forceSchedule();
}
/**
@@ -16074,6 +16166,7 @@
public void dumpStatsSample(PrintWriter pw) {
mCpuPowerStatsCollector.collectAndDump(pw);
mMobileRadioPowerStatsCollector.collectAndDump(pw);
+ mWifiPowerStatsCollector.collectAndDump(pw);
}
private final Runnable mWriteAsyncRunnable = () -> {
diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
index 97f0986..0d5eabc 100644
--- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
+++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
@@ -87,7 +87,9 @@
mPowerCalculators.add(new PhonePowerCalculator(mPowerProfile));
}
}
- mPowerCalculators.add(new WifiPowerCalculator(mPowerProfile));
+ if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_WIFI)) {
+ mPowerCalculators.add(new WifiPowerCalculator(mPowerProfile));
+ }
mPowerCalculators.add(new BluetoothPowerCalculator(mPowerProfile));
mPowerCalculators.add(new SensorPowerCalculator(
mContext.getSystemService(SensorManager.class)));
diff --git a/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java
new file mode 100644
index 0000000..6321053
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java
@@ -0,0 +1,328 @@
+/*
+ * 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.stats;
+
+import android.content.pm.PackageManager;
+import android.hardware.power.stats.EnergyConsumerType;
+import android.net.NetworkStats;
+import android.net.wifi.WifiManager;
+import android.os.BatteryConsumer;
+import android.os.Handler;
+import android.os.PersistableBundle;
+import android.os.connectivity.WifiActivityEnergyInfo;
+import android.util.Slog;
+import android.util.SparseArray;
+
+import com.android.internal.os.Clock;
+import com.android.internal.os.PowerStats;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.IntSupplier;
+import java.util.function.Supplier;
+
+public class WifiPowerStatsCollector extends PowerStatsCollector {
+ private static final String TAG = "WifiPowerStatsCollector";
+
+ private static final long WIFI_ACTIVITY_REQUEST_TIMEOUT = 20000;
+
+ private static final long ENERGY_UNSPECIFIED = -1;
+
+ interface WifiStatsRetriever {
+ interface Callback {
+ void onWifiScanTime(int uid, long scanTimeMs, long batchScanTimeMs);
+ }
+
+ void retrieveWifiScanTimes(Callback callback);
+ long getWifiActiveDuration();
+ }
+
+ interface Injector {
+ Handler getHandler();
+ Clock getClock();
+ PowerStatsUidResolver getUidResolver();
+ PackageManager getPackageManager();
+ ConsumedEnergyRetriever getConsumedEnergyRetriever();
+ IntSupplier getVoltageSupplier();
+ Supplier<NetworkStats> getWifiNetworkStatsSupplier();
+ WifiManager getWifiManager();
+ WifiStatsRetriever getWifiStatsRetriever();
+ }
+
+ private final Injector mInjector;
+
+ private WifiPowerStatsLayout mLayout;
+ private boolean mIsInitialized;
+ private boolean mPowerReportingSupported;
+
+ private PowerStats mPowerStats;
+ private long[] mDeviceStats;
+ private volatile WifiManager mWifiManager;
+ private volatile Supplier<NetworkStats> mNetworkStatsSupplier;
+ private volatile WifiStatsRetriever mWifiStatsRetriever;
+ private ConsumedEnergyRetriever mConsumedEnergyRetriever;
+ private IntSupplier mVoltageSupplier;
+ private int[] mEnergyConsumerIds = new int[0];
+ private WifiActivityEnergyInfo mLastWifiActivityInfo =
+ new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
+ private NetworkStats mLastNetworkStats;
+ private long[] mLastConsumedEnergyUws;
+ private int mLastVoltageMv;
+
+ private static class WifiScanTimes {
+ public long basicScanTimeMs;
+ public long batchedScanTimeMs;
+ }
+ private final WifiScanTimes mScanTimes = new WifiScanTimes();
+ private final SparseArray<WifiScanTimes> mLastScanTimes = new SparseArray<>();
+ private long mLastWifiActiveDuration;
+
+ public WifiPowerStatsCollector(Injector injector, long throttlePeriodMs) {
+ super(injector.getHandler(), throttlePeriodMs, injector.getUidResolver(),
+ injector.getClock());
+ mInjector = injector;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ if (enabled) {
+ PackageManager packageManager = mInjector.getPackageManager();
+ super.setEnabled(packageManager != null
+ && packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI));
+ } else {
+ super.setEnabled(false);
+ }
+ }
+
+ private boolean ensureInitialized() {
+ if (mIsInitialized) {
+ return true;
+ }
+
+ if (!isEnabled()) {
+ return false;
+ }
+
+ mConsumedEnergyRetriever = mInjector.getConsumedEnergyRetriever();
+ mVoltageSupplier = mInjector.getVoltageSupplier();
+ mWifiManager = mInjector.getWifiManager();
+ mNetworkStatsSupplier = mInjector.getWifiNetworkStatsSupplier();
+ mWifiStatsRetriever = mInjector.getWifiStatsRetriever();
+ mPowerReportingSupported =
+ mWifiManager != null && mWifiManager.isEnhancedPowerReportingSupported();
+
+ mEnergyConsumerIds = mConsumedEnergyRetriever.getEnergyConsumerIds(EnergyConsumerType.WIFI);
+ mLastConsumedEnergyUws = new long[mEnergyConsumerIds.length];
+ Arrays.fill(mLastConsumedEnergyUws, ENERGY_UNSPECIFIED);
+
+ mLayout = new WifiPowerStatsLayout();
+ mLayout.addDeviceWifiActivity(mPowerReportingSupported);
+ mLayout.addDeviceSectionEnergyConsumers(mEnergyConsumerIds.length);
+ mLayout.addUidNetworkStats();
+ mLayout.addDeviceSectionUsageDuration();
+ mLayout.addDeviceSectionPowerEstimate();
+ mLayout.addUidSectionPowerEstimate();
+
+ PersistableBundle extras = new PersistableBundle();
+ mLayout.toExtras(extras);
+ PowerStats.Descriptor powerStatsDescriptor = new PowerStats.Descriptor(
+ BatteryConsumer.POWER_COMPONENT_WIFI, mLayout.getDeviceStatsArrayLength(),
+ null, 0, mLayout.getUidStatsArrayLength(),
+ extras);
+ mPowerStats = new PowerStats(powerStatsDescriptor);
+ mDeviceStats = mPowerStats.stats;
+
+ mIsInitialized = true;
+ return true;
+ }
+
+ @Override
+ protected PowerStats collectStats() {
+ if (!ensureInitialized()) {
+ return null;
+ }
+
+ if (mPowerReportingSupported) {
+ collectWifiActivityInfo();
+ } else {
+ collectWifiActivityStats();
+ }
+ collectNetworkStats();
+ collectWifiScanTime();
+
+ if (mEnergyConsumerIds.length != 0) {
+ collectEnergyConsumers();
+ }
+
+ return mPowerStats;
+ }
+
+ private void collectWifiActivityInfo() {
+ CompletableFuture<WifiActivityEnergyInfo> immediateFuture = new CompletableFuture<>();
+ mWifiManager.getWifiActivityEnergyInfoAsync(Runnable::run,
+ immediateFuture::complete);
+
+ WifiActivityEnergyInfo activityInfo;
+ try {
+ activityInfo = immediateFuture.get(WIFI_ACTIVITY_REQUEST_TIMEOUT,
+ TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ Slog.e(TAG, "Cannot acquire WifiActivityEnergyInfo", e);
+ activityInfo = null;
+ }
+
+ if (activityInfo == null) {
+ return;
+ }
+
+ long rxDuration = activityInfo.getControllerRxDurationMillis()
+ - mLastWifiActivityInfo.getControllerRxDurationMillis();
+ long txDuration = activityInfo.getControllerTxDurationMillis()
+ - mLastWifiActivityInfo.getControllerTxDurationMillis();
+ long scanDuration = activityInfo.getControllerScanDurationMillis()
+ - mLastWifiActivityInfo.getControllerScanDurationMillis();
+ long idleDuration = activityInfo.getControllerIdleDurationMillis()
+ - mLastWifiActivityInfo.getControllerIdleDurationMillis();
+
+ mLayout.setDeviceRxTime(mDeviceStats, rxDuration);
+ mLayout.setDeviceTxTime(mDeviceStats, txDuration);
+ mLayout.setDeviceScanTime(mDeviceStats, scanDuration);
+ mLayout.setDeviceIdleTime(mDeviceStats, idleDuration);
+
+ mPowerStats.durationMs = rxDuration + txDuration + scanDuration + idleDuration;
+
+ mLastWifiActivityInfo = activityInfo;
+ }
+
+ private void collectWifiActivityStats() {
+ long duration = mWifiStatsRetriever.getWifiActiveDuration();
+ mLayout.setDeviceActiveTime(mDeviceStats, Math.max(0, duration - mLastWifiActiveDuration));
+ mLastWifiActiveDuration = duration;
+ mPowerStats.durationMs = duration;
+ }
+
+ private void collectNetworkStats() {
+ mPowerStats.uidStats.clear();
+
+ NetworkStats networkStats = mNetworkStatsSupplier.get();
+ if (networkStats == null) {
+ return;
+ }
+
+ List<BatteryStatsImpl.NetworkStatsDelta> delta =
+ BatteryStatsImpl.computeDelta(networkStats, mLastNetworkStats);
+ mLastNetworkStats = networkStats;
+ for (int i = delta.size() - 1; i >= 0; i--) {
+ BatteryStatsImpl.NetworkStatsDelta uidDelta = delta.get(i);
+ long rxBytes = uidDelta.getRxBytes();
+ long txBytes = uidDelta.getTxBytes();
+ long rxPackets = uidDelta.getRxPackets();
+ long txPackets = uidDelta.getTxPackets();
+ if (rxBytes == 0 && txBytes == 0 && rxPackets == 0 && txPackets == 0) {
+ continue;
+ }
+
+ int uid = mUidResolver.mapUid(uidDelta.getUid());
+ long[] stats = mPowerStats.uidStats.get(uid);
+ if (stats == null) {
+ stats = new long[mLayout.getUidStatsArrayLength()];
+ mPowerStats.uidStats.put(uid, stats);
+ mLayout.setUidRxBytes(stats, rxBytes);
+ mLayout.setUidTxBytes(stats, txBytes);
+ mLayout.setUidRxPackets(stats, rxPackets);
+ mLayout.setUidTxPackets(stats, txPackets);
+ } else {
+ mLayout.setUidRxBytes(stats, mLayout.getUidRxBytes(stats) + rxBytes);
+ mLayout.setUidTxBytes(stats, mLayout.getUidTxBytes(stats) + txBytes);
+ mLayout.setUidRxPackets(stats, mLayout.getUidRxPackets(stats) + rxPackets);
+ mLayout.setUidTxPackets(stats, mLayout.getUidTxPackets(stats) + txPackets);
+ }
+ }
+ }
+
+ private void collectWifiScanTime() {
+ mScanTimes.basicScanTimeMs = 0;
+ mScanTimes.batchedScanTimeMs = 0;
+ mWifiStatsRetriever.retrieveWifiScanTimes((uid, scanTimeMs, batchScanTimeMs) -> {
+ WifiScanTimes lastScanTimes = mLastScanTimes.get(uid);
+ if (lastScanTimes == null) {
+ lastScanTimes = new WifiScanTimes();
+ mLastScanTimes.put(uid, lastScanTimes);
+ }
+
+ long scanTimeDelta = Math.max(0, scanTimeMs - lastScanTimes.basicScanTimeMs);
+ long batchScanTimeDelta = Math.max(0,
+ batchScanTimeMs - lastScanTimes.batchedScanTimeMs);
+ if (scanTimeDelta != 0 || batchScanTimeDelta != 0) {
+ mScanTimes.basicScanTimeMs += scanTimeDelta;
+ mScanTimes.batchedScanTimeMs += batchScanTimeDelta;
+ uid = mUidResolver.mapUid(uid);
+ long[] stats = mPowerStats.uidStats.get(uid);
+ if (stats == null) {
+ stats = new long[mLayout.getUidStatsArrayLength()];
+ mPowerStats.uidStats.put(uid, stats);
+ mLayout.setUidScanTime(stats, scanTimeDelta);
+ mLayout.setUidBatchScanTime(stats, batchScanTimeDelta);
+ } else {
+ mLayout.setUidScanTime(stats, mLayout.getUidScanTime(stats) + scanTimeDelta);
+ mLayout.setUidBatchScanTime(stats,
+ mLayout.getUidBatchedScanTime(stats) + batchScanTimeDelta);
+ }
+ }
+ lastScanTimes.basicScanTimeMs = scanTimeMs;
+ lastScanTimes.batchedScanTimeMs = batchScanTimeMs;
+ });
+
+ mLayout.setDeviceBasicScanTime(mDeviceStats, mScanTimes.basicScanTimeMs);
+ mLayout.setDeviceBatchedScanTime(mDeviceStats, mScanTimes.batchedScanTimeMs);
+ }
+
+ private void collectEnergyConsumers() {
+ int voltageMv = mVoltageSupplier.getAsInt();
+ if (voltageMv <= 0) {
+ Slog.wtf(TAG, "Unexpected battery voltage (" + voltageMv
+ + " mV) when querying energy consumers");
+ return;
+ }
+
+ int averageVoltage = mLastVoltageMv != 0 ? (mLastVoltageMv + voltageMv) / 2 : voltageMv;
+ mLastVoltageMv = voltageMv;
+
+ long[] energyUws = mConsumedEnergyRetriever.getConsumedEnergyUws(mEnergyConsumerIds);
+ if (energyUws == null) {
+ return;
+ }
+
+ for (int i = energyUws.length - 1; i >= 0; i--) {
+ long energyDelta = mLastConsumedEnergyUws[i] != ENERGY_UNSPECIFIED
+ ? energyUws[i] - mLastConsumedEnergyUws[i] : 0;
+ if (energyDelta < 0) {
+ // Likely, restart of powerstats HAL
+ energyDelta = 0;
+ }
+ mLayout.setConsumedEnergy(mPowerStats.stats, i, uJtoUc(energyDelta, averageVoltage));
+ mLastConsumedEnergyUws[i] = energyUws[i];
+ }
+ }
+
+ @Override
+ protected void onUidRemoved(int uid) {
+ super.onUidRemoved(uid);
+ mLastScanTimes.remove(uid);
+ }
+}
diff --git a/services/core/java/com/android/server/power/stats/WifiPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/WifiPowerStatsLayout.java
new file mode 100644
index 0000000..0fa6ec6
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/WifiPowerStatsLayout.java
@@ -0,0 +1,241 @@
+/*
+ * 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.stats;
+
+import android.annotation.NonNull;
+import android.os.PersistableBundle;
+
+import com.android.internal.os.PowerStats;
+
+public class WifiPowerStatsLayout extends PowerStatsLayout {
+ private static final String TAG = "WifiPowerStatsLayout";
+ private static final int UNSPECIFIED = -1;
+ private static final String EXTRA_POWER_REPORTING_SUPPORTED = "prs";
+ private static final String EXTRA_DEVICE_RX_TIME_POSITION = "dt-rx";
+ private static final String EXTRA_DEVICE_TX_TIME_POSITION = "dt-tx";
+ private static final String EXTRA_DEVICE_SCAN_TIME_POSITION = "dt-scan";
+ private static final String EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION = "dt-basic-scan";
+ private static final String EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION = "dt-batch-scan";
+ private static final String EXTRA_DEVICE_IDLE_TIME_POSITION = "dt-idle";
+ private static final String EXTRA_DEVICE_ACTIVE_TIME_POSITION = "dt-on";
+ private static final String EXTRA_UID_RX_BYTES_POSITION = "urxb";
+ private static final String EXTRA_UID_TX_BYTES_POSITION = "utxb";
+ private static final String EXTRA_UID_RX_PACKETS_POSITION = "urxp";
+ private static final String EXTRA_UID_TX_PACKETS_POSITION = "utxp";
+ private static final String EXTRA_UID_SCAN_TIME_POSITION = "ut-scan";
+ private static final String EXTRA_UID_BATCH_SCAN_TIME_POSITION = "ut-bscan";
+
+ private boolean mPowerReportingSupported;
+ private int mDeviceRxTimePosition;
+ private int mDeviceTxTimePosition;
+ private int mDeviceIdleTimePosition;
+ private int mDeviceScanTimePosition;
+ private int mDeviceBasicScanTimePosition;
+ private int mDeviceBatchedScanTimePosition;
+ private int mDeviceActiveTimePosition;
+ private int mUidRxBytesPosition;
+ private int mUidTxBytesPosition;
+ private int mUidRxPacketsPosition;
+ private int mUidTxPacketsPosition;
+ private int mUidScanTimePosition;
+ private int mUidBatchScanTimePosition;
+
+ WifiPowerStatsLayout() {
+ }
+
+ WifiPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) {
+ super(descriptor);
+ }
+
+ void addDeviceWifiActivity(boolean powerReportingSupported) {
+ mPowerReportingSupported = powerReportingSupported;
+ if (mPowerReportingSupported) {
+ mDeviceActiveTimePosition = UNSPECIFIED;
+ mDeviceRxTimePosition = addDeviceSection(1);
+ mDeviceTxTimePosition = addDeviceSection(1);
+ mDeviceIdleTimePosition = addDeviceSection(1);
+ mDeviceScanTimePosition = addDeviceSection(1);
+ } else {
+ mDeviceActiveTimePosition = addDeviceSection(1);
+ mDeviceRxTimePosition = UNSPECIFIED;
+ mDeviceTxTimePosition = UNSPECIFIED;
+ mDeviceIdleTimePosition = UNSPECIFIED;
+ mDeviceScanTimePosition = UNSPECIFIED;
+ }
+ mDeviceBasicScanTimePosition = addDeviceSection(1);
+ mDeviceBatchedScanTimePosition = addDeviceSection(1);
+ }
+
+ void addUidNetworkStats() {
+ mUidRxBytesPosition = addUidSection(1);
+ mUidTxBytesPosition = addUidSection(1);
+ mUidRxPacketsPosition = addUidSection(1);
+ mUidTxPacketsPosition = addUidSection(1);
+ mUidScanTimePosition = addUidSection(1);
+ mUidBatchScanTimePosition = addUidSection(1);
+ }
+
+ public boolean isPowerReportingSupported() {
+ return mPowerReportingSupported;
+ }
+
+ public void setDeviceRxTime(long[] stats, long durationMillis) {
+ stats[mDeviceRxTimePosition] = durationMillis;
+ }
+
+ public long getDeviceRxTime(long[] stats) {
+ return stats[mDeviceRxTimePosition];
+ }
+
+ public void setDeviceTxTime(long[] stats, long durationMillis) {
+ stats[mDeviceTxTimePosition] = durationMillis;
+ }
+
+ public long getDeviceTxTime(long[] stats) {
+ return stats[mDeviceTxTimePosition];
+ }
+
+ public void setDeviceScanTime(long[] stats, long durationMillis) {
+ stats[mDeviceScanTimePosition] = durationMillis;
+ }
+
+ public long getDeviceScanTime(long[] stats) {
+ return stats[mDeviceScanTimePosition];
+ }
+
+ public void setDeviceBasicScanTime(long[] stats, long durationMillis) {
+ stats[mDeviceBasicScanTimePosition] = durationMillis;
+ }
+
+ public long getDeviceBasicScanTime(long[] stats) {
+ return stats[mDeviceBasicScanTimePosition];
+ }
+
+ public void setDeviceBatchedScanTime(long[] stats, long durationMillis) {
+ stats[mDeviceBatchedScanTimePosition] = durationMillis;
+ }
+
+ public long getDeviceBatchedScanTime(long[] stats) {
+ return stats[mDeviceBatchedScanTimePosition];
+ }
+
+ public void setDeviceIdleTime(long[] stats, long durationMillis) {
+ stats[mDeviceIdleTimePosition] = durationMillis;
+ }
+
+ public long getDeviceIdleTime(long[] stats) {
+ return stats[mDeviceIdleTimePosition];
+ }
+
+ public void setDeviceActiveTime(long[] stats, long durationMillis) {
+ stats[mDeviceActiveTimePosition] = durationMillis;
+ }
+
+ public long getDeviceActiveTime(long[] stats) {
+ return stats[mDeviceActiveTimePosition];
+ }
+
+ public void setUidRxBytes(long[] stats, long count) {
+ stats[mUidRxBytesPosition] = count;
+ }
+
+ public long getUidRxBytes(long[] stats) {
+ return stats[mUidRxBytesPosition];
+ }
+
+ public void setUidTxBytes(long[] stats, long count) {
+ stats[mUidTxBytesPosition] = count;
+ }
+
+ public long getUidTxBytes(long[] stats) {
+ return stats[mUidTxBytesPosition];
+ }
+
+ public void setUidRxPackets(long[] stats, long count) {
+ stats[mUidRxPacketsPosition] = count;
+ }
+
+ public long getUidRxPackets(long[] stats) {
+ return stats[mUidRxPacketsPosition];
+ }
+
+ public void setUidTxPackets(long[] stats, long count) {
+ stats[mUidTxPacketsPosition] = count;
+ }
+
+ public long getUidTxPackets(long[] stats) {
+ return stats[mUidTxPacketsPosition];
+ }
+
+ public void setUidScanTime(long[] stats, long count) {
+ stats[mUidScanTimePosition] = count;
+ }
+
+ public long getUidScanTime(long[] stats) {
+ return stats[mUidScanTimePosition];
+ }
+
+ public void setUidBatchScanTime(long[] stats, long count) {
+ stats[mUidBatchScanTimePosition] = count;
+ }
+
+ public long getUidBatchedScanTime(long[] stats) {
+ return stats[mUidBatchScanTimePosition];
+ }
+
+ /**
+ * Copies the elements of the stats array layout into <code>extras</code>
+ */
+ public void toExtras(PersistableBundle extras) {
+ super.toExtras(extras);
+ extras.putBoolean(EXTRA_POWER_REPORTING_SUPPORTED, mPowerReportingSupported);
+ extras.putInt(EXTRA_DEVICE_RX_TIME_POSITION, mDeviceRxTimePosition);
+ extras.putInt(EXTRA_DEVICE_TX_TIME_POSITION, mDeviceTxTimePosition);
+ extras.putInt(EXTRA_DEVICE_SCAN_TIME_POSITION, mDeviceScanTimePosition);
+ extras.putInt(EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION, mDeviceBasicScanTimePosition);
+ extras.putInt(EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION, mDeviceBatchedScanTimePosition);
+ extras.putInt(EXTRA_DEVICE_IDLE_TIME_POSITION, mDeviceIdleTimePosition);
+ extras.putInt(EXTRA_DEVICE_ACTIVE_TIME_POSITION, mDeviceActiveTimePosition);
+ extras.putInt(EXTRA_UID_RX_BYTES_POSITION, mUidRxBytesPosition);
+ extras.putInt(EXTRA_UID_TX_BYTES_POSITION, mUidTxBytesPosition);
+ extras.putInt(EXTRA_UID_RX_PACKETS_POSITION, mUidRxPacketsPosition);
+ extras.putInt(EXTRA_UID_TX_PACKETS_POSITION, mUidTxPacketsPosition);
+ extras.putInt(EXTRA_UID_SCAN_TIME_POSITION, mUidScanTimePosition);
+ extras.putInt(EXTRA_UID_BATCH_SCAN_TIME_POSITION, mUidBatchScanTimePosition);
+ }
+
+ /**
+ * Retrieves elements of the stats array layout from <code>extras</code>
+ */
+ public void fromExtras(PersistableBundle extras) {
+ super.fromExtras(extras);
+ mPowerReportingSupported = extras.getBoolean(EXTRA_POWER_REPORTING_SUPPORTED);
+ mDeviceRxTimePosition = extras.getInt(EXTRA_DEVICE_RX_TIME_POSITION);
+ mDeviceTxTimePosition = extras.getInt(EXTRA_DEVICE_TX_TIME_POSITION);
+ mDeviceScanTimePosition = extras.getInt(EXTRA_DEVICE_SCAN_TIME_POSITION);
+ mDeviceBasicScanTimePosition = extras.getInt(EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION);
+ mDeviceBatchedScanTimePosition = extras.getInt(EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION);
+ mDeviceIdleTimePosition = extras.getInt(EXTRA_DEVICE_IDLE_TIME_POSITION);
+ mDeviceActiveTimePosition = extras.getInt(EXTRA_DEVICE_ACTIVE_TIME_POSITION);
+ mUidRxBytesPosition = extras.getInt(EXTRA_UID_RX_BYTES_POSITION);
+ mUidTxBytesPosition = extras.getInt(EXTRA_UID_TX_BYTES_POSITION);
+ mUidRxPacketsPosition = extras.getInt(EXTRA_UID_RX_PACKETS_POSITION);
+ mUidTxPacketsPosition = extras.getInt(EXTRA_UID_TX_PACKETS_POSITION);
+ mUidScanTimePosition = extras.getInt(EXTRA_UID_SCAN_TIME_POSITION);
+ mUidBatchScanTimePosition = extras.getInt(EXTRA_UID_BATCH_SCAN_TIME_POSITION);
+ }
+}
diff --git a/services/core/java/com/android/server/power/stats/WifiPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/WifiPowerStatsProcessor.java
new file mode 100644
index 0000000..5e9cc40
--- /dev/null
+++ b/services/core/java/com/android/server/power/stats/WifiPowerStatsProcessor.java
@@ -0,0 +1,425 @@
+/*
+ * 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.stats;
+
+import android.util.Slog;
+
+import com.android.internal.os.PowerProfile;
+import com.android.internal.os.PowerStats;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class WifiPowerStatsProcessor extends PowerStatsProcessor {
+ private static final String TAG = "WifiPowerStatsProcessor";
+ private static final boolean DEBUG = false;
+
+ private final UsageBasedPowerEstimator mRxPowerEstimator;
+ private final UsageBasedPowerEstimator mTxPowerEstimator;
+ private final UsageBasedPowerEstimator mIdlePowerEstimator;
+
+ private final UsageBasedPowerEstimator mActivePowerEstimator;
+ private final UsageBasedPowerEstimator mScanPowerEstimator;
+ private final UsageBasedPowerEstimator mBatchedScanPowerEstimator;
+
+ private PowerStats.Descriptor mLastUsedDescriptor;
+ private WifiPowerStatsLayout mStatsLayout;
+ // Sequence of steps for power estimation and intermediate results.
+ private PowerEstimationPlan mPlan;
+
+ private long[] mTmpDeviceStatsArray;
+ private long[] mTmpUidStatsArray;
+ private boolean mHasWifiPowerController;
+
+ public WifiPowerStatsProcessor(PowerProfile powerProfile) {
+ mRxPowerEstimator = new UsageBasedPowerEstimator(
+ powerProfile.getAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_RX));
+ mTxPowerEstimator = new UsageBasedPowerEstimator(
+ powerProfile.getAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_TX));
+ mIdlePowerEstimator = new UsageBasedPowerEstimator(
+ powerProfile.getAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_IDLE));
+ mActivePowerEstimator = new UsageBasedPowerEstimator(
+ powerProfile.getAveragePower(PowerProfile.POWER_WIFI_ACTIVE));
+ mScanPowerEstimator = new UsageBasedPowerEstimator(
+ powerProfile.getAveragePower(PowerProfile.POWER_WIFI_SCAN));
+ mBatchedScanPowerEstimator = new UsageBasedPowerEstimator(
+ powerProfile.getAveragePower(PowerProfile.POWER_WIFI_BATCHED_SCAN));
+ }
+
+ private static class Intermediates {
+ /**
+ * Estimated power for the RX state.
+ */
+ public double rxPower;
+ /**
+ * Estimated power for the TX state.
+ */
+ public double txPower;
+ /**
+ * Estimated power in the SCAN state
+ */
+ public double scanPower;
+ /**
+ * Estimated power for IDLE, SCAN states.
+ */
+ public double idlePower;
+ /**
+ * Number of received packets
+ */
+ public long rxPackets;
+ /**
+ * Number of transmitted packets
+ */
+ public long txPackets;
+ /**
+ * Total duration of unbatched scans across all UIDs.
+ */
+ public long basicScanDuration;
+ /**
+ * Estimated power in the unbatched SCAN state
+ */
+ public double basicScanPower;
+ /**
+ * Total duration of batched scans across all UIDs.
+ */
+ public long batchedScanDuration;
+ /**
+ * Estimated power in the BATCHED SCAN state
+ */
+ public double batchedScanPower;
+ /**
+ * Estimated total power when active; used only in the absence of WiFiManager power
+ * reporting.
+ */
+ public double activePower;
+ /**
+ * Measured consumed energy from power monitoring hardware (micro-coulombs)
+ */
+ public long consumedEnergy;
+ }
+
+ @Override
+ void finish(PowerComponentAggregatedPowerStats stats) {
+ if (stats.getPowerStatsDescriptor() == null) {
+ return;
+ }
+
+ unpackPowerStatsDescriptor(stats.getPowerStatsDescriptor());
+
+ if (mPlan == null) {
+ mPlan = new PowerEstimationPlan(stats.getConfig());
+ }
+
+ for (int i = mPlan.deviceStateEstimations.size() - 1; i >= 0; i--) {
+ DeviceStateEstimation estimation = mPlan.deviceStateEstimations.get(i);
+ Intermediates intermediates = new Intermediates();
+ estimation.intermediates = intermediates;
+ computeDevicePowerEstimates(stats, estimation.stateValues, intermediates);
+ }
+
+ double ratio = 1.0;
+ if (mStatsLayout.getEnergyConsumerCount() != 0) {
+ ratio = computeEstimateAdjustmentRatioUsingConsumedEnergy();
+ if (ratio != 1) {
+ for (int i = mPlan.deviceStateEstimations.size() - 1; i >= 0; i--) {
+ DeviceStateEstimation estimation = mPlan.deviceStateEstimations.get(i);
+ adjustDevicePowerEstimates(stats, estimation.stateValues,
+ (Intermediates) estimation.intermediates, ratio);
+ }
+ }
+ }
+
+ combineDeviceStateEstimates();
+
+ ArrayList<Integer> uids = new ArrayList<>();
+ stats.collectUids(uids);
+ if (!uids.isEmpty()) {
+ for (int uid : uids) {
+ for (int i = 0; i < mPlan.uidStateEstimates.size(); i++) {
+ computeUidActivityTotals(stats, uid, mPlan.uidStateEstimates.get(i));
+ }
+ }
+
+ for (int uid : uids) {
+ for (int i = 0; i < mPlan.uidStateEstimates.size(); i++) {
+ computeUidPowerEstimates(stats, uid, mPlan.uidStateEstimates.get(i));
+ }
+ }
+ }
+ mPlan.resetIntermediates();
+ }
+
+ private void unpackPowerStatsDescriptor(PowerStats.Descriptor descriptor) {
+ if (descriptor.equals(mLastUsedDescriptor)) {
+ return;
+ }
+
+ mLastUsedDescriptor = descriptor;
+ mStatsLayout = new WifiPowerStatsLayout(descriptor);
+ mTmpDeviceStatsArray = new long[descriptor.statsArrayLength];
+ mTmpUidStatsArray = new long[descriptor.uidStatsArrayLength];
+ mHasWifiPowerController = mStatsLayout.isPowerReportingSupported();
+ }
+
+ /**
+ * Compute power estimates using the power profile.
+ */
+ private void computeDevicePowerEstimates(PowerComponentAggregatedPowerStats stats,
+ int[] deviceStates, Intermediates intermediates) {
+ if (!stats.getDeviceStats(mTmpDeviceStatsArray, deviceStates)) {
+ return;
+ }
+
+ for (int i = mStatsLayout.getEnergyConsumerCount() - 1; i >= 0; i--) {
+ intermediates.consumedEnergy += mStatsLayout.getConsumedEnergy(mTmpDeviceStatsArray, i);
+ }
+
+ intermediates.basicScanDuration =
+ mStatsLayout.getDeviceBasicScanTime(mTmpDeviceStatsArray);
+ intermediates.batchedScanDuration =
+ mStatsLayout.getDeviceBatchedScanTime(mTmpDeviceStatsArray);
+ if (mHasWifiPowerController) {
+ intermediates.rxPower = mRxPowerEstimator.calculatePower(
+ mStatsLayout.getDeviceRxTime(mTmpDeviceStatsArray));
+ intermediates.txPower = mTxPowerEstimator.calculatePower(
+ mStatsLayout.getDeviceTxTime(mTmpDeviceStatsArray));
+ intermediates.scanPower = mScanPowerEstimator.calculatePower(
+ mStatsLayout.getDeviceScanTime(mTmpDeviceStatsArray));
+ intermediates.idlePower = mIdlePowerEstimator.calculatePower(
+ mStatsLayout.getDeviceIdleTime(mTmpDeviceStatsArray));
+ mStatsLayout.setDevicePowerEstimate(mTmpDeviceStatsArray,
+ intermediates.rxPower + intermediates.txPower + intermediates.scanPower
+ + intermediates.idlePower);
+ } else {
+ intermediates.activePower = mActivePowerEstimator.calculatePower(
+ mStatsLayout.getDeviceActiveTime(mTmpDeviceStatsArray));
+ intermediates.basicScanPower =
+ mScanPowerEstimator.calculatePower(intermediates.basicScanDuration);
+ intermediates.batchedScanPower =
+ mBatchedScanPowerEstimator.calculatePower(intermediates.batchedScanDuration);
+ mStatsLayout.setDevicePowerEstimate(mTmpDeviceStatsArray,
+ intermediates.activePower + intermediates.basicScanPower
+ + intermediates.batchedScanPower);
+ }
+
+ stats.setDeviceStats(deviceStates, mTmpDeviceStatsArray);
+ }
+
+ /**
+ * Compute an adjustment ratio using the total power estimated using the power profile
+ * and the total power measured by hardware.
+ */
+ private double computeEstimateAdjustmentRatioUsingConsumedEnergy() {
+ long totalConsumedEnergy = 0;
+ double totalPower = 0;
+
+ for (int i = mPlan.deviceStateEstimations.size() - 1; i >= 0; i--) {
+ Intermediates intermediates =
+ (Intermediates) mPlan.deviceStateEstimations.get(i).intermediates;
+ if (mHasWifiPowerController) {
+ totalPower += intermediates.rxPower + intermediates.txPower
+ + intermediates.scanPower + intermediates.idlePower;
+ } else {
+ totalPower += intermediates.activePower + intermediates.basicScanPower
+ + intermediates.batchedScanPower;
+ }
+ totalConsumedEnergy += intermediates.consumedEnergy;
+ }
+
+ if (totalPower == 0) {
+ return 1;
+ }
+
+ return uCtoMah(totalConsumedEnergy) / totalPower;
+ }
+
+ /**
+ * Uniformly apply the same adjustment to all power estimates in order to ensure that the total
+ * estimated power matches the measured consumed power. We are not claiming that all
+ * averages captured in the power profile have to be off by the same percentage in reality.
+ */
+ private void adjustDevicePowerEstimates(PowerComponentAggregatedPowerStats stats,
+ int[] deviceStates, Intermediates intermediates, double ratio) {
+ double adjutedPower;
+ if (mHasWifiPowerController) {
+ intermediates.rxPower *= ratio;
+ intermediates.txPower *= ratio;
+ intermediates.scanPower *= ratio;
+ intermediates.idlePower *= ratio;
+ adjutedPower = intermediates.rxPower + intermediates.txPower + intermediates.scanPower
+ + intermediates.idlePower;
+ } else {
+ intermediates.activePower *= ratio;
+ intermediates.basicScanPower *= ratio;
+ intermediates.batchedScanPower *= ratio;
+ adjutedPower = intermediates.activePower + intermediates.basicScanPower
+ + intermediates.batchedScanPower;
+ }
+
+ if (!stats.getDeviceStats(mTmpDeviceStatsArray, deviceStates)) {
+ return;
+ }
+
+ mStatsLayout.setDevicePowerEstimate(mTmpDeviceStatsArray, adjutedPower);
+ stats.setDeviceStats(deviceStates, mTmpDeviceStatsArray);
+ }
+
+ /**
+ * Combine power estimates before distributing them proportionally to UIDs.
+ */
+ private void combineDeviceStateEstimates() {
+ for (int i = mPlan.combinedDeviceStateEstimations.size() - 1; i >= 0; i--) {
+ CombinedDeviceStateEstimate cdse = mPlan.combinedDeviceStateEstimations.get(i);
+ Intermediates
+ cdseIntermediates = new Intermediates();
+ cdse.intermediates = cdseIntermediates;
+ List<DeviceStateEstimation> deviceStateEstimations = cdse.deviceStateEstimations;
+ for (int j = deviceStateEstimations.size() - 1; j >= 0; j--) {
+ DeviceStateEstimation dse = deviceStateEstimations.get(j);
+ Intermediates intermediates = (Intermediates) dse.intermediates;
+ if (mHasWifiPowerController) {
+ cdseIntermediates.rxPower += intermediates.rxPower;
+ cdseIntermediates.txPower += intermediates.txPower;
+ cdseIntermediates.scanPower += intermediates.scanPower;
+ cdseIntermediates.idlePower += intermediates.idlePower;
+ } else {
+ cdseIntermediates.activePower += intermediates.activePower;
+ cdseIntermediates.basicScanPower += intermediates.basicScanPower;
+ cdseIntermediates.batchedScanPower += intermediates.batchedScanPower;
+ }
+ cdseIntermediates.basicScanDuration += intermediates.basicScanDuration;
+ cdseIntermediates.batchedScanDuration += intermediates.batchedScanDuration;
+ cdseIntermediates.consumedEnergy += intermediates.consumedEnergy;
+ }
+ }
+ }
+
+ private void computeUidActivityTotals(PowerComponentAggregatedPowerStats stats, int uid,
+ UidStateEstimate uidStateEstimate) {
+ Intermediates intermediates =
+ (Intermediates) uidStateEstimate.combinedDeviceStateEstimate.intermediates;
+ for (UidStateProportionalEstimate proportionalEstimate :
+ uidStateEstimate.proportionalEstimates) {
+ if (!stats.getUidStats(mTmpUidStatsArray, uid, proportionalEstimate.stateValues)) {
+ continue;
+ }
+
+ intermediates.rxPackets += mStatsLayout.getUidRxPackets(mTmpUidStatsArray);
+ intermediates.txPackets += mStatsLayout.getUidTxPackets(mTmpUidStatsArray);
+ }
+ }
+
+ private void computeUidPowerEstimates(PowerComponentAggregatedPowerStats stats, int uid,
+ UidStateEstimate uidStateEstimate) {
+ Intermediates intermediates =
+ (Intermediates) uidStateEstimate.combinedDeviceStateEstimate.intermediates;
+ for (UidStateProportionalEstimate proportionalEstimate :
+ uidStateEstimate.proportionalEstimates) {
+ if (!stats.getUidStats(mTmpUidStatsArray, uid, proportionalEstimate.stateValues)) {
+ continue;
+ }
+
+ double power = 0;
+ if (mHasWifiPowerController) {
+ if (intermediates.rxPackets != 0) {
+ power += intermediates.rxPower * mStatsLayout.getUidRxPackets(mTmpUidStatsArray)
+ / intermediates.rxPackets;
+ }
+ if (intermediates.txPackets != 0) {
+ power += intermediates.txPower * mStatsLayout.getUidTxPackets(mTmpUidStatsArray)
+ / intermediates.txPackets;
+ }
+ long totalScanDuration =
+ intermediates.basicScanDuration + intermediates.batchedScanDuration;
+ if (totalScanDuration != 0) {
+ long scanDuration = mStatsLayout.getUidScanTime(mTmpUidStatsArray)
+ + mStatsLayout.getUidBatchedScanTime(mTmpUidStatsArray);
+ power += intermediates.scanPower * scanDuration / totalScanDuration;
+ }
+ } else {
+ long totalPackets = intermediates.rxPackets + intermediates.txPackets;
+ if (totalPackets != 0) {
+ long packets = mStatsLayout.getUidRxPackets(mTmpUidStatsArray)
+ + mStatsLayout.getUidTxPackets(mTmpUidStatsArray);
+ power += intermediates.activePower * packets / totalPackets;
+ }
+
+ if (intermediates.basicScanDuration != 0) {
+ long scanDuration = mStatsLayout.getUidScanTime(mTmpUidStatsArray);
+ power += intermediates.basicScanPower * scanDuration
+ / intermediates.basicScanDuration;
+ }
+
+ if (intermediates.batchedScanDuration != 0) {
+ long batchedScanDuration = mStatsLayout.getUidBatchedScanTime(
+ mTmpUidStatsArray);
+ power += intermediates.batchedScanPower * batchedScanDuration
+ / intermediates.batchedScanDuration;
+ }
+ }
+ mStatsLayout.setUidPowerEstimate(mTmpUidStatsArray, power);
+ stats.setUidStats(uid, proportionalEstimate.stateValues, mTmpUidStatsArray);
+
+ if (DEBUG) {
+ Slog.d(TAG, "UID: " + uid
+ + " states: " + Arrays.toString(proportionalEstimate.stateValues)
+ + " stats: " + Arrays.toString(mTmpUidStatsArray)
+ + " rx: " + mStatsLayout.getUidRxPackets(mTmpUidStatsArray)
+ + " rx-power: " + intermediates.rxPower
+ + " rx-packets: " + intermediates.rxPackets
+ + " tx: " + mStatsLayout.getUidTxPackets(mTmpUidStatsArray)
+ + " tx-power: " + intermediates.txPower
+ + " tx-packets: " + intermediates.txPackets
+ + " power: " + power);
+ }
+ }
+ }
+
+ @Override
+ String deviceStatsToString(PowerStats.Descriptor descriptor, long[] stats) {
+ unpackPowerStatsDescriptor(descriptor);
+ if (mHasWifiPowerController) {
+ return "rx: " + mStatsLayout.getDeviceRxTime(stats)
+ + " tx: " + mStatsLayout.getDeviceTxTime(stats)
+ + " scan: " + mStatsLayout.getDeviceScanTime(stats)
+ + " idle: " + mStatsLayout.getDeviceIdleTime(stats)
+ + " power: " + mStatsLayout.getDevicePowerEstimate(stats);
+ } else {
+ return "active: " + mStatsLayout.getDeviceActiveTime(stats)
+ + " scan: " + mStatsLayout.getDeviceBasicScanTime(stats)
+ + " batched-scan: " + mStatsLayout.getDeviceBatchedScanTime(stats)
+ + " power: " + mStatsLayout.getDevicePowerEstimate(stats);
+ }
+ }
+
+ @Override
+ String stateStatsToString(PowerStats.Descriptor descriptor, int key, long[] stats) {
+ // Unsupported for this power component
+ return null;
+ }
+
+ @Override
+ String uidStatsToString(PowerStats.Descriptor descriptor, long[] stats) {
+ unpackPowerStatsDescriptor(descriptor);
+ return "rx: " + mStatsLayout.getUidRxPackets(stats)
+ + " tx: " + mStatsLayout.getUidTxPackets(stats)
+ + " scan: " + mStatsLayout.getUidScanTime(stats)
+ + " batched-scan: " + mStatsLayout.getUidBatchedScanTime(stats)
+ + " power: " + mStatsLayout.getUidPowerEstimate(stats);
+ }
+}
diff --git a/services/core/java/com/android/server/power/stats/flags.aconfig b/services/core/java/com/android/server/power/stats/flags.aconfig
index 54ae84f4..9283fe9 100644
--- a/services/core/java/com/android/server/power/stats/flags.aconfig
+++ b/services/core/java/com/android/server/power/stats/flags.aconfig
@@ -30,3 +30,10 @@
description: "Feature flag for streamlined connectivity battery stats"
bug: "323970018"
}
+
+flag {
+ name: "streamlined_misc_battery_stats"
+ namespace: "backstage_power"
+ description: "Feature flag for streamlined misc (excluding CPU, Cell, Wifi, BT) battery stats"
+ bug: "333941740"
+}
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index f925b5f..42efc2d 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -77,6 +77,7 @@
import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
import static android.content.pm.ActivityInfo.FLAG_STATE_NOT_NEEDED;
import static android.content.pm.ActivityInfo.FLAG_TURN_SCREEN_ON;
+import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION;
import static android.content.pm.ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED;
import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
@@ -2119,9 +2120,19 @@
mCameraCompatControlEnabled = mWmService.mContext.getResources()
.getBoolean(R.bool.config_isCameraCompatControlForStretchedIssuesEnabled);
mResolveConfigHint = new TaskFragment.ConfigOverrideHint();
- mResolveConfigHint.mUseLegacyInsetsForStableBounds =
- mWmService.mFlags.mInsetsDecoupledConfiguration
- && !info.isChangeEnabled(INSETS_DECOUPLED_CONFIGURATION_ENFORCED);
+ if (mWmService.mFlags.mInsetsDecoupledConfiguration) {
+ // When the stable configuration is the default behavior, override for the legacy apps
+ // without forward override flag.
+ mResolveConfigHint.mUseOverrideInsetsForStableBounds =
+ !info.isChangeEnabled(INSETS_DECOUPLED_CONFIGURATION_ENFORCED)
+ && !info.isChangeEnabled(
+ OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION);
+ } else {
+ // When the stable configuration is not the default behavior, forward overriding the
+ // listed apps.
+ mResolveConfigHint.mUseOverrideInsetsForStableBounds =
+ info.isChangeEnabled(OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION);
+ }
mTargetSdk = info.applicationInfo.targetSdkVersion;
@@ -8466,7 +8477,7 @@
mCompatDisplayInsets =
new CompatDisplayInsets(
mDisplayContent, this, letterboxedContainerBounds,
- mResolveConfigHint.mUseLegacyInsetsForStableBounds);
+ mResolveConfigHint.mUseOverrideInsetsForStableBounds);
}
private void clearSizeCompatModeAttributes() {
@@ -8665,15 +8676,14 @@
if (mDisplayContent == null) {
return;
}
- final Rect parentAppBounds = newParentConfiguration.windowConfiguration.getAppBounds();
+ final Rect parentBounds = newParentConfiguration.windowConfiguration.getBounds();
int rotation = newParentConfiguration.windowConfiguration.getRotation();
if (rotation == ROTATION_UNDEFINED && !isFixedRotationTransforming()) {
rotation = mDisplayContent.getRotation();
}
- if (!mResolveConfigHint.mUseLegacyInsetsForStableBounds
- || getCompatDisplayInsets() != null
- || isFloating(parentWindowingMode) || parentAppBounds == null
- || parentAppBounds.isEmpty() || rotation == ROTATION_UNDEFINED) {
+ if (!mResolveConfigHint.mUseOverrideInsetsForStableBounds
+ || getCompatDisplayInsets() != null || isFloating(parentWindowingMode)
+ || rotation == ROTATION_UNDEFINED) {
// If the insets configuration decoupled logic is not enabled for the app, or the app
// already has a compat override, or the context doesn't contain enough info to
// calculate the override, skip the override.
@@ -8692,7 +8702,7 @@
// the value if not calculated yet.
Rect outAppBounds = inOutConfig.windowConfiguration.getAppBounds();
if (outAppBounds == null || outAppBounds.isEmpty()) {
- inOutConfig.windowConfiguration.setAppBounds(parentAppBounds);
+ inOutConfig.windowConfiguration.setAppBounds(parentBounds);
outAppBounds = inOutConfig.windowConfiguration.getAppBounds();
outAppBounds.inset(nonDecorInsets);
}
@@ -8703,14 +8713,11 @@
density *= DisplayMetrics.DENSITY_DEFAULT_SCALE;
if (inOutConfig.screenWidthDp == Configuration.SCREEN_WIDTH_DP_UNDEFINED) {
final int overrideScreenWidthDp = (int) (outAppBounds.width() / density + 0.5f);
- inOutConfig.screenWidthDp =
- Math.min(overrideScreenWidthDp, newParentConfiguration.screenWidthDp);
+ inOutConfig.screenWidthDp = overrideScreenWidthDp;
}
if (inOutConfig.screenHeightDp == Configuration.SCREEN_HEIGHT_DP_UNDEFINED) {
- final int overrideScreenHeightDp =
- (int) (outAppBounds.height() / density + 0.5f);
- inOutConfig.screenHeightDp =
- Math.min(overrideScreenHeightDp, newParentConfiguration.screenHeightDp);
+ final int overrideScreenHeightDp = (int) (outAppBounds.height() / density + 0.5f);
+ inOutConfig.screenHeightDp = overrideScreenHeightDp;
}
if (inOutConfig.smallestScreenWidthDp
== Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED
@@ -8987,7 +8994,7 @@
if (mDisplayContent == null) {
return true;
}
- if (!mResolveConfigHint.mUseLegacyInsetsForStableBounds) {
+ if (!mResolveConfigHint.mUseOverrideInsetsForStableBounds) {
// No insets should be considered any more.
return true;
}
@@ -9006,7 +9013,7 @@
final Task task = getTask();
task.calculateInsetFrames(outNonDecorBounds /* outNonDecorBounds */,
outStableBounds /* outStableBounds */, parentBounds /* bounds */, di,
- mResolveConfigHint.mUseLegacyInsetsForStableBounds);
+ mResolveConfigHint.mUseOverrideInsetsForStableBounds);
final int orientationWithInsets = outStableBounds.height() >= outStableBounds.width()
? ORIENTATION_PORTRAIT : ORIENTATION_LANDSCAPE;
// If orientation does not match the orientation with insets applied, then a
@@ -9063,7 +9070,7 @@
getResolvedOverrideConfiguration().windowConfiguration.getBounds();
final int stableBoundsOrientation = stableBounds.width() > stableBounds.height()
? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT;
- final int parentOrientation = mResolveConfigHint.mUseLegacyInsetsForStableBounds
+ final int parentOrientation = mResolveConfigHint.mUseOverrideInsetsForStableBounds
? stableBoundsOrientation : newParentConfig.orientation;
// If the activity requires a different orientation (either by override or activityInfo),
@@ -9088,7 +9095,7 @@
return;
}
- final Rect parentAppBounds = mResolveConfigHint.mUseLegacyInsetsForStableBounds
+ final Rect parentAppBounds = mResolveConfigHint.mUseOverrideInsetsForStableBounds
? outNonDecorBounds : newParentConfig.windowConfiguration.getAppBounds();
// TODO(b/182268157): Explore using only one type of parentBoundsWithInsets, either app
// bounds or stable bounds to unify aspect ratio logic.
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index a739e57..b3c43bc 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -3736,6 +3736,14 @@
return false;
}
+ // If the app is using auto-enter, and it explicitly requests entering PiP while pausing,
+ // return false immediately since auto-enter should take in place instead.
+ if (fromClient && r.isState(PAUSING) && params.isAutoEnterEnabled()) {
+ Slog.w(TAG, "Skip client enterPictureInPictureMode request while pausing,"
+ + " auto-enter-pip is enabled");
+ return false;
+ }
+
if (isPip2ExperimentEnabled()) {
// If PiP2 flag is on and request to enter PiP comes in,
// we request a direct transition TRANSIT_PIP from Shell to get the right entry bounds.
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index 430232c..c74284e 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -2311,8 +2311,12 @@
mService.setLastResumedActivityUncheckLocked(mTopResumedActivity, reason);
}
scheduleTopResumedActivityStateIfNeeded();
-
- mService.updateTopApp(mTopResumedActivity);
+ // If the device is not sleeping and there is no top resumed, do not update top app because
+ // it may be an intermediate state while moving a task to front. The actual top will be set
+ // when TaskFragment#setResumedActivity is called.
+ if (mTopResumedActivity != null || mService.isSleepingLocked()) {
+ mService.updateTopApp(mTopResumedActivity);
+ }
return mTopResumedActivity;
}
diff --git a/services/core/java/com/android/server/wm/CameraIdPackageNameBiMapping.java b/services/core/java/com/android/server/wm/CameraIdPackageNameBiMapping.java
new file mode 100644
index 0000000..d9730cb
--- /dev/null
+++ b/services/core/java/com/android/server/wm/CameraIdPackageNameBiMapping.java
@@ -0,0 +1,78 @@
+/*
+ * 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.wm;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.util.ArrayMap;
+
+import java.util.Map;
+
+/**
+ * Bidirectional mapping (1:1) for the currently active cameraId and the app package that opened it.
+ *
+ * <p>This class is not thread-safe.
+ */
+final class CameraIdPackageNameBiMapping {
+ private final Map<String, String> mPackageToCameraIdMap = new ArrayMap<>();
+ private final Map<String, String> mCameraIdToPackageMap = new ArrayMap<>();
+
+ boolean isEmpty() {
+ return mCameraIdToPackageMap.isEmpty();
+ }
+
+ void put(@NonNull String packageName, @NonNull String cameraId) {
+ // Always using the last connected camera ID for the package even for the concurrent
+ // camera use case since we can't guess which camera is more important anyway.
+ removePackageName(packageName);
+ removeCameraId(cameraId);
+ mPackageToCameraIdMap.put(packageName, cameraId);
+ mCameraIdToPackageMap.put(cameraId, packageName);
+ }
+
+ boolean containsPackageName(@NonNull String packageName) {
+ return mPackageToCameraIdMap.containsKey(packageName);
+ }
+
+ @Nullable
+ String getCameraId(@NonNull String packageName) {
+ return mPackageToCameraIdMap.get(packageName);
+ }
+
+ void removeCameraId(@NonNull String cameraId) {
+ final String packageName = mCameraIdToPackageMap.get(cameraId);
+ if (packageName == null) {
+ return;
+ }
+ mPackageToCameraIdMap.remove(packageName, cameraId);
+ mCameraIdToPackageMap.remove(cameraId, packageName);
+ }
+
+ @NonNull
+ String getSummaryForDisplayRotationHistoryRecord() {
+ return "{ mPackageToCameraIdMap=" + mPackageToCameraIdMap + " }";
+ }
+
+ private void removePackageName(@NonNull String packageName) {
+ String cameraId = mPackageToCameraIdMap.get(packageName);
+ if (cameraId == null) {
+ return;
+ }
+ mPackageToCameraIdMap.remove(packageName, cameraId);
+ mCameraIdToPackageMap.remove(cameraId, packageName);
+ }
+}
diff --git a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
index e808dec..c8a7ef1 100644
--- a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
@@ -46,7 +46,6 @@
import android.hardware.camera2.CameraManager;
import android.os.Handler;
import android.os.RemoteException;
-import android.util.ArrayMap;
import android.util.ArraySet;
import android.widget.Toast;
@@ -56,7 +55,6 @@
import com.android.internal.protolog.common.ProtoLog;
import com.android.server.UiThread;
-import java.util.Map;
import java.util.Set;
/**
@@ -100,7 +98,8 @@
// camera id by a package name when determining rotation; 2) get a package name by a camera id
// when camera connection is closed and we need to clean up our records.
@GuardedBy("this")
- private final CameraIdPackageNameBiMap mCameraIdPackageBiMap = new CameraIdPackageNameBiMap();
+ private final CameraIdPackageNameBiMapping mCameraIdPackageBiMap =
+ new CameraIdPackageNameBiMapping();
@GuardedBy("this")
private final Set<String> mScheduledToBeRemovedCameraIdSet = new ArraySet<>();
@GuardedBy("this")
@@ -516,54 +515,4 @@
}
return topActivity.mLetterboxUiController.isRefreshAfterRotationRequested();
}
-
- private static class CameraIdPackageNameBiMap {
-
- private final Map<String, String> mPackageToCameraIdMap = new ArrayMap<>();
- private final Map<String, String> mCameraIdToPackageMap = new ArrayMap<>();
-
- boolean isEmpty() {
- return mCameraIdToPackageMap.isEmpty();
- }
-
- void put(String packageName, String cameraId) {
- // Always using the last connected camera ID for the package even for the concurrent
- // camera use case since we can't guess which camera is more important anyway.
- removePackageName(packageName);
- removeCameraId(cameraId);
- mPackageToCameraIdMap.put(packageName, cameraId);
- mCameraIdToPackageMap.put(cameraId, packageName);
- }
-
- boolean containsPackageName(String packageName) {
- return mPackageToCameraIdMap.containsKey(packageName);
- }
-
- @Nullable
- String getCameraId(String packageName) {
- return mPackageToCameraIdMap.get(packageName);
- }
-
- void removeCameraId(String cameraId) {
- String packageName = mCameraIdToPackageMap.get(cameraId);
- if (packageName == null) {
- return;
- }
- mPackageToCameraIdMap.remove(packageName, cameraId);
- mCameraIdToPackageMap.remove(cameraId, packageName);
- }
-
- String getSummaryForDisplayRotationHistoryRecord() {
- return "{ mPackageToCameraIdMap=" + mPackageToCameraIdMap + " }";
- }
-
- private void removePackageName(String packageName) {
- String cameraId = mPackageToCameraIdMap.get(packageName);
- if (cameraId == null) {
- return;
- }
- mPackageToCameraIdMap.remove(packageName, cameraId);
- mCameraIdToPackageMap.remove(cameraId, packageName);
- }
- }
}
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index cb5ad91..da1581e 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -905,13 +905,11 @@
// Note that we check the task rather than the parent as with ActivityEmbedding the parent might
// be a TaskFragment, and its windowing mode is always MULTI_WINDOW, even if the task is
// actually fullscreen.
- private boolean isDisplayFullScreenAndInPosture(DeviceStateController.DeviceState state,
- boolean isTabletop) {
+ private boolean isDisplayFullScreenAndInPosture(boolean isTabletop) {
Task task = mActivityRecord.getTask();
- return mActivityRecord.mDisplayContent != null
- && mActivityRecord.mDisplayContent.getDisplayRotation().isDeviceInPosture(state,
- isTabletop)
- && task != null
+ return mActivityRecord.mDisplayContent != null && task != null
+ && mActivityRecord.mDisplayContent.getDisplayRotation().isDeviceInPosture(
+ DeviceStateController.DeviceState.HALF_FOLDED, isTabletop)
&& task.getWindowingMode() == WINDOWING_MODE_FULLSCREEN;
}
@@ -939,16 +937,14 @@
}
private boolean isFullScreenAndBookModeEnabled() {
- return isDisplayFullScreenAndInPosture(
- DeviceStateController.DeviceState.HALF_FOLDED, false /* isTabletop */)
+ return isDisplayFullScreenAndInPosture(/* isTabletop */ false)
&& mLetterboxConfiguration.getIsAutomaticReachabilityInBookModeEnabled();
}
float getVerticalPositionMultiplier(Configuration parentConfiguration) {
// Don't check resolved configuration because it may not be updated yet during
// configuration change.
- boolean tabletopMode = isDisplayFullScreenAndInPosture(
- DeviceStateController.DeviceState.HALF_FOLDED, true /* isTabletop */);
+ boolean tabletopMode = isDisplayFullScreenAndInPosture(/* isTabletop */ true);
return isVerticalReachabilityEnabled(parentConfiguration)
// Using the last global dynamic position to avoid "jumps" when moving
// between apps or activities.
@@ -981,16 +977,15 @@
}
private boolean shouldUseSplitScreenAspectRatio(@NonNull Configuration parentConfiguration) {
- final boolean isBookMode = isDisplayFullScreenAndInPosture(
- DeviceStateController.DeviceState.HALF_FOLDED,
- /* isTabletop */ false);
+ final boolean isBookMode = isDisplayFullScreenAndInPosture(/* isTabletop */ false);
final boolean isNotCenteredHorizontally = getHorizontalPositionMultiplier(
parentConfiguration) != LETTERBOX_POSITION_MULTIPLIER_CENTER;
- final boolean isTabletopMode = isDisplayFullScreenAndInPosture(
- DeviceStateController.DeviceState.HALF_FOLDED,
- /* isTabletop */ true);
+ final boolean isTabletopMode = isDisplayFullScreenAndInPosture(/* isTabletop */ true);
+ final boolean isLandscape = isFixedOrientationLandscape(
+ mActivityRecord.getOverrideOrientation());
+
// Don't resize to split screen size when in book mode if letterbox position is centered
- return ((isBookMode && isNotCenteredHorizontally) || isTabletopMode)
+ return (isBookMode && isNotCenteredHorizontally || isTabletopMode && isLandscape)
|| isCameraCompatSplitScreenAspectRatioAllowed()
&& isCameraCompatTreatmentActive();
}
@@ -1647,17 +1642,13 @@
if (isHorizontalReachabilityEnabled()) {
int letterboxPositionForHorizontalReachability = getLetterboxConfiguration()
.getLetterboxPositionForHorizontalReachability(
- isDisplayFullScreenAndInPosture(
- DeviceStateController.DeviceState.HALF_FOLDED,
- false /* isTabletop */));
+ isDisplayFullScreenAndInPosture(/* isTabletop */ false));
positionToLog = letterboxHorizontalReachabilityPositionToLetterboxPosition(
letterboxPositionForHorizontalReachability);
} else if (isVerticalReachabilityEnabled()) {
int letterboxPositionForVerticalReachability = getLetterboxConfiguration()
.getLetterboxPositionForVerticalReachability(
- isDisplayFullScreenAndInPosture(
- DeviceStateController.DeviceState.HALF_FOLDED,
- true /* isTabletop */));
+ isDisplayFullScreenAndInPosture(/* isTabletop */ true));
positionToLog = letterboxVerticalReachabilityPositionToLetterboxPosition(
letterboxPositionForVerticalReachability);
}
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 1e88fe4..622a809 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -174,6 +174,7 @@
private static final int SET_SCREEN_BRIGHTNESS_OVERRIDE = 1;
private static final int SET_USER_ACTIVITY_TIMEOUT = 2;
private static final int MSG_SEND_SLEEP_TRANSITION = 3;
+ private static final int PINNED_TASK_ABORT_TIMEOUT = 1000;
static final String TAG_TASKS = TAG + POSTFIX_TASKS;
static final String TAG_STATES = TAG + POSTFIX_STATES;
@@ -295,6 +296,9 @@
};
+ // TODO: b/335866033 Remove the abort PiP on timeout once PiP2 flag is on.
+ @Nullable private Runnable mMaybeAbortPipEnterRunnable = null;
+
private final FindTaskResult mTmpFindTaskResult = new FindTaskResult();
static class FindTaskResult implements Predicate<Task> {
@@ -2272,8 +2276,67 @@
resumeFocusedTasksTopActivities();
notifyActivityPipModeChanged(r.getTask(), r);
+
+ if (!isPip2ExperimentEnabled()) {
+ // TODO: b/335866033 Remove the abort PiP on timeout once PiP2 flag is on.
+ // Set up a timeout callback to potentially abort PiP enter if in an inconsistent state.
+ scheduleTimeoutAbortPipEnter(rootTask);
+ }
}
+ private void scheduleTimeoutAbortPipEnter(Task rootTask) {
+ if (mMaybeAbortPipEnterRunnable != null) {
+ // If there is an abort enter PiP check pending already remove it and abort
+ // immediately since we are trying to enter PiP in an inconsistent state
+ mHandler.removeCallbacks(mMaybeAbortPipEnterRunnable);
+ mMaybeAbortPipEnterRunnable.run();
+ }
+ // Snapshot a throwable early on to display the callstack upon abort later on timeout.
+ final Throwable enterPipThrowable = new Throwable();
+ // Set up a timeout to potentially roll back the task change to PINNED mode
+ // by aborting PiP.
+ mMaybeAbortPipEnterRunnable = new Runnable() {
+ @Override
+ public void run() {
+ synchronized (mService.mGlobalLock) {
+ if (mTransitionController.inTransition()) {
+ // If this task is a part an active transition aborting PiP might break
+ // it; so run the timeout callback directly once idle.
+
+ final Runnable expectedMaybeAbortAtTimeout = mMaybeAbortPipEnterRunnable;
+ mTransitionController.mStateValidators.add(() -> {
+ // If a second PiP transition comes in, it runs the abort runnable for
+ // the first transition pre-emptively, so we need to avoid calling
+ // the same runnable twice when validating states.
+ if (expectedMaybeAbortAtTimeout != mMaybeAbortPipEnterRunnable) return;
+ mMaybeAbortPipEnterRunnable = null;
+ run();
+ });
+ return;
+ } else {
+ mMaybeAbortPipEnterRunnable = null;
+ }
+ mService.deferWindowLayout();
+ final ActivityRecord top = rootTask.getTopMostActivity();
+ final ActivityManager.RunningTaskInfo beforeTaskInfo =
+ rootTask.getTaskInfo();
+ if (top != null && !top.inPinnedWindowingMode()
+ && rootTask.abortPipEnter(top)) {
+ Slog.wtf(TAG, "Enter PiP was aborted via a scheduled timeout"
+ + "task_state_before=" + beforeTaskInfo
+ + "task_state_after=" + rootTask.getTaskInfo(),
+ enterPipThrowable);
+ }
+ mService.continueWindowLayout();
+ }
+ }
+ };
+ mHandler.postDelayed(mMaybeAbortPipEnterRunnable, PINNED_TASK_ABORT_TIMEOUT);
+ Slog.d(TAG, "a delayed check for potentially aborting PiP if "
+ + "in a wrong state is scheduled.");
+ }
+
+
/**
* Notifies when an activity enters or leaves PIP mode.
*
@@ -2403,14 +2466,6 @@
return false;
}
- return resumeFocusedTasksTopActivitiesUnchecked(targetRootTask, target, targetOptions,
- deferPause);
- }
-
- @VisibleForTesting
- boolean resumeFocusedTasksTopActivitiesUnchecked(
- Task targetRootTask, ActivityRecord target, ActivityOptions targetOptions,
- boolean deferPause) {
boolean result = false;
if (targetRootTask != null && (targetRootTask.isTopRootTaskInDisplayArea()
|| getTopDisplayFocusedRootTask() == targetRootTask)) {
@@ -2900,6 +2955,14 @@
mService.mH.post(mDestroyAllActivitiesRunnable);
}
+ void removeAllMaybeAbortPipEnterRunnable() {
+ if (mMaybeAbortPipEnterRunnable == null) {
+ return;
+ }
+ mHandler.removeCallbacks(mMaybeAbortPipEnterRunnable);
+ mMaybeAbortPipEnterRunnable = null;
+ }
+
// Tries to put all activity tasks to sleep. Returns true if all tasks were
// successfully put to sleep.
boolean putTasksToSleep(boolean allowDelay, boolean shuttingDown) {
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 9d3ffa9..f23a440 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -4852,11 +4852,13 @@
/**
* Abort an incomplete pip-entry. If left in this state, it will cover everything but remain
* paused. If this is needed, there is a bug -- this should only be used for recovery.
+ *
+ * @return true if there is an inconsistency in the task and activity state.
*/
- void abortPipEnter(ActivityRecord top) {
+ boolean abortPipEnter(ActivityRecord top) {
// an incomplete state has the task PINNED but the activity not.
if (!inPinnedWindowingMode() || top.inPinnedWindowingMode() || !canMoveTaskToBack(this)) {
- return;
+ return false;
}
final Transition transition = new Transition(TRANSIT_TO_BACK, 0 /* flags */,
mTransitionController, mWmService.mSyncEngine);
@@ -4878,6 +4880,7 @@
top.setWindowingMode(WINDOWING_MODE_UNDEFINED);
top.mWaitForEnteringPinnedMode = false;
}
+ return true;
}
void resumeNextFocusAfterReparent() {
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 7a8bea0..2b631f7 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -2204,7 +2204,7 @@
static class ConfigOverrideHint {
@Nullable DisplayInfo mTmpOverrideDisplayInfo;
@Nullable ActivityRecord.CompatDisplayInsets mTmpCompatInsets;
- boolean mUseLegacyInsetsForStableBounds;
+ boolean mUseOverrideInsetsForStableBounds;
}
void computeConfigResourceOverrides(@NonNull Configuration inOutConfig,
@@ -2237,11 +2237,11 @@
@NonNull Configuration parentConfig, @Nullable ConfigOverrideHint overrideHint) {
DisplayInfo overrideDisplayInfo = null;
ActivityRecord.CompatDisplayInsets compatInsets = null;
- boolean useLegacyInsetsForStableBounds = false;
+ boolean useOverrideInsetsForStableBounds = false;
if (overrideHint != null) {
overrideDisplayInfo = overrideHint.mTmpOverrideDisplayInfo;
compatInsets = overrideHint.mTmpCompatInsets;
- useLegacyInsetsForStableBounds = overrideHint.mUseLegacyInsetsForStableBounds;
+ useOverrideInsetsForStableBounds = overrideHint.mUseOverrideInsetsForStableBounds;
if (overrideDisplayInfo != null) {
// Make sure the screen related configs can be computed by the provided
// display info.
@@ -2321,7 +2321,7 @@
// The non decor inset are areas that could never be removed in Honeycomb. See
// {@link WindowManagerPolicy#getNonDecorInsetsLw}.
calculateInsetFrames(mTmpNonDecorBounds, mTmpStableBounds, mTmpFullBounds, di,
- useLegacyInsetsForStableBounds);
+ useOverrideInsetsForStableBounds);
} else {
// Apply the given non-decor and stable insets to calculate the corresponding bounds
// for screen size of configuration.
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 664019a..1543263 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -1429,20 +1429,17 @@
}
}
if (mTransientLaunches != null) {
- InsetsControlTarget prevImeTarget = dc.getImeTarget(
- DisplayContent.IME_TARGET_CONTROL);
- InsetsControlTarget newImeTarget = null;
TaskDisplayArea transientTDA = null;
- // Transient-launch activities cannot be IME target (WindowState#canBeImeTarget),
- // so re-compute in case the IME target is changed after transition.
for (int t = 0; t < mTransientLaunches.size(); ++t) {
if (mTransientLaunches.keyAt(t).getDisplayContent() == dc) {
- newImeTarget = dc.computeImeTarget(true /* updateImeTarget */);
+ if (hasVisibleTransientLaunch) {
+ updateImeForVisibleTransientLaunch(dc);
+ }
transientTDA = mTransientLaunches.keyAt(i).getTaskDisplayArea();
break;
}
}
- if (mRecentsDisplayId != INVALID_DISPLAY && prevImeTarget == newImeTarget) {
+ if (!hasVisibleTransientLaunch && mRecentsDisplayId == dc.mDisplayId) {
// Restore IME icon only when moving the original app task to front from
// recents, in case IME icon may missing if the moving task has already been
// the current focused task.
@@ -1540,6 +1537,35 @@
return null;
}
+ /**
+ * Transient-launch activities cannot be IME target (see {@link WindowState#canBeImeTarget}),
+ * so re-compute in case the IME target is changed after transition.
+ */
+ private void updateImeForVisibleTransientLaunch(@NonNull DisplayContent dc) {
+ final WindowState imeTarget = dc.computeImeTarget(true /* updateImeTarget */);
+ final WindowState imeWindow = dc.mInputMethodWindow;
+ if (imeWindow == null || imeTarget == null
+ || !mController.hasCollectingRotationChange(dc, dc.getRotation())) {
+ return;
+ }
+ // Drop the insets leash if it is still controlled by previous (invisible) app. This avoids
+ // showing IME with old rotation on an app with new rotation if IME parent is updated
+ // but insets leash hasn't been refreshed, i.e. DisplayContent#updateImeParent is called
+ // but InsetsStateController#notifyControlTargetChanged still waits for IME to redraw.
+ final InsetsSourceProvider sourceProvider = imeWindow.getControllableInsetProvider();
+ if (sourceProvider == null || sourceProvider.mControl == null
+ || !sourceProvider.isClientVisible()
+ || imeTarget == sourceProvider.getControlTarget()) {
+ return;
+ }
+ final SurfaceControl imeInsetsLeash = sourceProvider.mControl.getLeash();
+ final InsetsControlTarget controlTarget = sourceProvider.getControlTarget();
+ if (imeInsetsLeash != null && controlTarget != null && controlTarget.getWindow() != null
+ && !controlTarget.getWindow().mToken.isVisible()) {
+ dc.getSyncTransaction().reparent(imeInsetsLeash, null);
+ }
+ }
+
void abort() {
// This calls back into itself via controller.abort, so just early return here.
if (mState == STATE_ABORT) return;
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index 407b5d5..eeedec3 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -1044,6 +1044,13 @@
int[] fromOrientations, int[] toOrientations);
/**
+ * Set current screen capture session id that will be used during sensitive content protections.
+ *
+ * @param sessionId Session id for this screen capture protection
+ */
+ public abstract void setBlockScreenCaptureForAppsSessionId(long sessionId);
+
+ /**
* Set whether screen capture should be disabled for all windows of a specific app windows based
* on sensitive content protections.
*
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 07e534c..de7c0eb 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -44,6 +44,7 @@
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.permission.flags.Flags.sensitiveContentMetricsBugfix;
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;
@@ -113,6 +114,7 @@
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_MOVEMENT;
import static com.android.internal.protolog.ProtoLogGroup.WM_ERROR;
import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.internal.util.FrameworkStatsLog.SENSITIVE_NOTIFICATION_APP_PROTECTION_APPLIED;
import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN;
import static com.android.server.LockGuard.INDEX_WINDOW;
import static com.android.server.LockGuard.installLock;
@@ -340,6 +342,7 @@
import com.android.internal.protolog.common.ProtoLog;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastPrintWriter;
+import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.LatencyTracker;
import com.android.internal.view.WindowManagerPolicyThread;
import com.android.server.AnimationThread;
@@ -1110,6 +1113,9 @@
SystemPerformanceHinter mSystemPerformanceHinter;
@GuardedBy("mGlobalLock")
+ private long mSensitiveContentProtectionSessionId = 0;
+
+ @GuardedBy("mGlobalLock")
final SensitiveContentPackages mSensitiveContentPackages = new SensitiveContentPackages();
/**
* UIDs for which a Toast has been shown to indicate
@@ -4519,7 +4525,8 @@
}
}
- int getDisplayUserRotation(int displayId) {
+ @Override
+ public int getDisplayUserRotation(int displayId) {
synchronized (mGlobalLock) {
final DisplayContent display = mRoot.getDisplayContent(displayId);
if (display == null) {
@@ -8739,6 +8746,16 @@
}
@Override
+ public void setBlockScreenCaptureForAppsSessionId(long sessionId) {
+ synchronized (mGlobalLock) {
+ if (sensitiveContentMetricsBugfix()
+ && mSensitiveContentProtectionSessionId != sessionId) {
+ mSensitiveContentProtectionSessionId = sessionId;
+ }
+ }
+ }
+
+ @Override
public void addBlockScreenCaptureForApps(ArraySet<PackageInfo> packageInfos) {
synchronized (mGlobalLock) {
boolean modified =
@@ -10202,6 +10219,15 @@
Toast.LENGTH_SHORT)
.show();
});
+ // If blocked due to notification protection (null window token) log protection applied
+ if (sensitiveContentMetricsBugfix()
+ && mSensitiveContentPackages
+ .shouldBlockScreenCaptureForApp(w.getOwningPackage(), uid, null)) {
+ FrameworkStatsLog.write(
+ SENSITIVE_NOTIFICATION_APP_PROTECTION_APPLIED,
+ mSensitiveContentProtectionSessionId,
+ uid);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 909c1b3..1573d09 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -19,6 +19,7 @@
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
import static android.app.ActivityManager.isStartResultSuccessful;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.window.TaskFragmentOperation.OP_TYPE_CLEAR_ADJACENT_TASK_FRAGMENTS;
@@ -69,7 +70,6 @@
import static com.android.server.wm.ActivityRecord.State.PAUSING;
import static com.android.server.wm.ActivityRecord.State.RESUMED;
import static com.android.server.wm.ActivityTaskManagerService.enforceTaskPermission;
-import static com.android.server.wm.ActivityTaskManagerService.isPip2ExperimentEnabled;
import static com.android.server.wm.ActivityTaskSupervisor.REMOVE_FROM_RECENTS;
import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_PINNED_TASK;
import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG;
@@ -838,8 +838,6 @@
}
private int applyTaskChanges(Task tr, WindowContainerTransaction.Change c) {
- final boolean wasPrevFocusableAndVisible = tr.isFocusableAndVisible();
-
int effects = applyChanges(tr, c);
final SurfaceControl.Transaction t = c.getBoundsChangeTransaction();
@@ -860,6 +858,17 @@
}
final int childWindowingMode = c.getActivityWindowingMode();
+ if (!ActivityTaskManagerService.isPip2ExperimentEnabled()
+ && tr.getWindowingMode() == WINDOWING_MODE_PINNED
+ && (childWindowingMode == WINDOWING_MODE_PINNED
+ || childWindowingMode == WINDOWING_MODE_UNDEFINED)) {
+ // If setActivityWindowingMode requested to match its pinned task's windowing mode,
+ // remove any inconsistency checking timeout callbacks for PiP.
+ Slog.d(TAG, "Task and activity windowing modes match, so remove any timeout "
+ + "abort PiP callbacks scheduled if needed; task_win_mode="
+ + tr.getWindowingMode() + ", activity_win_mode=" + childWindowingMode);
+ mService.mRootWindowContainer.removeAllMaybeAbortPipEnterRunnable();
+ }
if (childWindowingMode > -1) {
tr.forAllActivities(a -> { a.setWindowingMode(childWindowingMode); });
}
@@ -885,17 +894,8 @@
boolean canEnterPip = activity.checkEnterPictureInPictureState(
"applyTaskChanges", true /* beforeStopping */);
if (canEnterPip) {
- mService.mTaskSupervisor.beginDeferResume();
- try {
- canEnterPip = mService.mActivityClientController
- .requestPictureInPictureMode(activity);
- } finally {
- mService.mTaskSupervisor.endDeferResume();
- if (canEnterPip && !isPip2ExperimentEnabled()) {
- // Wait until the transaction is applied to only resume once.
- effects |= TRANSACT_EFFECTS_LIFECYCLE;
- }
- }
+ canEnterPip = mService.mActivityClientController
+ .requestPictureInPictureMode(activity);
}
if (!canEnterPip) {
// Restore the flag to its previous state when the activity cannot enter PIP.
@@ -904,11 +904,6 @@
}
}
- // Activity in this Task may resume/pause when enter/exit pip.
- if (wasPrevFocusableAndVisible != tr.isFocusableAndVisible()) {
- effects |= TRANSACT_EFFECTS_LIFECYCLE;
- }
-
return effects;
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 9d8246d..d91a211 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -631,6 +631,11 @@
return;
}
+ final WindowProcessController caller = mAtm.mProcessMap.getProcess(r.launchedFromPid);
+ if (caller != null && caller.mInstrumenting) {
+ return;
+ }
+
final long diff = launchTime - lastLaunchTime;
if (diff < RAPID_ACTIVITY_LAUNCH_MS) {
mRapidActivityLaunchCount++;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyCacheImpl.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyCacheImpl.java
index c4e2dc8..b76279b 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyCacheImpl.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyCacheImpl.java
@@ -32,7 +32,6 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
/**
* Implementation of {@link DevicePolicyCache}, to which {@link DevicePolicyManagerService} pushes
@@ -48,18 +47,11 @@
private final Object mLock = new Object();
/**
- * Indicates which user is screen capture disallowed on. Can be {@link UserHandle#USER_NULL},
- * {@link UserHandle#USER_ALL} or a concrete user ID.
- */
- @GuardedBy("mLock")
- private int mScreenCaptureDisallowedUser = UserHandle.USER_NULL;
-
- /**
* Indicates if screen capture is disallowed on a specific user or all users if
* it contains {@link UserHandle#USER_ALL}.
*/
@GuardedBy("mLock")
- private Set<Integer> mScreenCaptureDisallowedUsers = new HashSet<>();
+ private final Set<Integer> mScreenCaptureDisallowedUsers = new HashSet<>();
@GuardedBy("mLock")
private final SparseIntArray mPasswordQuality = new SparseIntArray();
@@ -70,9 +62,8 @@
@GuardedBy("mLock")
private ArrayMap<String, String> mLauncherShortcutOverrides = new ArrayMap<>();
-
/** Maps to {@code ActiveAdmin.mAdminCanGrantSensorsPermissions}. */
- private final AtomicBoolean mCanGrantSensorsPermissions = new AtomicBoolean(false);
+ private volatile boolean mCanGrantSensorsPermissions = false;
@GuardedBy("mLock")
private final SparseIntArray mContentProtectionPolicy = new SparseIntArray();
@@ -87,10 +78,6 @@
@Override
public boolean isScreenCaptureAllowed(int userHandle) {
- return isScreenCaptureAllowedInPolicyEngine(userHandle);
- }
-
- private boolean isScreenCaptureAllowedInPolicyEngine(int userHandle) {
// This won't work if resolution mechanism is not strictest applies, but it's ok for now.
synchronized (mLock) {
return !mScreenCaptureDisallowedUsers.contains(userHandle)
@@ -98,18 +85,6 @@
}
}
- public int getScreenCaptureDisallowedUser() {
- synchronized (mLock) {
- return mScreenCaptureDisallowedUser;
- }
- }
-
- public void setScreenCaptureDisallowedUser(int userHandle) {
- synchronized (mLock) {
- mScreenCaptureDisallowedUser = userHandle;
- }
- }
-
public void setScreenCaptureDisallowedUser(int userHandle, boolean disallowed) {
synchronized (mLock) {
if (disallowed) {
@@ -170,12 +145,12 @@
@Override
public boolean canAdminGrantSensorsPermissions() {
- return mCanGrantSensorsPermissions.get();
+ return mCanGrantSensorsPermissions;
}
/** Sets admin control over permission grants. */
public void setAdminCanGrantSensorsPermissions(boolean canGrant) {
- mCanGrantSensorsPermissions.set(canGrant);
+ mCanGrantSensorsPermissions = canGrant;
}
@Override
@@ -205,7 +180,7 @@
pw.println("Password quality: " + mPasswordQuality);
pw.println("Permission policy: " + mPermissionPolicy);
pw.println("Content protection policy: " + mContentProtectionPolicy);
- pw.println("Admin can grant sensors permission: " + mCanGrantSensorsPermissions.get());
+ pw.println("Admin can grant sensors permission: " + mCanGrantSensorsPermissions);
pw.print("Shortcuts overrides: ");
pw.println(mLauncherShortcutOverrides);
pw.decreaseIndent();
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index be235b3b..6458eac 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -76,6 +76,7 @@
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_SECURITY_LOGGING;
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_SMS;
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_STATUS_BAR;
+import static android.Manifest.permission.MANAGE_DEVICE_POLICY_STORAGE_LIMIT;
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE;
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_SYSTEM_DIALOGS;
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_SYSTEM_UPDATES;
@@ -88,7 +89,6 @@
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_WIFI;
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_WINDOWS;
import static android.Manifest.permission.MANAGE_DEVICE_POLICY_WIPE_DATA;
-import static android.Manifest.permission.MANAGE_DEVICE_POLICY_STORAGE_LIMIT;
import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
import static android.Manifest.permission.MASTER_CLEAR;
import static android.Manifest.permission.NOTIFY_PENDING_SYSTEM_UPDATE;
@@ -116,7 +116,6 @@
import static android.app.admin.DeviceAdminInfo.USES_POLICY_WIPE_DATA;
import static android.app.admin.DeviceAdminReceiver.ACTION_COMPLIANCE_ACKNOWLEDGEMENT_REQUIRED;
import static android.app.admin.DeviceAdminReceiver.EXTRA_TRANSFER_OWNERSHIP_ADMIN_EXTRAS_BUNDLE;
-import static android.app.admin.DevicePolicyIdentifiers.AUTO_TIMEZONE_POLICY;
import static android.app.admin.DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE;
import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_FINANCING_STATE_CHANGED;
import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_RESOURCE_UPDATED;
@@ -407,7 +406,6 @@
import android.location.Location;
import android.location.LocationManager;
import android.media.AudioManager;
-import android.media.IAudioService;
import android.net.ConnectivityManager;
import android.net.ConnectivitySettingsManager;
import android.net.IIpConnectivityMetrics;
@@ -1770,10 +1768,6 @@
ServiceManager.getService(Context.BACKUP_SERVICE));
}
- IAudioService getIAudioService() {
- return IAudioService.Stub.asInterface(ServiceManager.getService(Context.AUDIO_SERVICE));
- }
-
PersistentDataBlockManagerInternal getPersistentDataBlockManagerInternal() {
return LocalServices.getService(PersistentDataBlockManagerInternal.class);
}
@@ -1946,10 +1940,6 @@
name, value, userHandle);
}
- void settingsSecurePutInt(String name, int value) {
- Settings.Secure.putInt(mContext.getContentResolver(), name, value);
- }
-
int settingsGlobalGetInt(String name, int def) {
return Settings.Global.getInt(mContext.getContentResolver(), name, def);
}
@@ -1963,10 +1953,6 @@
Settings.Global.putInt(mContext.getContentResolver(), name, value);
}
- void settingsSecurePutString(String name, String value) {
- Settings.Secure.putString(mContext.getContentResolver(), name, value);
- }
-
void settingsGlobalPutString(String name, String value) {
Settings.Global.putString(mContext.getContentResolver(), name, value);
}
@@ -2907,16 +2893,6 @@
return poAdmin;
}
- @NonNull ActiveAdmin getOrganizationOwnedProfileOwnerLocked(final CallerIdentity caller) {
- Preconditions.checkCallAuthorization(
- mOwners.isProfileOwnerOfOrganizationOwnedDevice(caller.getUserId()),
- "Caller %s is not an admin of an org-owned device",
- caller.getComponentName());
- final ActiveAdmin profileOwner = getProfileOwnerLocked(caller.getUserId());
-
- return profileOwner;
- }
-
ActiveAdmin getProfileOwnerOrDeviceOwnerLocked(@UserIdInt int userId) {
ensureLocked();
// Try to find an admin which can use reqPolicy
@@ -2929,18 +2905,6 @@
return getDeviceOwnerLocked(userId);
}
- ActiveAdmin getProfileOwnerOrDefaultDeviceOwnerLocked(@UserIdInt int userId) {
- ensureLocked();
- // Try to find an admin which can use reqPolicy
- final ComponentName poAdminComponent = mOwners.getProfileOwnerComponent(userId);
-
- if (poAdminComponent != null) {
- return getProfileOwnerLocked(userId);
- }
-
- return getDefaultDeviceOwnerLocked(userId);
- }
-
@NonNull ActiveAdmin getParentOfAdminIfRequired(ActiveAdmin admin, boolean parent) {
Objects.requireNonNull(admin);
return parent ? admin.getParentActiveAdmin() : admin;
@@ -4453,25 +4417,6 @@
* <ul>
* <li>The active admins associated with the userHandle itself</li>
* <li>The parent active admins for each managed profile associated with the userHandle</li>
- * </ul>
- *
- * @param userHandle the affected user for whom to get the active admins
- * @return the list of active admins for the affected user
- */
- @GuardedBy("getLockObject()")
- private List<ActiveAdmin> getActiveAdminsForAffectedUserLocked(int userHandle) {
- if (isManagedProfile(userHandle)) {
- return getUserDataUnchecked(userHandle).mAdminList;
- }
- return getActiveAdminsForUserAndItsManagedProfilesLocked(userHandle,
- /* shouldIncludeProfileAdmins */ (user) -> false);
- }
-
- /**
- * Get the list of active admins for an affected user:
- * <ul>
- * <li>The active admins associated with the userHandle itself</li>
- * <li>The parent active admins for each managed profile associated with the userHandle</li>
* <li>The permission based admin associated with the userHandle itself</li>
* </ul>
*
@@ -8688,17 +8633,6 @@
.write();
}
- // Set the latest screen capture policy, overriding any existing ones.
- // userHandle can be one of USER_ALL, USER_NULL or a concrete userId.
- private void setScreenCaptureDisabled(int userHandle) {
- int current = mPolicyCache.getScreenCaptureDisallowedUser();
- if (userHandle == current) {
- return;
- }
- mPolicyCache.setScreenCaptureDisallowedUser(userHandle);
- updateScreenCaptureDisabled();
- }
-
/**
* Returns whether or not screen capture is disabled for any active admin.
*/
@@ -9915,16 +9849,6 @@
return doOrPo;
}
- ActiveAdmin getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceParentLocked(int userId) {
- ensureLocked();
- ActiveAdmin admin = getDeviceOwnerAdminLocked();
- if (admin != null) {
- return admin;
- }
- admin = getProfileOwnerOfOrganizationOwnedDeviceLocked(userId);
- return admin != null ? admin.getParentActiveAdmin() : null;
- }
-
@Override
public void clearDeviceOwner(String packageName) {
Objects.requireNonNull(packageName, "packageName is null");
@@ -10253,13 +10177,6 @@
return mInjector.hasUserSetupCompleted(getUserData(userHandle));
}
- private boolean hasPaired(int userHandle) {
- if (!mHasFeature) {
- return true;
- }
- return getUserData(userHandle).mPaired;
- }
-
@Override
public int getUserProvisioningState(int userHandle) {
if (!mHasFeature) {
@@ -11054,16 +10971,6 @@
return enforcingAdmin;
}
- private void enforceCanCallLockTaskLocked(CallerIdentity caller) {
- Preconditions.checkCallAuthorization(isProfileOwner(caller)
- || isDefaultDeviceOwner(caller) || isFinancedDeviceOwner(caller));
-
- final int userId = caller.getUserId();
- if (!canDPCManagedUserUseLockTaskLocked(userId)) {
- throw new SecurityException("User " + userId + " is not allowed to use lock task");
- }
- }
-
private boolean isSystemUid(CallerIdentity caller) {
return UserHandle.isSameApp(caller.getUid(), Process.SYSTEM_UID);
}
@@ -12413,7 +12320,8 @@
if (Flags.headlessDeviceOwnerSingleUserEnabled()) {
// Block this method if the device is in headless main user mode
Preconditions.checkCallAuthorization(
- getHeadlessDeviceOwnerModeForDeviceOwner()
+ !mInjector.userManagerIsHeadlessSystemUserMode()
+ || getHeadlessDeviceOwnerModeForDeviceOwner()
!= HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER,
"createAndManageUser was called while in headless single user mode");
}
@@ -14595,15 +14503,6 @@
}
}
- private void setLockTaskPackagesLocked(int userHandle, List<String> packages) {
- DevicePolicyData policy = getUserData(userHandle);
- policy.mLockTaskPackages = packages;
-
- // Store the settings persistently.
- saveSettingsLocked(userHandle);
- updateLockTaskPackagesLocked(mContext, packages, userHandle);
- }
-
@Override
public String[] getLockTaskPackages(ComponentName who, String callerPackageName) {
CallerIdentity caller = getCallerIdentity(who, callerPackageName);
@@ -14653,7 +14552,6 @@
"Cannot use LOCK_TASK_FEATURE_NOTIFICATIONS without LOCK_TASK_FEATURE_HOME");
CallerIdentity caller = getCallerIdentity(who, callerPackageName);
- final int userHandle = caller.getUserId();
synchronized (getLockObject()) {
checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_LOCK_TASK_FEATURES);
}
@@ -14689,13 +14587,6 @@
}
}
- private void setLockTaskFeaturesLocked(int userHandle, int flags) {
- DevicePolicyData policy = getUserData(userHandle);
- policy.mLockTaskFeatures = flags;
- saveSettingsLocked(userHandle);
- updateLockTaskFeaturesLocked(flags, userHandle);
- }
-
@Override
public int getLockTaskFeatures(ComponentName who, String callerPackageName) {
CallerIdentity caller = getCallerIdentity(who, callerPackageName);
@@ -16171,29 +16062,6 @@
}
}
-
- /**
- * Excludes restrictions imposed by UserManager.
- */
- private List<UserManager.EnforcingUser> getDevicePolicySources(
- List<UserManager.EnforcingUser> sources) {
- int sizeBefore = sources.size();
- List<UserManager.EnforcingUser> realSources = new ArrayList<>(sizeBefore);
- for (int i = 0; i < sizeBefore; i++) {
- UserManager.EnforcingUser source = sources.get(i);
- int type = source.getUserRestrictionSource();
- if (type != UserManager.RESTRICTION_SOURCE_PROFILE_OWNER
- && type != UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) {
- // TODO(b/128928355): add unit test
- Slogf.d(LOG_TAG, "excluding source of type %s at index %d",
- userRestrictionSourceToString(type), i);
- continue;
- }
- realSources.add(source);
- }
- return realSources;
- }
-
private static String userRestrictionSourceToString(@UserRestrictionSource int source) {
return DebugUtils.flagsToString(UserManager.class, "RESTRICTION_", source);
}
@@ -20870,17 +20738,6 @@
}
}
- private void suspendPersonalAppsInPackageManager(int userId) {
- mInjector.binderWithCleanCallingIdentity(() -> {
- final String[] appsToSuspend = mInjector.getPersonalAppsForSuspension(userId);
- final String[] failedApps = mInjector.getPackageManagerInternal()
- .setPackagesSuspendedByAdmin(userId, appsToSuspend, true);
- if (!ArrayUtils.isEmpty(failedApps)) {
- Slogf.wtf(LOG_TAG, "Failed to suspend apps: " + String.join(",", failedApps));
- }
- });
- }
-
private void notifyIfManagedSubscriptionsAreUnavailable(
UserHandle managedProfile, boolean managedProfileAvailable) {
if (!isManagedProfile(managedProfile.getIdentifier())) {
@@ -23329,14 +23186,6 @@
return getEnforcingAdminForCaller(admin, callerPackageName);
}
- private static final HashMap<String, String> POLICY_IDENTIFIER_TO_PERMISSION = new HashMap<>();
- {
- POLICY_IDENTIFIER_TO_PERMISSION.put(AUTO_TIMEZONE_POLICY, SET_TIME_ZONE);
- }
-
- private static final HashMap<String, Integer> POLICY_IDENTIFIER_TO_ACTIVE_ADMIN_POLICY =
- new HashMap<>();
-
/**
* Checks if the calling process has been granted permission to apply a device policy.
*
@@ -23355,7 +23204,6 @@
}
}
-
/**
* Checks if the calling process has been granted permission to apply a device policy on a
* specific user. Only one permission provided in the list needs to be granted to pass this
@@ -23472,10 +23320,12 @@
}
private boolean hasAdminPolicy(int adminPolicy, String callerPackageName) {
- CallerIdentity caller = getCallerIdentity(callerPackageName);
- ActiveAdmin deviceAdmin = getActiveAdminWithPolicyForUidLocked(
- null, adminPolicy, caller.getUid());
- return deviceAdmin != null;
+ synchronized (getLockObject()) {
+ CallerIdentity caller = getCallerIdentity(callerPackageName);
+ ActiveAdmin deviceAdmin = getActiveAdminWithPolicyForUidLocked(
+ null, adminPolicy, caller.getUid());
+ return deviceAdmin != null;
+ }
}
/**
@@ -24455,52 +24305,6 @@
}
}
- // We need to add a mapping of policyId to permission in POLICY_IDENTIFIER_TO_PERMISSION
- // for each migrated permission.
- private List<ActiveAdmin> getNonDPCActiveAdminsForPolicyLocked(String policyIdentifier) {
- Integer activeAdminPolicy = POLICY_IDENTIFIER_TO_ACTIVE_ADMIN_POLICY.get(policyIdentifier);
- if (activeAdminPolicy == null) {
- Slogf.e(LOG_TAG,
- "Can't find a active admin policy for %s in POLICY_IDENTIFIER_TO_PERMISSION",
- policyIdentifier);
- return new ArrayList<>();
- }
-
- List<ActiveAdmin> admins = new ArrayList<>();
- for (UserInfo userInfo : mUserManager.getUsers()) {
- List<ComponentName> activeAdmins = getActiveAdmins(userInfo.id);
- for (ComponentName admin : activeAdmins) {
- if (isDeviceOwner(admin, userInfo.id) || isProfileOwner(admin, userInfo.id)) {
- continue;
- }
- DevicePolicyData policy = getUserDataUnchecked(userInfo.id);
- if (isActiveAdminWithPolicyForUserLocked(
- policy.mAdminMap.get(admin), activeAdminPolicy,
- userInfo.id)) {
- admins.add(policy.mAdminMap.get(admin));
- }
- }
- }
- return admins;
- }
-
- // TODO: this can actually accept an EnforcingAdmin that gets created in the permission
- // check method.
- private boolean isCallerActiveAdminOrDelegate(
- CallerIdentity caller, @Nullable String delegateScope) {
- return mInjector.binderWithCleanCallingIdentity(() -> {
- List<ComponentName> activeAdmins = getActiveAdmins(caller.getUserId());
- if (activeAdmins != null) {
- for (ComponentName admin : activeAdmins) {
- if (admin.getPackageName().equals(caller.getPackageName())) {
- return true;
- }
- }
- }
- return delegateScope != null && isCallerDelegate(caller, delegateScope);
- });
- }
-
private ActiveAdmin getActiveAdminForCaller(@Nullable ComponentName who,
CallerIdentity caller) {
synchronized (getLockObject()) {
diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleStateTransitions.java b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleStateTransitions.java
index 16daacb..aa7532a 100644
--- a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleStateTransitions.java
+++ b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleStateTransitions.java
@@ -412,7 +412,7 @@
/* stickyKeepInnerUntil45Degrees */ true,
PreferredScreen.INNER,
/* setStickyKeepOuterUntil90Degrees */ null,
- /* setStickyKeepInnerUntil45Degrees */ false
+ /* setStickyKeepInnerUntil45Degrees */ null
));
DEFAULT_STATE_TRANSITIONS.add(new StateTransition(
HingeAngle.ANGLE_45_TO_90,
@@ -492,7 +492,7 @@
/* stickyKeepInnerUntil45Degrees */ true,
PreferredScreen.INNER,
/* setStickyKeepOuterUntil90Degrees */ null,
- /* setStickyKeepInnerUntil45Degrees */ false
+ /* setStickyKeepInnerUntil45Degrees */ null
));
DEFAULT_STATE_TRANSITIONS.add(new StateTransition(
HingeAngle.ANGLE_45_TO_90,
diff --git a/services/foldables/devicestateprovider/tests/src/com/android/server/policy/BookStyleDeviceStatePolicyTest.java b/services/foldables/devicestateprovider/tests/src/com/android/server/policy/BookStyleDeviceStatePolicyTest.java
index 9f07aa8..2d725d1 100644
--- a/services/foldables/devicestateprovider/tests/src/com/android/server/policy/BookStyleDeviceStatePolicyTest.java
+++ b/services/foldables/devicestateprovider/tests/src/com/android/server/policy/BookStyleDeviceStatePolicyTest.java
@@ -511,7 +511,7 @@
}
@Test
- public void test_unfoldTo60Degrees_andFoldTo10_switchesToClosedState() {
+ public void test_unfoldTo60Degrees_andFoldTo10_doesNotSwitchToClosedState() {
sendHingeAngle(0f);
sendRightSideFlatSensorEvent(false);
mProvider.setListener(mListener);
@@ -522,6 +522,36 @@
sendHingeAngle(10f);
+ verify(mListener, never()).onStateChanged(anyInt());
+ }
+
+ @Test
+ public void test_unfoldTo100Degrees_andFoldTo10_switchesToClosedState() {
+ sendHingeAngle(0f);
+ sendRightSideFlatSensorEvent(false);
+ mProvider.setListener(mListener);
+ assertLatestReportedState(DEVICE_STATE_CLOSED);
+ sendHingeAngle(100f);
+ assertLatestReportedState(DEVICE_STATE_HALF_OPENED);
+ clearInvocations(mListener);
+
+ sendHingeAngle(10f);
+
+ verify(mListener).onStateChanged(DEVICE_STATE_CLOSED);
+ }
+
+ @Test
+ public void test_unfoldTo10Degrees_andFoldTo0_switchesToClosedState() {
+ sendHingeAngle(0f);
+ sendRightSideFlatSensorEvent(false);
+ mProvider.setListener(mListener);
+ assertLatestReportedState(DEVICE_STATE_CLOSED);
+ sendHingeAngle(10f);
+ assertLatestReportedState(DEVICE_STATE_HALF_OPENED);
+ clearInvocations(mListener);
+
+ sendHingeAngle(0f);
+
verify(mListener).onStateChanged(DEVICE_STATE_CLOSED);
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 648b810..8caf5ae 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -91,6 +91,7 @@
import android.util.Dumpable;
import android.util.EventLog;
import android.util.IndentingPrintWriter;
+import android.util.Log;
import android.util.Pair;
import android.util.Slog;
import android.util.TimeUtils;
@@ -2005,9 +2006,11 @@
mSystemServiceManager.startService(new FontManagerService.Lifecycle(context, safeMode));
t.traceEnd();
- t.traceBegin("StartTextServicesManager");
- mSystemServiceManager.startService(TextServicesManagerService.Lifecycle.class);
- t.traceEnd();
+ if (!isWatch || !android.server.Flags.removeTextService()) {
+ t.traceBegin("StartTextServicesManager");
+ mSystemServiceManager.startService(TextServicesManagerService.Lifecycle.class);
+ t.traceEnd();
+ }
if (!disableSystemTextClassifier) {
t.traceBegin("StartTextClassificationManagerService");
diff --git a/services/java/com/android/server/flags.aconfig b/services/java/com/android/server/flags.aconfig
index 854bc0f..38354e8 100644
--- a/services/java/com/android/server/flags.aconfig
+++ b/services/java/com/android/server/flags.aconfig
@@ -8,3 +8,10 @@
is_fixed_read_only: true
bug: "324153471"
}
+
+flag {
+ name: "remove_text_service"
+ namespace: "wear_frameworks"
+ description: "Remove TextServiceManagerService on Wear"
+ bug: "323720705"
+}
\ No newline at end of file
diff --git a/services/permission/java/com/android/server/permission/access/appop/AppOpService.kt b/services/permission/java/com/android/server/permission/access/appop/AppOpService.kt
index c0d988d..b0c7073 100644
--- a/services/permission/java/com/android/server/permission/access/appop/AppOpService.kt
+++ b/services/permission/java/com/android/server/permission/access/appop/AppOpService.kt
@@ -20,6 +20,7 @@
import android.companion.virtual.VirtualDeviceManager
import android.os.Handler
import android.os.UserHandle
+import android.permission.PermissionManager
import android.permission.flags.Flags
import android.util.ArrayMap
import android.util.ArraySet
@@ -142,7 +143,7 @@
}
}
- override fun getNonDefaultUidModes(uid: Int, persistentDeviceId: String): SparseIntArray {
+ override fun getNonDefaultUidModes(uid: Int, deviceId: String): SparseIntArray {
val appId = UserHandle.getAppId(uid)
val userId = UserHandle.getUserId(uid)
service.getState {
@@ -150,7 +151,8 @@
with(appIdPolicy) { opNameMapToOpSparseArray(getAppOpModes(appId, userId)?.map) }
if (Flags.runtimePermissionAppopsMappingEnabled()) {
runtimePermissionNameToAppOp.forEachIndexed { _, permissionName, appOpCode ->
- val mode = getUidModeFromPermissionState(appId, userId, permissionName)
+ val mode =
+ getUidModeFromPermissionState(appId, userId, permissionName, deviceId)
if (mode != AppOpsManager.opToDefaultMode(appOpCode)) {
modes[appOpCode] = mode
}
@@ -165,7 +167,7 @@
return opNameMapToOpSparseArray(getPackageModes(packageName, userId))
}
- override fun getUidMode(uid: Int, persistentDeviceId: String, op: Int): Int {
+ override fun getUidMode(uid: Int, deviceId: String, op: Int): Int {
val appId = UserHandle.getAppId(uid)
val userId = UserHandle.getUserId(uid)
val opName = AppOpsManager.opToPublicName(op)
@@ -174,7 +176,9 @@
return if (!Flags.runtimePermissionAppopsMappingEnabled() || permissionName == null) {
service.getState { with(appIdPolicy) { getAppOpMode(appId, userId, opName) } }
} else {
- service.getState { getUidModeFromPermissionState(appId, userId, permissionName) }
+ service.getState {
+ getUidModeFromPermissionState(appId, userId, permissionName, deviceId)
+ }
}
}
@@ -187,15 +191,31 @@
private fun GetStateScope.getUidModeFromPermissionState(
appId: Int,
userId: Int,
- permissionName: String
+ permissionName: String,
+ deviceId: String
): Int {
+ val checkDevicePermissionFlags =
+ deviceId != VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT &&
+ permissionName in PermissionManager.DEVICE_AWARE_PERMISSIONS
val permissionFlags =
- with(permissionPolicy) { getPermissionFlags(appId, userId, permissionName) }
+ if (checkDevicePermissionFlags) {
+ with(devicePermissionPolicy) {
+ getPermissionFlags(appId, deviceId, userId, permissionName)
+ }
+ } else {
+ with(permissionPolicy) { getPermissionFlags(appId, userId, permissionName) }
+ }
val backgroundPermissionName = foregroundToBackgroundPermissionName[permissionName]
val backgroundPermissionFlags =
if (backgroundPermissionName != null) {
- with(permissionPolicy) {
- getPermissionFlags(appId, userId, backgroundPermissionName)
+ if (checkDevicePermissionFlags) {
+ with(devicePermissionPolicy) {
+ getPermissionFlags(appId, deviceId, userId, backgroundPermissionName)
+ }
+ } else {
+ with(permissionPolicy) {
+ getPermissionFlags(appId, userId, backgroundPermissionName)
+ }
}
} else {
PermissionFlags.RUNTIME_GRANTED
@@ -207,7 +227,7 @@
val fullerPermissionName =
PermissionService.getFullerPermission(permissionName) ?: return result
- return getUidModeFromPermissionState(appId, userId, fullerPermissionName)
+ return getUidModeFromPermissionState(appId, userId, fullerPermissionName, deviceId)
}
private fun evaluateModeFromPermissionFlags(
@@ -224,7 +244,7 @@
MODE_IGNORED
}
- override fun setUidMode(uid: Int, persistentDeviceId: String, code: Int, mode: Int): Boolean {
+ override fun setUidMode(uid: Int, deviceId: String, code: Int, mode: Int): Boolean {
if (
Flags.runtimePermissionAppopsMappingEnabled() && code in runtimeAppOpToPermissionNames
) {
@@ -308,7 +328,7 @@
// and we have our own persistence.
}
- override fun getForegroundOps(uid: Int, persistentDeviceId: String): SparseBooleanArray {
+ override fun getForegroundOps(uid: Int, deviceId: String): SparseBooleanArray {
return SparseBooleanArray().apply {
getUidModes(uid)?.forEachIndexed { _, op, mode ->
if (mode == AppOpsManager.MODE_FOREGROUND) {
@@ -317,7 +337,7 @@
}
if (Flags.runtimePermissionAppopsMappingEnabled()) {
foregroundableOps.forEachIndexed { _, op, _ ->
- if (getUidMode(uid, persistentDeviceId, op) == AppOpsManager.MODE_FOREGROUND) {
+ if (getUidMode(uid, deviceId, op) == AppOpsManager.MODE_FOREGROUND) {
this[op] = true
}
}
@@ -501,7 +521,7 @@
)
}
}
- ?: runtimePermissionNameToAppOp[permissionName]?.let { appOpCode ->
+ ?: runtimePermissionNameToAppOp[permissionName]?.let { appOpCode ->
addPendingChangedModeIfNeeded(
appId,
userId,
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
index 2134278..1535298 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
@@ -38,7 +38,6 @@
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.Until;
import android.util.Log;
-import android.view.KeyEvent;
import android.view.WindowManagerGlobal;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
@@ -601,28 +600,6 @@
false /* orientationPortrait */);
}
- @Test
- public void switchesKeyboardLayout_withShortcut_onlyIfImeVisible() throws Exception {
- setShowImeWithHardKeyboard(true /* enabled */);
-
- assertThat(mInputMethodService.isInputViewShown()).isFalse();
- assertThat(mInputMethodService.onKeyDown(KeyEvent.KEYCODE_SPACE,
- new KeyEvent(0 /* downTime */, 0 /* eventTime */, KeyEvent.ACTION_DOWN,
- KeyEvent.KEYCODE_SPACE, 0 /* repeat */,
- KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON))).isFalse();
-
- verifyInputViewStatusOnMainSync(
- () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
- true /* expected */,
- true /* inputViewStarted */);
-
- assertThat(mInputMethodService.isInputViewShown()).isTrue();
- assertThat(mInputMethodService.onKeyDown(KeyEvent.KEYCODE_SPACE,
- new KeyEvent(0 /* downTime */, 0 /* eventTime */, KeyEvent.ACTION_DOWN,
- KeyEvent.KEYCODE_SPACE, 0 /* repeat */,
- KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON))).isTrue();
- }
-
/**
* This checks that when the system navigation bar is not created (e.g. emulator),
* then the IME caption bar is also not created.
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayBrightnessStateTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayBrightnessStateTest.java
index 6d89e80..8db896b 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayBrightnessStateTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayBrightnessStateTest.java
@@ -47,6 +47,7 @@
float sdrBrightness = 0.2f;
boolean shouldUseAutoBrightness = true;
boolean shouldUpdateScreenBrightnessSetting = true;
+ int brightnessAdjustmentFlag = 2;
BrightnessReason brightnessReason = new BrightnessReason();
brightnessReason.setReason(BrightnessReason.REASON_AUTOMATIC);
brightnessReason.setModifier(BrightnessReason.MODIFIER_DIMMED);
@@ -56,6 +57,7 @@
.setBrightnessReason(brightnessReason)
.setShouldUseAutoBrightness(shouldUseAutoBrightness)
.setShouldUpdateScreenBrightnessSetting(shouldUpdateScreenBrightnessSetting)
+ .setBrightnessAdjustmentFlag(brightnessAdjustmentFlag)
.build();
assertEquals(displayBrightnessState.getBrightness(), brightness, FLOAT_DELTA);
@@ -105,7 +107,9 @@
.append("\n shouldUpdateScreenBrightnessSetting:")
.append(displayBrightnessState.shouldUpdateScreenBrightnessSetting())
.append("\n mBrightnessEvent:")
- .append(Objects.toString(displayBrightnessState.getBrightnessEvent(), "null"));
+ .append(Objects.toString(displayBrightnessState.getBrightnessEvent(), "null"))
+ .append("\n mBrightnessAdjustmentFlag:")
+ .append(displayBrightnessState.getBrightnessAdjustmentFlag());
return sb.toString();
}
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
index de93914..78ebdb1 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -1312,7 +1312,7 @@
when(mHolder.hbmController.getHighBrightnessMode()).thenReturn(
BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR);
when(mHolder.hbmController.getHdrBrightnessValue()).thenReturn(PowerManager.BRIGHTNESS_MAX);
- when(mHolder.hdrClamper.getMaxBrightness()).thenReturn(clampedBrightness);
+ when(mHolder.hdrClamper.clamp(PowerManager.BRIGHTNESS_MAX)).thenReturn(clampedBrightness);
when(mHolder.hdrClamper.getTransitionRate()).thenReturn(transitionRate);
mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
index 1ae4099..13a1445 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
@@ -20,6 +20,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -113,7 +114,8 @@
when(mDisplayBrightnessStrategySelector.selectStrategy(
any(StrategySelectionRequest.class))).thenReturn(displayBrightnessStrategy);
mDisplayBrightnessController.updateBrightness(displayPowerRequest, targetDisplayState);
- verify(displayBrightnessStrategy).updateBrightness(displayPowerRequest);
+ verify(displayBrightnessStrategy).updateBrightness(
+ eq(new StrategyExecutionRequest(displayPowerRequest, DEFAULT_BRIGHTNESS)));
assertEquals(mDisplayBrightnessController.getCurrentDisplayBrightnessStrategy(),
displayBrightnessStrategy);
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
index 39ffe5b..c785ea6 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
@@ -221,6 +221,18 @@
assertEquals(0.04f, mHdrClamper.getTransitionRate(), FLOAT_TOLERANCE);
}
+ @Test
+ public void testCalmper_transitionRateOverriddenByOtherRequest() {
+ mHdrClamper.onAmbientLuxChange(499);
+
+ mClock.fastForward(3000);
+ mTestHandler.timeAdvance();
+ assertEquals(0.6f, mHdrClamper.getMaxBrightness(), FLOAT_TOLERANCE);
+ assertEquals(0.04, mHdrClamper.getTransitionRate(), FLOAT_TOLERANCE);
+ // getTransitionRate should reset transitionRate
+ assertEquals(-1f, mHdrClamper.getTransitionRate(), FLOAT_TOLERANCE);
+ }
+
// MsgInfo.sendTime is calculated first by adding SystemClock.uptimeMillis()
// (in Handler.sendMessageDelayed) and then by subtracting SystemClock.uptimeMillis()
// (in TestHandler.sendMessageAtTime, there might be several milliseconds difference between
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
index 6e163ca..54f2268 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
@@ -41,8 +41,10 @@
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.internal.util.test.FakeSettingsProviderRule;
import com.android.server.display.AutomaticBrightnessController;
+import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessEvent;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import org.junit.After;
import org.junit.Before;
@@ -295,15 +297,11 @@
mContext.getContentResolver(),
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
UserHandle.USER_CURRENT), 0.0f);
- assertEquals(BrightnessReason.ADJUSTMENT_AUTO,
- mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentReasonsFlags());
float invalidBrightness = -0.5f;
mAutomaticBrightnessStrategy
.adjustAutomaticBrightnessStateIfValid(invalidBrightness);
assertEquals(autoBrightnessAdjustment,
mAutomaticBrightnessStrategy.getAutoBrightnessAdjustment(), 0.0f);
- assertEquals(0,
- mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentReasonsFlags());
}
@Test
@@ -426,6 +424,80 @@
assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessValid());
}
+ @Test
+ public void
+ updateBrightness_constructsDisplayBrightnessState_withAdjustmentAutoAdjustmentFlag() {
+ BrightnessEvent brightnessEvent = new BrightnessEvent(DISPLAY_ID);
+ mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy(
+ mContext, DISPLAY_ID, displayId -> brightnessEvent);
+ new AutomaticBrightnessStrategy(mContext, DISPLAY_ID);
+ mAutomaticBrightnessStrategy.setAutomaticBrightnessController(
+ mAutomaticBrightnessController);
+ float brightness = 0.4f;
+ BrightnessReason brightnessReason = new BrightnessReason();
+ brightnessReason.setReason(BrightnessReason.REASON_AUTOMATIC);
+ when(mAutomaticBrightnessController.getAutomaticScreenBrightness(brightnessEvent))
+ .thenReturn(brightness);
+
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mock(DisplayManagerInternal.DisplayPowerRequest.class);
+ DisplayBrightnessState expectedDisplayBrightnessState = new DisplayBrightnessState.Builder()
+ .setBrightness(brightness)
+ .setSdrBrightness(brightness)
+ .setBrightnessReason(brightnessReason)
+ .setDisplayBrightnessStrategyName(mAutomaticBrightnessStrategy.getName())
+ .setIsSlowChange(false)
+ .setBrightnessEvent(brightnessEvent)
+ .setBrightnessAdjustmentFlag(BrightnessReason.ADJUSTMENT_AUTO)
+ .setShouldUpdateScreenBrightnessSetting(true)
+ .build();
+ DisplayBrightnessState actualDisplayBrightnessState = mAutomaticBrightnessStrategy
+ .updateBrightness(new StrategyExecutionRequest(displayPowerRequest, 0.6f));
+ assertEquals(expectedDisplayBrightnessState, actualDisplayBrightnessState);
+ }
+
+ @Test
+ public void
+ updateBrightness_constructsDisplayBrightnessState_withAdjustmentTempAdjustmentFlag() {
+ BrightnessEvent brightnessEvent = new BrightnessEvent(DISPLAY_ID);
+ mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy(
+ mContext, DISPLAY_ID, displayId -> brightnessEvent);
+ new AutomaticBrightnessStrategy(mContext, DISPLAY_ID);
+ mAutomaticBrightnessStrategy.setAutomaticBrightnessController(
+ mAutomaticBrightnessController);
+ float brightness = 0.4f;
+ BrightnessReason brightnessReason = new BrightnessReason();
+ brightnessReason.setReason(BrightnessReason.REASON_AUTOMATIC);
+ when(mAutomaticBrightnessController.getAutomaticScreenBrightness(brightnessEvent))
+ .thenReturn(brightness);
+
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mock(DisplayManagerInternal.DisplayPowerRequest.class);
+ float temporaryBrightness = 0.3f;
+ float autoBrightnessAdjustment = 0.1f;
+ mAutomaticBrightnessStrategy.setTemporaryAutoBrightnessAdjustment(temporaryBrightness);
+ mAutomaticBrightnessStrategy.accommodateUserBrightnessChanges(true,
+ brightness, DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT,
+ Display.STATE_ON, mock(BrightnessConfiguration.class),
+ AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED);
+ when(mAutomaticBrightnessController.getAutomaticScreenBrightnessAdjustment()).thenReturn(
+ autoBrightnessAdjustment);
+
+ DisplayBrightnessState expectedDisplayBrightnessState = new DisplayBrightnessState.Builder()
+ .setBrightness(brightness)
+ .setSdrBrightness(brightness)
+ .setBrightnessReason(brightnessReason)
+ .setDisplayBrightnessStrategyName(mAutomaticBrightnessStrategy.getName())
+ .setIsSlowChange(false)
+ .setBrightnessEvent(brightnessEvent)
+ .setBrightnessAdjustmentFlag(BrightnessReason.ADJUSTMENT_AUTO_TEMP)
+ .setShouldUpdateScreenBrightnessSetting(true)
+ .build();
+ DisplayBrightnessState actualDisplayBrightnessState = mAutomaticBrightnessStrategy
+ .updateBrightness(new StrategyExecutionRequest(displayPowerRequest, 0.6f));
+ assertEquals(expectedDisplayBrightnessState, actualDisplayBrightnessState);
+ }
+
private void setPendingAutoBrightnessAdjustment(float pendingAutoBrightnessAdjustment) {
Settings.System.putFloat(mContext.getContentResolver(),
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, pendingAutoBrightnessAdjustment);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/BoostBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/BoostBrightnessStrategyTest.java
index c434631..47f1746 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/BoostBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/BoostBrightnessStrategyTest.java
@@ -27,6 +27,7 @@
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import org.junit.Before;
import org.junit.Test;
@@ -58,7 +59,8 @@
.setDisplayBrightnessStrategyName(mBoostBrightnessStrategy.getName())
.build();
DisplayBrightnessState updatedDisplayBrightnessState =
- mBoostBrightnessStrategy.updateBrightness(displayPowerRequest);
+ mBoostBrightnessStrategy.updateBrightness(
+ new StrategyExecutionRequest(displayPowerRequest, 0.2f));
assertEquals(updatedDisplayBrightnessState, expectedDisplayBrightnessState);
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/DozeBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/DozeBrightnessStrategyTest.java
index d60caf6..9246780 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/DozeBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/DozeBrightnessStrategyTest.java
@@ -25,6 +25,7 @@
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import org.junit.Before;
import org.junit.Test;
@@ -55,7 +56,8 @@
.setDisplayBrightnessStrategyName(mDozeBrightnessModeStrategy.getName())
.build();
DisplayBrightnessState updatedDisplayBrightnessState =
- mDozeBrightnessModeStrategy.updateBrightness(displayPowerRequest);
+ mDozeBrightnessModeStrategy.updateBrightness(
+ new StrategyExecutionRequest(displayPowerRequest, 0.2f));
assertEquals(updatedDisplayBrightnessState, expectedDisplayBrightnessState);
}
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/FollowerBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/FollowerBrightnessStrategyTest.java
index d8569f7..682c9cc 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/FollowerBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/FollowerBrightnessStrategyTest.java
@@ -26,6 +26,7 @@
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import org.junit.Before;
import org.junit.Test;
@@ -59,7 +60,8 @@
.setIsSlowChange(slowChange)
.build();
DisplayBrightnessState updatedDisplayBrightnessState =
- mFollowerBrightnessStrategy.updateBrightness(displayPowerRequest);
+ mFollowerBrightnessStrategy.updateBrightness(
+ new StrategyExecutionRequest(displayPowerRequest, 0.2f));
assertEquals(expectedDisplayBrightnessState, updatedDisplayBrightnessState);
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OffloadBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OffloadBrightnessStrategyTest.java
index c2fa4eb..ccf6309 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OffloadBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OffloadBrightnessStrategyTest.java
@@ -28,6 +28,7 @@
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import com.android.server.display.feature.DisplayManagerFlags;
@@ -70,7 +71,8 @@
.setShouldUpdateScreenBrightnessSetting(true)
.build();
DisplayBrightnessState updatedDisplayBrightnessState =
- mOffloadBrightnessStrategy.updateBrightness(displayPowerRequest);
+ mOffloadBrightnessStrategy.updateBrightness(
+ new StrategyExecutionRequest(displayPowerRequest, 0.2f));
assertEquals(updatedDisplayBrightnessState, expectedDisplayBrightnessState);
assertEquals(PowerManager.BRIGHTNESS_INVALID_FLOAT, mOffloadBrightnessStrategy
.getOffloadScreenBrightness(), 0.0f);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OverrideBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OverrideBrightnessStrategyTest.java
index 530245d..8e7b463 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OverrideBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OverrideBrightnessStrategyTest.java
@@ -26,6 +26,7 @@
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import org.junit.Before;
import org.junit.Test;
@@ -58,7 +59,8 @@
.setDisplayBrightnessStrategyName(mOverrideBrightnessStrategy.getName())
.build();
DisplayBrightnessState updatedDisplayBrightnessState =
- mOverrideBrightnessStrategy.updateBrightness(displayPowerRequest);
+ mOverrideBrightnessStrategy.updateBrightness(
+ new StrategyExecutionRequest(displayPowerRequest, 0.2f));
assertEquals(updatedDisplayBrightnessState, expectedDisplayBrightnessState);
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategyTest.java
index 7147aa8..e799d0e 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategyTest.java
@@ -26,6 +26,7 @@
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import org.junit.Before;
import org.junit.Test;
@@ -56,7 +57,8 @@
.getName())
.build();
DisplayBrightnessState updatedDisplayBrightnessState =
- mScreenOffBrightnessModeStrategy.updateBrightness(displayPowerRequest);
+ mScreenOffBrightnessModeStrategy.updateBrightness(
+ new StrategyExecutionRequest(displayPowerRequest, 0.2f));
assertEquals(updatedDisplayBrightnessState, expectedDisplayBrightnessState);
}
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategyTest.java
index 9830edb..aaada41 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategyTest.java
@@ -26,6 +26,7 @@
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategyExecutionRequest;
import org.junit.Before;
import org.junit.Test;
@@ -58,7 +59,8 @@
.setDisplayBrightnessStrategyName(mTemporaryBrightnessStrategy.getName())
.build();
DisplayBrightnessState updatedDisplayBrightnessState =
- mTemporaryBrightnessStrategy.updateBrightness(displayPowerRequest);
+ mTemporaryBrightnessStrategy.updateBrightness(
+ new StrategyExecutionRequest(displayPowerRequest, 0.2f));
assertEquals(updatedDisplayBrightnessState, expectedDisplayBrightnessState);
}
diff --git a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamAccessibilityTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamAccessibilityTest.java
new file mode 100644
index 0000000..99968d5
--- /dev/null
+++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamAccessibilityTest.java
@@ -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.server.dreams;
+
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.service.dreams.utils.DreamAccessibility;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DreamAccessibilityTest {
+
+ @Mock
+ private View mView;
+
+ @Mock
+ private Context mContext;
+
+ @Mock
+ private Resources mResources;
+
+ @Mock
+ private AccessibilityNodeInfo mAccessibilityNodeInfo;
+
+ @Captor
+ private ArgumentCaptor<View.AccessibilityDelegate> mAccessibilityDelegateArgumentCaptor;
+
+ private DreamAccessibility mDreamAccessibility;
+ private static final String CUSTOM_ACTION = "Custom Action";
+ private static final String EXISTING_ACTION = "Existing Action";
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mDreamAccessibility = new DreamAccessibility(mContext, mView);
+
+ when(mContext.getResources()).thenReturn(mResources);
+ when(mResources.getString(R.string.dream_accessibility_action_click))
+ .thenReturn(CUSTOM_ACTION);
+ }
+ /**
+ * Test to verify the configuration of accessibility actions within a view delegate.
+ */
+ @Test
+ public void testConfigureAccessibilityActions() {
+ when(mAccessibilityNodeInfo.getActionList()).thenReturn(new ArrayList<>());
+
+ mDreamAccessibility.updateAccessibilityConfiguration(false);
+
+ verify(mView).setAccessibilityDelegate(mAccessibilityDelegateArgumentCaptor.capture());
+ View.AccessibilityDelegate capturedDelegate =
+ mAccessibilityDelegateArgumentCaptor.getValue();
+
+ capturedDelegate.onInitializeAccessibilityNodeInfo(mView, mAccessibilityNodeInfo);
+
+ verify(mAccessibilityNodeInfo).addAction(argThat(action ->
+ action.getId() == AccessibilityNodeInfo.ACTION_CLICK
+ && TextUtils.equals(action.getLabel(), CUSTOM_ACTION)));
+ }
+
+ /**
+ * Test to verify the configuration of accessibility actions within a view delegate,
+ * specifically checking the removal of an existing click action and addition
+ * of a new custom action.
+ */
+ @Test
+ public void testConfigureAccessibilityActions_RemovesExistingClickAction() {
+ AccessibilityNodeInfo.AccessibilityAction existingAction =
+ new AccessibilityNodeInfo.AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK,
+ EXISTING_ACTION);
+ when(mAccessibilityNodeInfo.getActionList())
+ .thenReturn(Collections.singletonList(existingAction));
+
+ mDreamAccessibility.updateAccessibilityConfiguration(false);
+
+ verify(mView).setAccessibilityDelegate(mAccessibilityDelegateArgumentCaptor.capture());
+ View.AccessibilityDelegate capturedDelegate =
+ mAccessibilityDelegateArgumentCaptor.getValue();
+
+ capturedDelegate.onInitializeAccessibilityNodeInfo(mView, mAccessibilityNodeInfo);
+
+ verify(mAccessibilityNodeInfo).removeAction(existingAction);
+ verify(mAccessibilityNodeInfo).addAction(argThat(action ->
+ action.getId() == AccessibilityNodeInfo.ACTION_CLICK
+ && TextUtils.equals(action.getLabel(), CUSTOM_ACTION)));
+
+ }
+
+ /**
+ * Test to verify the removal of a custom accessibility action within a view delegate.
+ */
+ @Test
+ public void testRemoveCustomAccessibilityAction() {
+
+ AccessibilityNodeInfo.AccessibilityAction existingAction =
+ new AccessibilityNodeInfo.AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK,
+ EXISTING_ACTION);
+ when(mAccessibilityNodeInfo.getActionList())
+ .thenReturn(Collections.singletonList(existingAction));
+
+ mDreamAccessibility.updateAccessibilityConfiguration(false);
+ verify(mView).setAccessibilityDelegate(mAccessibilityDelegateArgumentCaptor.capture());
+ View.AccessibilityDelegate capturedDelegate =
+ mAccessibilityDelegateArgumentCaptor.getValue();
+ when(mView.getAccessibilityDelegate()).thenReturn(capturedDelegate);
+ clearInvocations(mView);
+
+ mDreamAccessibility.updateAccessibilityConfiguration(true);
+ verify(mView).setAccessibilityDelegate(null);
+ }
+
+ /**
+ * Test to verify the removal of custom accessibility action is not called if delegate is not
+ * set by the dreamService.
+ */
+ @Test
+ public void testRemoveCustomAccessibility_DoesNotRemoveDelegateNotSetByDreamAccessibility() {
+ mDreamAccessibility.updateAccessibilityConfiguration(true);
+ verify(mView, never()).setAccessibilityDelegate(any());
+ }
+}
+
diff --git a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java
index db70434..88ab871 100644
--- a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java
+++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java
@@ -19,6 +19,8 @@
import static android.os.PowerManager.USER_ACTIVITY_EVENT_OTHER;
import static android.os.PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
@@ -270,6 +272,31 @@
eq(USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS));
}
+ @Test
+ public void setDreamHasFocus_true_dreamHasFocus() {
+ mDreamController.startDream(mToken, mDreamName, false /*isPreview*/, false /*doze*/,
+ 0 /*userId*/, null /*wakeLock*/, mOverlayName, "test" /*reason*/);
+
+ mDreamController.setDreamHasFocus(true);
+ assertTrue(mDreamController.dreamHasFocus());
+ }
+
+ @Test
+ public void setDreamHasFocus_false_dreamDoesNotHaveFocus() {
+ mDreamController.startDream(mToken, mDreamName, false /*isPreview*/, false /*doze*/,
+ 0 /*userId*/, null /*wakeLock*/, mOverlayName, "test" /*reason*/);
+
+ mDreamController.setDreamHasFocus(false);
+ assertFalse(mDreamController.dreamHasFocus());
+ }
+
+ @Test
+ public void setDreamHasFocus_notDreaming_dreamDoesNotHaveFocus() {
+ mDreamController.setDreamHasFocus(true);
+ // Dream still doesn't have focus because it was never started.
+ assertFalse(mDreamController.dreamHasFocus());
+ }
+
private ServiceConnection captureServiceConnection() {
verify(mContext).bindServiceAsUser(any(), mServiceConnectionACaptor.capture(), anyInt(),
any());
diff --git a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java
index 697548c..4a21645 100644
--- a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java
@@ -25,6 +25,7 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
+import static com.android.server.RescueParty.DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN;
import static com.android.server.RescueParty.LEVEL_FACTORY_RESET;
import static com.android.server.RescueParty.RESCUE_LEVEL_FACTORY_RESET;
@@ -103,8 +104,6 @@
private static final String PROP_DISABLE_FACTORY_RESET_FLAG =
"persist.device_config.configuration.disable_rescue_party_factory_reset";
- private static final int THROTTLING_DURATION_MIN = 10;
-
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@@ -228,6 +227,9 @@
setCrashRecoveryPropRescueBootCount(0);
SystemProperties.set(RescueParty.PROP_ENABLE_RESCUE, Boolean.toString(true));
SystemProperties.set(PROP_DEVICE_CONFIG_DISABLE_FLAG, Boolean.toString(false));
+
+ // enable flag resets for tests
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_RESCUE_PARTY_FLAG_RESETS);
}
@After
@@ -312,6 +314,9 @@
@Test
public void testPersistentAppCrashDetectionWithExecutionForAllRescueLevels() {
+ // this is old test where the flag needs to be disabled
+ mSetFlagsRule.disableFlags(Flags.FLAG_RECOVERABILITY_DETECTION);
+
noteAppCrash(1, true);
verifySettingsResets(Settings.RESET_MODE_UNTRUSTED_DEFAULTS, /*resetNamespaces=*/ null,
@@ -378,6 +383,9 @@
@Test
public void testNonPersistentAppOnlyPerformsFlagResets() {
+ // this is old test where the flag needs to be disabled
+ mSetFlagsRule.disableFlags(Flags.FLAG_RECOVERABILITY_DETECTION);
+
noteAppCrash(1, false);
verifySettingsResets(Settings.RESET_MODE_UNTRUSTED_DEFAULTS, /*resetNamespaces=*/ null,
@@ -628,7 +636,8 @@
public void testThrottlingOnBootFailures() {
setCrashRecoveryPropAttemptingReboot(false);
long now = System.currentTimeMillis();
- long beforeTimeout = now - TimeUnit.MINUTES.toMillis(THROTTLING_DURATION_MIN - 1);
+ long beforeTimeout = now - TimeUnit.MINUTES.toMillis(
+ DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN - 1);
setCrashRecoveryPropLastFactoryReset(beforeTimeout);
for (int i = 1; i <= LEVEL_FACTORY_RESET; i++) {
noteBoot(i);
@@ -641,7 +650,8 @@
mSetFlagsRule.enableFlags(Flags.FLAG_RECOVERABILITY_DETECTION);
setCrashRecoveryPropAttemptingReboot(false);
long now = System.currentTimeMillis();
- long beforeTimeout = now - TimeUnit.MINUTES.toMillis(THROTTLING_DURATION_MIN - 1);
+ long beforeTimeout = now - TimeUnit.MINUTES.toMillis(
+ DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN - 1);
setCrashRecoveryPropLastFactoryReset(beforeTimeout);
for (int i = 1; i <= RESCUE_LEVEL_FACTORY_RESET; i++) {
noteBoot(i);
@@ -653,7 +663,8 @@
public void testThrottlingOnAppCrash() {
setCrashRecoveryPropAttemptingReboot(false);
long now = System.currentTimeMillis();
- long beforeTimeout = now - TimeUnit.MINUTES.toMillis(THROTTLING_DURATION_MIN - 1);
+ long beforeTimeout = now - TimeUnit.MINUTES.toMillis(
+ DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN - 1);
setCrashRecoveryPropLastFactoryReset(beforeTimeout);
for (int i = 0; i <= LEVEL_FACTORY_RESET; i++) {
noteAppCrash(i + 1, true);
@@ -666,7 +677,8 @@
mSetFlagsRule.enableFlags(Flags.FLAG_RECOVERABILITY_DETECTION);
setCrashRecoveryPropAttemptingReboot(false);
long now = System.currentTimeMillis();
- long beforeTimeout = now - TimeUnit.MINUTES.toMillis(THROTTLING_DURATION_MIN - 1);
+ long beforeTimeout = now - TimeUnit.MINUTES.toMillis(
+ DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN - 1);
setCrashRecoveryPropLastFactoryReset(beforeTimeout);
for (int i = 0; i <= RESCUE_LEVEL_FACTORY_RESET; i++) {
noteAppCrash(i + 1, true);
@@ -678,7 +690,8 @@
public void testNotThrottlingAfterTimeoutOnBootFailures() {
setCrashRecoveryPropAttemptingReboot(false);
long now = System.currentTimeMillis();
- long afterTimeout = now - TimeUnit.MINUTES.toMillis(THROTTLING_DURATION_MIN + 1);
+ long afterTimeout = now - TimeUnit.MINUTES.toMillis(
+ DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN + 1);
setCrashRecoveryPropLastFactoryReset(afterTimeout);
for (int i = 1; i <= LEVEL_FACTORY_RESET; i++) {
noteBoot(i);
@@ -691,7 +704,8 @@
mSetFlagsRule.enableFlags(Flags.FLAG_RECOVERABILITY_DETECTION);
setCrashRecoveryPropAttemptingReboot(false);
long now = System.currentTimeMillis();
- long afterTimeout = now - TimeUnit.MINUTES.toMillis(THROTTLING_DURATION_MIN + 1);
+ long afterTimeout = now - TimeUnit.MINUTES.toMillis(
+ DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN + 1);
setCrashRecoveryPropLastFactoryReset(afterTimeout);
for (int i = 1; i <= RESCUE_LEVEL_FACTORY_RESET; i++) {
noteBoot(i);
@@ -703,7 +717,8 @@
public void testNotThrottlingAfterTimeoutOnAppCrash() {
setCrashRecoveryPropAttemptingReboot(false);
long now = System.currentTimeMillis();
- long afterTimeout = now - TimeUnit.MINUTES.toMillis(THROTTLING_DURATION_MIN + 1);
+ long afterTimeout = now - TimeUnit.MINUTES.toMillis(
+ DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN + 1);
setCrashRecoveryPropLastFactoryReset(afterTimeout);
for (int i = 0; i <= LEVEL_FACTORY_RESET; i++) {
noteAppCrash(i + 1, true);
@@ -716,7 +731,8 @@
mSetFlagsRule.enableFlags(Flags.FLAG_RECOVERABILITY_DETECTION);
setCrashRecoveryPropAttemptingReboot(false);
long now = System.currentTimeMillis();
- long afterTimeout = now - TimeUnit.MINUTES.toMillis(THROTTLING_DURATION_MIN + 1);
+ long afterTimeout = now - TimeUnit.MINUTES.toMillis(
+ DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN + 1);
setCrashRecoveryPropLastFactoryReset(afterTimeout);
for (int i = 0; i <= RESCUE_LEVEL_FACTORY_RESET; i++) {
noteAppCrash(i + 1, true);
@@ -794,6 +810,9 @@
@Test
public void testHealthCheckLevels() {
+ // this is old test where the flag needs to be disabled
+ mSetFlagsRule.disableFlags(Flags.FLAG_RECOVERABILITY_DETECTION);
+
RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext);
// Ensure that no action is taken for cases where the failure reason is unknown
diff --git a/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceNotificationTest.java b/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceNotificationTest.java
index 124ae20..a20d935 100644
--- a/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceNotificationTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceNotificationTest.java
@@ -16,15 +16,18 @@
package com.android.server;
+import static android.permission.flags.Flags.FLAG_SENSITIVE_CONTENT_METRICS_BUGFIX;
import static android.permission.flags.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
@@ -34,6 +37,7 @@
import android.media.projection.MediaProjectionInfo;
import android.media.projection.MediaProjectionManager;
import android.os.Process;
+import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
@@ -309,6 +313,26 @@
}
@Test
+ @RequiresFlagsDisabled(FLAG_SENSITIVE_CONTENT_METRICS_BUGFIX)
+ public void mediaProjectionOnStart_flagDisabled_neverSetBlockScreenCaptureForAppsSessionId() {
+ setupSensitiveNotification();
+
+ mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
+
+ verify(mWindowManager, never()).setBlockScreenCaptureForAppsSessionId(anyLong());
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_SENSITIVE_CONTENT_METRICS_BUGFIX)
+ public void mediaProjectionOnStart_setBlockScreenCaptureForAppsSessionId() {
+ setupSensitiveNotification();
+
+ mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
+
+ verify(mWindowManager).setBlockScreenCaptureForAppsSessionId(anyLong());
+ }
+
+ @Test
public void mediaProjectionOnStart_onProjectionStart_setWmBlockedPackages() {
ArraySet<PackageInfo> expectedBlockedPackages = setupSensitiveNotification();
@@ -323,7 +347,7 @@
mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
- verifyZeroInteractions(mWindowManager);
+ verify(mWindowManager, never()).addBlockScreenCaptureForApps(any());
}
@Test
@@ -332,7 +356,7 @@
mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
- verifyZeroInteractions(mWindowManager);
+ verify(mWindowManager, never()).addBlockScreenCaptureForApps(any());
}
@Test
@@ -400,7 +424,7 @@
mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
- verifyZeroInteractions(mWindowManager);
+ verify(mWindowManager, never()).addBlockScreenCaptureForApps(any());
}
@Test
@@ -411,7 +435,7 @@
mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
- verifyZeroInteractions(mWindowManager);
+ verify(mWindowManager, never()).addBlockScreenCaptureForApps(any());
}
@Test
@@ -422,7 +446,7 @@
mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
- verifyZeroInteractions(mWindowManager);
+ verify(mWindowManager, never()).addBlockScreenCaptureForApps(any());
}
@Test
@@ -435,7 +459,7 @@
mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
- verifyZeroInteractions(mWindowManager);
+ verify(mWindowManager, never()).addBlockScreenCaptureForApps(any());
}
@Test
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java
index 5d3e499..75e8e68 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java
@@ -116,7 +116,7 @@
mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 7_000);
mUserWakeupStore.addUserWakeup(USER_ID_1, finalAlarmTime);
assertEquals(1, mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP).length);
- final long alarmTime = mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_1)
+ final long alarmTime = mUserWakeupStore.getWakeupTimeForUser(USER_ID_1)
+ BUFFER_TIME_MS;
assertTrue(finalAlarmTime + USER_START_TIME_DEVIATION_LIMIT_MS >= alarmTime);
assertTrue(finalAlarmTime - USER_START_TIME_DEVIATION_LIMIT_MS <= alarmTime);
@@ -129,8 +129,8 @@
mUserWakeupStore.addUserWakeup(USER_ID_3, TEST_TIMESTAMP - 13_000);
assertEquals(3, mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP).length);
mUserWakeupStore.removeUserWakeup(USER_ID_3);
- assertEquals(-1, mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3));
- assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_2) > 0);
+ assertEquals(-1, mUserWakeupStore.getWakeupTimeForUser(USER_ID_3));
+ assertTrue(mUserWakeupStore.getWakeupTimeForUser(USER_ID_2) > 0);
}
@Test
@@ -139,10 +139,10 @@
mUserWakeupStore.addUserWakeup(USER_ID_2, TEST_TIMESTAMP - 3_000);
mUserWakeupStore.addUserWakeup(USER_ID_3, TEST_TIMESTAMP - 13_000);
assertEquals(mUserWakeupStore.getNextWakeupTime(),
- mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_1));
+ mUserWakeupStore.getWakeupTimeForUser(USER_ID_1));
mUserWakeupStore.removeUserWakeup(USER_ID_1);
assertEquals(mUserWakeupStore.getNextWakeupTime(),
- mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3));
+ mUserWakeupStore.getWakeupTimeForUser(USER_ID_3));
}
@Test
@@ -154,16 +154,16 @@
mUserWakeupStore.init();
final long realtime = SystemClock.elapsedRealtime();
assertEquals(0, mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP).length);
- assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_2) > realtime);
- assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_1)
- < mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3));
- assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3)
- < mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_2));
- assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_1) - realtime
+ assertTrue(mUserWakeupStore.getWakeupTimeForUser(USER_ID_2) > realtime);
+ assertTrue(mUserWakeupStore.getWakeupTimeForUser(USER_ID_1)
+ < mUserWakeupStore.getWakeupTimeForUser(USER_ID_3));
+ assertTrue(mUserWakeupStore.getWakeupTimeForUser(USER_ID_3)
+ < mUserWakeupStore.getWakeupTimeForUser(USER_ID_2));
+ assertTrue(mUserWakeupStore.getWakeupTimeForUser(USER_ID_1) - realtime
< BUFFER_TIME_MS + USER_START_TIME_DEVIATION_LIMIT_MS);
- assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3) - realtime
+ assertTrue(mUserWakeupStore.getWakeupTimeForUser(USER_ID_3) - realtime
< 2 * BUFFER_TIME_MS + USER_START_TIME_DEVIATION_LIMIT_MS);
- assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_2) - realtime
+ assertTrue(mUserWakeupStore.getWakeupTimeForUser(USER_ID_2) - realtime
< 3 * BUFFER_TIME_MS + USER_START_TIME_DEVIATION_LIMIT_MS);
}
//TODO: b/330264023 - Add tests for I/O in usersWithAlarmClocks.xml.
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java
new file mode 100644
index 0000000..8b1d423
--- /dev/null
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java
@@ -0,0 +1,416 @@
+/*
+ * 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.stats;
+
+import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
+import static android.net.NetworkStats.METERED_NO;
+import static android.net.NetworkStats.ROAMING_NO;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.power.stats.EnergyConsumerType;
+import android.net.NetworkStats;
+import android.net.wifi.WifiManager;
+import android.os.BatteryConsumer;
+import android.os.BatteryStatsManager;
+import android.os.Handler;
+import android.os.WorkSource;
+import android.os.connectivity.WifiActivityEnergyInfo;
+import android.platform.test.ravenwood.RavenwoodRule;
+import android.util.IndentingPrintWriter;
+import android.util.SparseArray;
+
+import com.android.internal.os.Clock;
+import com.android.internal.os.PowerStats;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.IntSupplier;
+import java.util.function.Supplier;
+
+public class WifiPowerStatsCollectorTest {
+ private static final int APP_UID1 = 42;
+ private static final int APP_UID2 = 24;
+ private static final int APP_UID3 = 44;
+ private static final int ISOLATED_UID = 99123;
+
+ @Rule(order = 0)
+ public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
+ .setProvideMainThread(true)
+ .build();
+
+ @Rule(order = 1)
+ public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
+ .setPowerStatsThrottlePeriodMillis(BatteryConsumer.POWER_COMPONENT_WIFI, 1000);
+
+ private MockBatteryStatsImpl mBatteryStats;
+
+ private final MockClock mClock = mStatsRule.getMockClock();
+
+ @Mock
+ private Context mContext;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private PowerStatsCollector.ConsumedEnergyRetriever mConsumedEnergyRetriever;
+ @Mock
+ private Supplier<NetworkStats> mNetworkStatsSupplier;
+ @Mock
+ private PowerStatsUidResolver mPowerStatsUidResolver;
+
+ private NetworkStats mNetworkStats;
+ private List<NetworkStats.Entry> mNetworkStatsEntries;
+
+ private static class ScanTimes {
+ public long scanTimeMs;
+ public long batchScanTimeMs;
+ }
+
+ private final SparseArray<ScanTimes> mScanTimes = new SparseArray<>();
+ private long mWifiActiveDuration;
+
+ private final WifiPowerStatsCollector.WifiStatsRetriever mWifiStatsRetriever =
+ new WifiPowerStatsCollector.WifiStatsRetriever() {
+ @Override
+ public void retrieveWifiScanTimes(Callback callback) {
+ for (int i = 0; i < mScanTimes.size(); i++) {
+ int uid = mScanTimes.keyAt(i);
+ ScanTimes scanTimes = mScanTimes.valueAt(i);
+ callback.onWifiScanTime(uid, scanTimes.scanTimeMs, scanTimes.batchScanTimeMs);
+ }
+ }
+
+ @Override
+ public long getWifiActiveDuration() {
+ return mWifiActiveDuration;
+ }
+ };
+
+ private final List<PowerStats> mRecordedPowerStats = new ArrayList<>();
+
+ private WifiPowerStatsCollector.Injector mInjector = new WifiPowerStatsCollector.Injector() {
+ @Override
+ public Handler getHandler() {
+ return mStatsRule.getHandler();
+ }
+
+ @Override
+ public Clock getClock() {
+ return mStatsRule.getMockClock();
+ }
+
+ @Override
+ public PowerStatsUidResolver getUidResolver() {
+ return mPowerStatsUidResolver;
+ }
+
+ @Override
+ public PackageManager getPackageManager() {
+ return mPackageManager;
+ }
+
+ @Override
+ public PowerStatsCollector.ConsumedEnergyRetriever getConsumedEnergyRetriever() {
+ return mConsumedEnergyRetriever;
+ }
+
+ @Override
+ public IntSupplier getVoltageSupplier() {
+ return () -> 3500;
+ }
+
+ @Override
+ public Supplier<NetworkStats> getWifiNetworkStatsSupplier() {
+ return mNetworkStatsSupplier;
+ }
+
+ @Override
+ public WifiPowerStatsCollector.WifiStatsRetriever getWifiStatsRetriever() {
+ return mWifiStatsRetriever;
+ }
+
+ @Override
+ public WifiManager getWifiManager() {
+ return mWifiManager;
+ }
+ };
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
+ when(mPowerStatsUidResolver.mapUid(anyInt())).thenAnswer(invocation -> {
+ int uid = invocation.getArgument(0);
+ if (uid == ISOLATED_UID) {
+ return APP_UID2;
+ } else {
+ return uid;
+ }
+ });
+ mBatteryStats = mStatsRule.getBatteryStats();
+ }
+
+ @SuppressWarnings("GuardedBy")
+ @Test
+ public void triggering() throws Throwable {
+ PowerStatsCollector collector = mBatteryStats.getPowerStatsCollector(
+ BatteryConsumer.POWER_COMPONENT_WIFI);
+ collector.addConsumer(mRecordedPowerStats::add);
+
+ mBatteryStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_WIFI, true);
+
+ mockWifiActivityInfo(1000, 2000, 3000, 600, 100);
+
+ // This should trigger a sample collection to establish a baseline
+ mBatteryStats.onSystemReady(mContext);
+
+ mStatsRule.waitForBackgroundThread();
+ assertThat(mRecordedPowerStats).hasSize(1);
+
+ mRecordedPowerStats.clear();
+ mStatsRule.setTime(20000, 20000);
+ mBatteryStats.noteWifiOnLocked(mClock.realtime, mClock.uptime);
+ mStatsRule.waitForBackgroundThread();
+ assertThat(mRecordedPowerStats).hasSize(1);
+
+ mRecordedPowerStats.clear();
+ mStatsRule.setTime(40000, 40000);
+ mBatteryStats.noteWifiOffLocked(mClock.realtime, mClock.uptime);
+ mStatsRule.waitForBackgroundThread();
+ assertThat(mRecordedPowerStats).hasSize(1);
+
+ mRecordedPowerStats.clear();
+ mStatsRule.setTime(50000, 50000);
+ mBatteryStats.noteWifiRunningLocked(new WorkSource(APP_UID1), mClock.realtime,
+ mClock.uptime);
+ mStatsRule.waitForBackgroundThread();
+ assertThat(mRecordedPowerStats).hasSize(1);
+
+ mRecordedPowerStats.clear();
+ mStatsRule.setTime(60000, 60000);
+ mBatteryStats.noteWifiStoppedLocked(new WorkSource(APP_UID1), mClock.realtime,
+ mClock.uptime);
+ mStatsRule.waitForBackgroundThread();
+ assertThat(mRecordedPowerStats).hasSize(1);
+
+ mRecordedPowerStats.clear();
+ mStatsRule.setTime(70000, 70000);
+ mBatteryStats.noteWifiStateLocked(BatteryStatsManager.WIFI_STATE_ON_CONNECTED_STA,
+ "mywyfy", mClock.realtime);
+ mStatsRule.waitForBackgroundThread();
+ assertThat(mRecordedPowerStats).hasSize(1);
+ }
+
+ @Test
+ public void collectStats_powerReportingSupported() throws Throwable {
+ PowerStats powerStats = collectPowerStats(true);
+ assertThat(powerStats.durationMs).isEqualTo(7500);
+
+ PowerStats.Descriptor descriptor = powerStats.descriptor;
+ WifiPowerStatsLayout layout = new WifiPowerStatsLayout(descriptor);
+ assertThat(layout.isPowerReportingSupported()).isTrue();
+ assertThat(layout.getDeviceRxTime(powerStats.stats)).isEqualTo(6000);
+ assertThat(layout.getDeviceTxTime(powerStats.stats)).isEqualTo(1000);
+ assertThat(layout.getDeviceScanTime(powerStats.stats)).isEqualTo(200);
+ assertThat(layout.getDeviceIdleTime(powerStats.stats)).isEqualTo(300);
+ assertThat(layout.getConsumedEnergy(powerStats.stats, 0))
+ .isEqualTo((64321 - 10000) * 1000 / 3500);
+
+ verifyUidStats(powerStats);
+ }
+
+ @Test
+ public void collectStats_powerReportingUnsupported() {
+ PowerStats powerStats = collectPowerStats(false);
+ assertThat(powerStats.durationMs).isEqualTo(13200);
+
+ PowerStats.Descriptor descriptor = powerStats.descriptor;
+ WifiPowerStatsLayout layout = new WifiPowerStatsLayout(descriptor);
+ assertThat(layout.isPowerReportingSupported()).isFalse();
+ assertThat(layout.getDeviceActiveTime(powerStats.stats)).isEqualTo(7500);
+ assertThat(layout.getDeviceBasicScanTime(powerStats.stats)).isEqualTo(234 + 100 + 300);
+ assertThat(layout.getDeviceBatchedScanTime(powerStats.stats)).isEqualTo(345 + 200 + 400);
+ assertThat(layout.getConsumedEnergy(powerStats.stats, 0))
+ .isEqualTo((64321 - 10000) * 1000 / 3500);
+
+ verifyUidStats(powerStats);
+ }
+
+ private void verifyUidStats(PowerStats powerStats) {
+ WifiPowerStatsLayout layout = new WifiPowerStatsLayout(powerStats.descriptor);
+ assertThat(powerStats.uidStats.size()).isEqualTo(2);
+ long[] actual1 = powerStats.uidStats.get(APP_UID1);
+ assertThat(layout.getUidRxBytes(actual1)).isEqualTo(1000);
+ assertThat(layout.getUidTxBytes(actual1)).isEqualTo(2000);
+ assertThat(layout.getUidRxPackets(actual1)).isEqualTo(100);
+ assertThat(layout.getUidTxPackets(actual1)).isEqualTo(200);
+ assertThat(layout.getUidScanTime(actual1)).isEqualTo(234);
+ assertThat(layout.getUidBatchedScanTime(actual1)).isEqualTo(345);
+
+ // Combines APP_UID2 and ISOLATED_UID
+ long[] actual2 = powerStats.uidStats.get(APP_UID2);
+ assertThat(layout.getUidRxBytes(actual2)).isEqualTo(6000);
+ assertThat(layout.getUidTxBytes(actual2)).isEqualTo(3000);
+ assertThat(layout.getUidRxPackets(actual2)).isEqualTo(60);
+ assertThat(layout.getUidTxPackets(actual2)).isEqualTo(30);
+ assertThat(layout.getUidScanTime(actual2)).isEqualTo(100 + 300);
+ assertThat(layout.getUidBatchedScanTime(actual2)).isEqualTo(200 + 400);
+
+ assertThat(powerStats.uidStats.get(ISOLATED_UID)).isNull();
+ assertThat(powerStats.uidStats.get(APP_UID3)).isNull();
+ }
+
+ @Test
+ public void dump() throws Throwable {
+ PowerStats powerStats = collectPowerStats(true);
+ StringWriter sw = new StringWriter();
+ IndentingPrintWriter pw = new IndentingPrintWriter(sw);
+ powerStats.dump(pw);
+ pw.flush();
+ String dump = sw.toString();
+ assertThat(dump).contains("duration=7500");
+ assertThat(dump).contains(
+ "stats=[6000, 1000, 300, 200, 634, 945, " + ((64321 - 10000) * 1000 / 3500)
+ + ", 0, 0]");
+ assertThat(dump).contains("UID 24: [6000, 3000, 60, 30, 400, 600, 0]");
+ assertThat(dump).contains("UID 42: [1000, 2000, 100, 200, 234, 345, 0]");
+ }
+
+ private PowerStats collectPowerStats(boolean hasPowerReporting) {
+ when(mWifiManager.isEnhancedPowerReportingSupported()).thenReturn(hasPowerReporting);
+
+ WifiPowerStatsCollector collector = new WifiPowerStatsCollector(mInjector, 0);
+ collector.setEnabled(true);
+
+ when(mConsumedEnergyRetriever.getEnergyConsumerIds(EnergyConsumerType.WIFI))
+ .thenReturn(new int[]{777});
+
+ if (hasPowerReporting) {
+ mockWifiActivityInfo(1000, 600, 100, 2000, 3000);
+ } else {
+ mWifiActiveDuration = 5700;
+ }
+ mockNetworkStats(1000);
+ mockNetworkStatsEntry(APP_UID1, 4321, 321, 1234, 23);
+ mockNetworkStatsEntry(APP_UID2, 4000, 40, 2000, 20);
+ mockNetworkStatsEntry(ISOLATED_UID, 2000, 20, 1000, 10);
+ mockNetworkStatsEntry(APP_UID3, 314, 281, 314, 281);
+ mockWifiScanTimes(APP_UID1, 1000, 2000);
+ mockWifiScanTimes(APP_UID2, 3000, 4000);
+ mockWifiScanTimes(ISOLATED_UID, 5000, 6000);
+
+ when(mConsumedEnergyRetriever.getConsumedEnergyUws(eq(new int[]{777})))
+ .thenReturn(new long[]{10000});
+
+ collector.collectStats();
+
+ if (hasPowerReporting) {
+ mockWifiActivityInfo(1100, 6600, 1100, 2200, 3300);
+ } else {
+ mWifiActiveDuration = 13200;
+ }
+ mockNetworkStats(1100);
+ mockNetworkStatsEntry(APP_UID1, 5321, 421, 3234, 223);
+ mockNetworkStatsEntry(APP_UID2, 8000, 80, 4000, 40);
+ mockNetworkStatsEntry(ISOLATED_UID, 4000, 40, 2000, 20);
+ mockNetworkStatsEntry(APP_UID3, 314, 281, 314, 281); // Unchanged
+ mockWifiScanTimes(APP_UID1, 1234, 2345);
+ mockWifiScanTimes(APP_UID2, 3100, 4200);
+ mockWifiScanTimes(ISOLATED_UID, 5300, 6400);
+
+ when(mConsumedEnergyRetriever.getConsumedEnergyUws(eq(new int[]{777})))
+ .thenReturn(new long[]{64321});
+
+ mStatsRule.setTime(20000, 20000);
+ return collector.collectStats();
+ }
+
+ private void mockWifiActivityInfo(long timestamp, long rxTimeMs, long txTimeMs, int scanTimeMs,
+ int idleTimeMs) {
+ int stackState = 0;
+ WifiActivityEnergyInfo info = new WifiActivityEnergyInfo(timestamp, stackState, txTimeMs,
+ rxTimeMs, scanTimeMs, idleTimeMs);
+ doAnswer(invocation -> {
+ WifiManager.OnWifiActivityEnergyInfoListener listener = invocation.getArgument(1);
+ listener.onWifiActivityEnergyInfo(info);
+ return null;
+ }).when(mWifiManager).getWifiActivityEnergyInfoAsync(any(), any());
+ }
+
+ private void mockNetworkStats(long elapsedRealtime) {
+ if (RavenwoodRule.isOnRavenwood()) {
+ mNetworkStats = mock(NetworkStats.class);
+ ArrayList<NetworkStats.Entry> networkStatsEntries = new ArrayList<>();
+ when(mNetworkStats.iterator()).thenAnswer(inv -> networkStatsEntries.iterator());
+ mNetworkStatsEntries = networkStatsEntries;
+ } else {
+ mNetworkStats = new NetworkStats(elapsedRealtime, 1);
+ }
+ when(mNetworkStatsSupplier.get()).thenReturn(mNetworkStats);
+ }
+
+ private void mockNetworkStatsEntry(int uid, long rxBytes, long rxPackets, long txBytes,
+ long txPackets) {
+ if (RavenwoodRule.isOnRavenwood()) {
+ NetworkStats.Entry entry = mock(NetworkStats.Entry.class);
+ when(entry.getUid()).thenReturn(uid);
+ when(entry.getMetered()).thenReturn(METERED_NO);
+ when(entry.getRoaming()).thenReturn(ROAMING_NO);
+ when(entry.getDefaultNetwork()).thenReturn(DEFAULT_NETWORK_NO);
+ when(entry.getRxBytes()).thenReturn(rxBytes);
+ when(entry.getRxPackets()).thenReturn(rxPackets);
+ when(entry.getTxBytes()).thenReturn(txBytes);
+ when(entry.getTxPackets()).thenReturn(txPackets);
+ when(entry.getOperations()).thenReturn(100L);
+ mNetworkStatsEntries.add(entry);
+ } else {
+ mNetworkStats = mNetworkStats
+ .addEntry(new NetworkStats.Entry("wifi", uid, 0, 0,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, rxBytes, rxPackets,
+ txBytes, txPackets, 100));
+ reset(mNetworkStatsSupplier);
+ when(mNetworkStatsSupplier.get()).thenReturn(mNetworkStats);
+ }
+ }
+
+ private void mockWifiScanTimes(int uid, long scanTimeMs, long batchScanTimeMs) {
+ ScanTimes scanTimes = new ScanTimes();
+ scanTimes.scanTimeMs = scanTimeMs;
+ scanTimes.batchScanTimeMs = batchScanTimeMs;
+ mScanTimes.put(uid, scanTimes);
+ }
+}
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsProcessorTest.java
new file mode 100644
index 0000000..257a1a6
--- /dev/null
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsProcessorTest.java
@@ -0,0 +1,592 @@
+/*
+ * 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.stats;
+
+import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
+import static android.net.NetworkStats.METERED_NO;
+import static android.net.NetworkStats.ROAMING_NO;
+import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND;
+import static android.os.BatteryConsumer.PROCESS_STATE_CACHED;
+import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND;
+import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE;
+
+import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER;
+import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON;
+import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER;
+import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER;
+import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE;
+import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.power.stats.EnergyConsumerType;
+import android.net.NetworkStats;
+import android.net.wifi.WifiManager;
+import android.os.BatteryConsumer;
+import android.os.Handler;
+import android.os.Process;
+import android.os.connectivity.WifiActivityEnergyInfo;
+import android.platform.test.ravenwood.RavenwoodRule;
+import android.util.SparseArray;
+
+import com.android.internal.os.Clock;
+import com.android.internal.os.PowerProfile;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.List;
+import java.util.function.IntSupplier;
+import java.util.function.Supplier;
+
+public class WifiPowerStatsProcessorTest {
+ @Rule(order = 0)
+ public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
+ .setProvideMainThread(true)
+ .build();
+
+ private static final double PRECISION = 0.00001;
+ private static final int APP_UID1 = Process.FIRST_APPLICATION_UID + 42;
+ private static final int APP_UID2 = Process.FIRST_APPLICATION_UID + 101;
+ private static final int WIFI_ENERGY_CONSUMER_ID = 1;
+ private static final int VOLTAGE_MV = 3500;
+
+ @Rule(order = 1)
+ public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
+ .setAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_IDLE, 360.0)
+ .setAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_RX, 480.0)
+ .setAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_TX, 720.0)
+ .setAveragePower(PowerProfile.POWER_WIFI_ACTIVE, 360.0)
+ .setAveragePower(PowerProfile.POWER_WIFI_SCAN, 480.0)
+ .setAveragePower(PowerProfile.POWER_WIFI_BATCHED_SCAN, 720.0)
+ .initMeasuredEnergyStatsLocked();
+
+ @Mock
+ private Context mContext;
+ @Mock
+ private PowerStatsUidResolver mPowerStatsUidResolver;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private PowerStatsCollector.ConsumedEnergyRetriever mConsumedEnergyRetriever;
+ @Mock
+ private Supplier<NetworkStats> mNetworkStatsSupplier;
+ @Mock
+ private WifiManager mWifiManager;
+
+ private static class ScanTimes {
+ public long scanTimeMs;
+ public long batchScanTimeMs;
+ }
+
+ private final SparseArray<ScanTimes> mScanTimes = new SparseArray<>();
+ private long mWifiActiveDuration;
+
+ private final WifiPowerStatsCollector.WifiStatsRetriever mWifiStatsRetriever =
+ new WifiPowerStatsCollector.WifiStatsRetriever() {
+ @Override
+ public void retrieveWifiScanTimes(Callback callback) {
+ for (int i = 0; i < mScanTimes.size(); i++) {
+ int uid = mScanTimes.keyAt(i);
+ ScanTimes scanTimes = mScanTimes.valueAt(i);
+ callback.onWifiScanTime(uid, scanTimes.scanTimeMs, scanTimes.batchScanTimeMs);
+ }
+ }
+
+ @Override
+ public long getWifiActiveDuration() {
+ return mWifiActiveDuration;
+ }
+ };
+
+ private final WifiPowerStatsCollector.Injector mInjector =
+ new WifiPowerStatsCollector.Injector() {
+ @Override
+ public Handler getHandler() {
+ return mStatsRule.getHandler();
+ }
+
+ @Override
+ public Clock getClock() {
+ return mStatsRule.getMockClock();
+ }
+
+ @Override
+ public PowerStatsUidResolver getUidResolver() {
+ return mPowerStatsUidResolver;
+ }
+
+ @Override
+ public PackageManager getPackageManager() {
+ return mPackageManager;
+ }
+
+ @Override
+ public PowerStatsCollector.ConsumedEnergyRetriever getConsumedEnergyRetriever() {
+ return mConsumedEnergyRetriever;
+ }
+
+ @Override
+ public IntSupplier getVoltageSupplier() {
+ return () -> VOLTAGE_MV;
+ }
+
+ @Override
+ public Supplier<NetworkStats> getWifiNetworkStatsSupplier() {
+ return mNetworkStatsSupplier;
+ }
+
+ @Override
+ public WifiManager getWifiManager() {
+ return mWifiManager;
+ }
+
+ @Override
+ public WifiPowerStatsCollector.WifiStatsRetriever getWifiStatsRetriever() {
+ return mWifiStatsRetriever;
+ }
+ };
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true);
+ when(mPowerStatsUidResolver.mapUid(anyInt()))
+ .thenAnswer(invocation -> invocation.getArgument(0));
+ }
+
+ @Test
+ public void powerProfileModel_powerController() {
+ when(mWifiManager.isEnhancedPowerReportingSupported()).thenReturn(true);
+
+ // No power monitoring hardware
+ when(mConsumedEnergyRetriever.getEnergyConsumerIds(EnergyConsumerType.WIFI))
+ .thenReturn(new int[0]);
+
+ WifiPowerStatsProcessor processor =
+ new WifiPowerStatsProcessor(mStatsRule.getPowerProfile());
+
+ PowerComponentAggregatedPowerStats aggregatedStats = createAggregatedPowerStats(processor);
+
+ WifiPowerStatsCollector collector = new WifiPowerStatsCollector(mInjector, 0);
+ collector.setEnabled(true);
+
+ // Initial empty WifiActivityEnergyInfo.
+ mockWifiActivityEnergyInfo(new WifiActivityEnergyInfo(0L,
+ WifiActivityEnergyInfo.STACK_STATE_INVALID, 0L, 0L, 0L, 0L));
+
+ // Establish a baseline
+ aggregatedStats.addPowerStats(collector.collectStats(), 0);
+
+ // Turn the screen off after 2.5 seconds
+ aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_OTHER, 2500);
+ aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_BACKGROUND, 2500);
+ aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND_SERVICE,
+ 5000);
+
+ // Note application network activity
+ NetworkStats networkStats = mockNetworkStats(10000, 1,
+ mockNetworkStatsEntry("wifi", APP_UID1, 0, 0,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 10000, 1500, 20000, 300, 100),
+ mockNetworkStatsEntry("wifi", APP_UID2, 0, 0,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 5000, 500, 3000, 100, 111));
+ when(mNetworkStatsSupplier.get()).thenReturn(networkStats);
+
+ mockWifiScanTimes(APP_UID1, 300, 400);
+ mockWifiScanTimes(APP_UID2, 100, 200);
+
+ mockWifiActivityEnergyInfo(new WifiActivityEnergyInfo(10000,
+ WifiActivityEnergyInfo.STACK_STATE_STATE_ACTIVE, 2000, 3000, 100, 600));
+
+ mStatsRule.setTime(10_000, 10_000);
+
+ aggregatedStats.addPowerStats(collector.collectStats(), 10_000);
+
+ processor.finish(aggregatedStats);
+
+ WifiPowerStatsLayout statsLayout =
+ new WifiPowerStatsLayout(aggregatedStats.getPowerStatsDescriptor());
+
+ // RX power = 'rx-duration * PowerProfile[wifi.controller.rx]`
+ // RX power = 3000 * 480 = 1440000 mA-ms = 0.4 mAh
+ // TX power = 'tx-duration * PowerProfile[wifi.controller.tx]`
+ // TX power = 2000 * 720 = 1440000 mA-ms = 0.4 mAh
+ // Scan power = 'scan-duration * PowerProfile[wifi.scan]`
+ // Scan power = 100 * 480 = 48000 mA-ms = 0.013333 mAh
+ // Idle power = 'idle-duration * PowerProfile[wifi.idle]`
+ // Idle power = 600 * 360 = 216000 mA-ms = 0.06 mAh
+ // Total power = RX + TX + Scan + Idle = 0.873333
+ // Screen-on - 25%
+ // Screen-off - 75%
+ double expectedPower = 0.873333;
+ long[] deviceStats = new long[aggregatedStats.getPowerStatsDescriptor().statsArrayLength];
+ aggregatedStats.getDeviceStats(deviceStats, states(POWER_STATE_OTHER, SCREEN_STATE_ON));
+ assertThat(statsLayout.getDevicePowerEstimate(deviceStats))
+ .isWithin(PRECISION).of(expectedPower * 0.25);
+
+ aggregatedStats.getDeviceStats(deviceStats, states(POWER_STATE_OTHER, SCREEN_STATE_OTHER));
+ assertThat(statsLayout.getDevicePowerEstimate(deviceStats))
+ .isWithin(PRECISION).of(expectedPower * 0.75);
+
+ // UID1 =
+ // (1500 / 2000) * 0.4 // rx
+ // + (300 / 400) * 0.4 // tx
+ // + (700 / 1000) * 0.013333 // scan (basic + batched)
+ // = 0.609333 mAh
+ double expectedPower1 = 0.609333;
+ long[] uidStats = new long[aggregatedStats.getPowerStatsDescriptor().uidStatsArrayLength];
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_FOREGROUND));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_BACKGROUND));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_FOREGROUND_SERVICE));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.5);
+
+ // UID2 =
+ // (500 / 2000) * 0.4 // rx
+ // + (100 / 400) * 0.4 // tx
+ // + (300 / 1000) * 0.013333 // scan (basic + batched)
+ // = 0.204 mAh
+ double expectedPower2 = 0.204;
+ aggregatedStats.getUidStats(uidStats, APP_UID2,
+ states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower2 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID2,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_CACHED));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower2 * 0.75);
+ }
+
+ @Test
+ public void consumedEnergyModel_powerController() {
+ when(mWifiManager.isEnhancedPowerReportingSupported()).thenReturn(true);
+
+ // PowerStats hardware is available
+ when(mConsumedEnergyRetriever.getEnergyConsumerIds(EnergyConsumerType.WIFI))
+ .thenReturn(new int[] {WIFI_ENERGY_CONSUMER_ID});
+
+ WifiPowerStatsProcessor processor =
+ new WifiPowerStatsProcessor(mStatsRule.getPowerProfile());
+
+ PowerComponentAggregatedPowerStats aggregatedStats = createAggregatedPowerStats(processor);
+
+ WifiPowerStatsCollector collector = new WifiPowerStatsCollector(mInjector, 0);
+ collector.setEnabled(true);
+
+ // Initial empty WifiActivityEnergyInfo.
+ mockWifiActivityEnergyInfo(new WifiActivityEnergyInfo(0L,
+ WifiActivityEnergyInfo.STACK_STATE_INVALID, 0L, 0L, 0L, 0L));
+
+ when(mConsumedEnergyRetriever.getConsumedEnergyUws(
+ new int[]{WIFI_ENERGY_CONSUMER_ID}))
+ .thenReturn(new long[]{0});
+
+ // Establish a baseline
+ aggregatedStats.addPowerStats(collector.collectStats(), 0);
+
+ // Turn the screen off after 2.5 seconds
+ aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_OTHER, 2500);
+ aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_BACKGROUND, 2500);
+ aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND_SERVICE,
+ 5000);
+
+ // Note application network activity
+ NetworkStats networkStats = mockNetworkStats(10000, 1,
+ mockNetworkStatsEntry("wifi", APP_UID1, 0, 0,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 10000, 1500, 20000, 300, 100),
+ mockNetworkStatsEntry("wifi", APP_UID2, 0, 0,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 5000, 500, 3000, 100, 111));
+ when(mNetworkStatsSupplier.get()).thenReturn(networkStats);
+
+ mockWifiScanTimes(APP_UID1, 300, 400);
+ mockWifiScanTimes(APP_UID2, 100, 200);
+
+ mockWifiActivityEnergyInfo(new WifiActivityEnergyInfo(10000,
+ WifiActivityEnergyInfo.STACK_STATE_STATE_ACTIVE, 2000, 3000, 100, 600));
+
+ mStatsRule.setTime(10_000, 10_000);
+
+ // 10 mAh represented as microWattSeconds
+ long energyUws = 10 * 3600 * VOLTAGE_MV;
+ when(mConsumedEnergyRetriever.getConsumedEnergyUws(
+ new int[]{WIFI_ENERGY_CONSUMER_ID})).thenReturn(new long[]{energyUws});
+
+ aggregatedStats.addPowerStats(collector.collectStats(), 10_000);
+
+ processor.finish(aggregatedStats);
+
+ WifiPowerStatsLayout statsLayout =
+ new WifiPowerStatsLayout(aggregatedStats.getPowerStatsDescriptor());
+
+ // All estimates are computed as in the #powerProfileModel_powerController test,
+ // except they are all scaled by the same ratio to ensure that the total estimated
+ // energy is equal to the measured energy
+ double expectedPower = 10;
+ long[] deviceStats = new long[aggregatedStats.getPowerStatsDescriptor().statsArrayLength];
+ aggregatedStats.getDeviceStats(deviceStats, states(POWER_STATE_OTHER, SCREEN_STATE_ON));
+ assertThat(statsLayout.getDevicePowerEstimate(deviceStats))
+ .isWithin(PRECISION).of(expectedPower * 0.25);
+
+ aggregatedStats.getDeviceStats(deviceStats, states(POWER_STATE_OTHER, SCREEN_STATE_OTHER));
+ assertThat(statsLayout.getDevicePowerEstimate(deviceStats))
+ .isWithin(PRECISION).of(expectedPower * 0.75);
+
+ // UID1
+ // 0.609333 // power profile model estimate
+ // 0.873333 // power profile model estimate for total power
+ // 10 // total consumed energy
+ // = 0.609333 * (10 / 0.873333) = 6.9771
+ double expectedPower1 = 6.9771;
+ long[] uidStats = new long[aggregatedStats.getPowerStatsDescriptor().uidStatsArrayLength];
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_FOREGROUND));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_BACKGROUND));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_FOREGROUND_SERVICE));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.5);
+
+ // UID2
+ // 0.204 // power profile model estimate
+ // 0.873333 // power profile model estimate for total power
+ // 10 // total consumed energy
+ // = 0.204 * (10 / 0.873333) = 2.33588
+ double expectedPower2 = 2.33588;
+ aggregatedStats.getUidStats(uidStats, APP_UID2,
+ states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower2 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID2,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_CACHED));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower2 * 0.75);
+ }
+
+ @Test
+ public void powerProfileModel_noPowerController() {
+ when(mWifiManager.isEnhancedPowerReportingSupported()).thenReturn(false);
+
+ // No power monitoring hardware
+ when(mConsumedEnergyRetriever.getEnergyConsumerIds(EnergyConsumerType.WIFI))
+ .thenReturn(new int[0]);
+
+ WifiPowerStatsProcessor processor =
+ new WifiPowerStatsProcessor(mStatsRule.getPowerProfile());
+
+ PowerComponentAggregatedPowerStats aggregatedStats = createAggregatedPowerStats(processor);
+
+ WifiPowerStatsCollector collector = new WifiPowerStatsCollector(mInjector, 0);
+ collector.setEnabled(true);
+
+ // Establish a baseline
+ aggregatedStats.addPowerStats(collector.collectStats(), 0);
+
+ // Turn the screen off after 2.5 seconds
+ aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_OTHER, 2500);
+ aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_BACKGROUND, 2500);
+ aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND_SERVICE,
+ 5000);
+
+ // Note application network activity
+ NetworkStats networkStats = mockNetworkStats(10000, 1,
+ mockNetworkStatsEntry("wifi", APP_UID1, 0, 0,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 10000, 1500, 20000, 300, 100),
+ mockNetworkStatsEntry("wifi", APP_UID2, 0, 0,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 5000, 500, 3000, 100, 111));
+ when(mNetworkStatsSupplier.get()).thenReturn(networkStats);
+
+ mScanTimes.clear();
+ mWifiActiveDuration = 8000;
+ mockWifiScanTimes(APP_UID1, 300, 400);
+ mockWifiScanTimes(APP_UID2, 100, 200);
+
+ mStatsRule.setTime(10_000, 10_000);
+
+ aggregatedStats.addPowerStats(collector.collectStats(), 10_000);
+
+ processor.finish(aggregatedStats);
+
+ WifiPowerStatsLayout statsLayout =
+ new WifiPowerStatsLayout(aggregatedStats.getPowerStatsDescriptor());
+
+ // Total active power = 'active-duration * PowerProfile[wifi.on]`
+ // active = 8000 * 360 = 2880000 mA-ms = 0.8 mAh
+ // UID1 rxPackets + txPackets = 1800
+ // UID2 rxPackets + txPackets = 600
+ // Total rx+tx packets = 2400
+ // Total scan power = `scan-duration * PowerProfile[wifi.scan]`
+ // scan = (100 + 300) * 480 = 192000 mA-ms = 0.05333 mAh
+ // Total batch scan power = `(200 + 400) * PowerProfile[wifi.batchedscan]`
+ // bscan = (200 + 400) * 720 = 432000 mA-ms = 0.12 mAh
+ //
+ // Expected power = active + scan + bscan = 0.97333
+ double expectedPower = 0.97333;
+ long[] deviceStats = new long[aggregatedStats.getPowerStatsDescriptor().statsArrayLength];
+ aggregatedStats.getDeviceStats(deviceStats, states(POWER_STATE_OTHER, SCREEN_STATE_ON));
+ assertThat(statsLayout.getDevicePowerEstimate(deviceStats))
+ .isWithin(PRECISION).of(expectedPower * 0.25);
+
+ aggregatedStats.getDeviceStats(deviceStats, states(POWER_STATE_OTHER, SCREEN_STATE_OTHER));
+ assertThat(statsLayout.getDevicePowerEstimate(deviceStats))
+ .isWithin(PRECISION).of(expectedPower * 0.75);
+
+ // UID1 =
+ // (1800 / 2400) * 0.8 // active
+ // + (300 / 400) * 0.05333 // scan
+ // + (400 / 600) * 0.12 // batched scan
+ // = 0.72 mAh
+ double expectedPower1 = 0.72;
+ long[] uidStats = new long[aggregatedStats.getPowerStatsDescriptor().uidStatsArrayLength];
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_FOREGROUND));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_BACKGROUND));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID1,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_FOREGROUND_SERVICE));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower1 * 0.5);
+
+ // UID2 =
+ // (600 / 2400) * 0.8 // active
+ // + (100 / 400) * 0.05333 // scan
+ // + (200 / 600) * 0.12 // batched scan
+ // = 0.253333 mAh
+ double expectedPower2 = 0.25333;
+ aggregatedStats.getUidStats(uidStats, APP_UID2,
+ states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower2 * 0.25);
+
+ aggregatedStats.getUidStats(uidStats, APP_UID2,
+ states(POWER_STATE_OTHER, SCREEN_STATE_OTHER, PROCESS_STATE_CACHED));
+ assertThat(statsLayout.getUidPowerEstimate(uidStats))
+ .isWithin(PRECISION).of(expectedPower2 * 0.75);
+ }
+
+ private static PowerComponentAggregatedPowerStats createAggregatedPowerStats(
+ WifiPowerStatsProcessor processor) {
+ AggregatedPowerStatsConfig.PowerComponent config =
+ new AggregatedPowerStatsConfig.PowerComponent(BatteryConsumer.POWER_COMPONENT_WIFI)
+ .trackDeviceStates(STATE_POWER, STATE_SCREEN)
+ .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE)
+ .setProcessor(processor);
+
+ PowerComponentAggregatedPowerStats aggregatedStats =
+ new PowerComponentAggregatedPowerStats(
+ new AggregatedPowerStats(mock(AggregatedPowerStatsConfig.class)), config);
+
+ aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0);
+ aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0);
+ aggregatedStats.setUidState(APP_UID1, STATE_PROCESS_STATE, PROCESS_STATE_FOREGROUND, 0);
+ aggregatedStats.setUidState(APP_UID2, STATE_PROCESS_STATE, PROCESS_STATE_CACHED, 0);
+
+ return aggregatedStats;
+ }
+
+ private int[] states(int... states) {
+ return states;
+ }
+
+ private void mockWifiActivityEnergyInfo(WifiActivityEnergyInfo waei) {
+ doAnswer(invocation -> {
+ WifiManager.OnWifiActivityEnergyInfoListener
+ listener = invocation.getArgument(1);
+ listener.onWifiActivityEnergyInfo(waei);
+ return null;
+ }).when(mWifiManager).getWifiActivityEnergyInfoAsync(any(), any());
+ }
+
+ private NetworkStats mockNetworkStats(int elapsedTime, int initialSize,
+ NetworkStats.Entry... entries) {
+ NetworkStats stats;
+ if (RavenwoodRule.isOnRavenwood()) {
+ stats = mock(NetworkStats.class);
+ when(stats.iterator()).thenAnswer(inv -> List.of(entries).iterator());
+ } else {
+ stats = new NetworkStats(elapsedTime, initialSize);
+ for (NetworkStats.Entry entry : entries) {
+ stats = stats.addEntry(entry);
+ }
+ }
+ return stats;
+ }
+
+ private static NetworkStats.Entry mockNetworkStatsEntry(@Nullable String iface, int uid,
+ int set, int tag, int metered, int roaming, int defaultNetwork, long rxBytes,
+ long rxPackets, long txBytes, long txPackets, long operations) {
+ if (RavenwoodRule.isOnRavenwood()) {
+ NetworkStats.Entry entry = mock(NetworkStats.Entry.class);
+ when(entry.getUid()).thenReturn(uid);
+ when(entry.getMetered()).thenReturn(metered);
+ when(entry.getRoaming()).thenReturn(roaming);
+ when(entry.getDefaultNetwork()).thenReturn(defaultNetwork);
+ when(entry.getRxBytes()).thenReturn(rxBytes);
+ when(entry.getRxPackets()).thenReturn(rxPackets);
+ when(entry.getTxBytes()).thenReturn(txBytes);
+ when(entry.getTxPackets()).thenReturn(txPackets);
+ when(entry.getOperations()).thenReturn(operations);
+ return entry;
+ } else {
+ return new NetworkStats.Entry(iface, uid, set, tag, metered,
+ roaming, defaultNetwork, rxBytes, rxPackets, txBytes, txPackets, operations);
+ }
+ }
+
+ private void mockWifiScanTimes(int uid, long scanTimeMs, long batchScanTimeMs) {
+ ScanTimes scanTimes = new ScanTimes();
+ scanTimes.scanTimeMs = scanTimeMs;
+ scanTimes.batchScanTimeMs = batchScanTimeMs;
+ mScanTimes.put(uid, scanTimes);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java
index b487dc6..c970a3e 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java
@@ -16,7 +16,8 @@
package com.android.server.appop;
-import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM;
+import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA;
import static com.google.common.truth.Truth.assertThat;
@@ -31,6 +32,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import android.Manifest;
import android.app.AppOpsManager;
import android.app.AppOpsManager.OnOpActiveChangedListener;
import android.companion.virtual.VirtualDeviceManager;
@@ -38,7 +40,8 @@
import android.content.AttributionSource;
import android.content.Context;
import android.os.Process;
-import android.virtualdevice.cts.common.FakeAssociationRule;
+import android.permission.PermissionManager;
+import android.virtualdevice.cts.common.VirtualDeviceRule;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -49,7 +52,6 @@
import org.junit.runner.RunWith;
import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
/**
* Tests app ops version upgrades
@@ -59,7 +61,13 @@
public class AppOpsActiveWatcherTest {
@Rule
- public FakeAssociationRule mFakeAssociationRule = new FakeAssociationRule();
+ public VirtualDeviceRule virtualDeviceRule =
+ VirtualDeviceRule.withAdditionalPermissions(
+ Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
+ Manifest.permission.REVOKE_RUNTIME_PERMISSIONS,
+ Manifest.permission.CREATE_VIRTUAL_DEVICE,
+ Manifest.permission.GET_APP_OPS_STATS
+ );
private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000;
@Test
@@ -145,20 +153,28 @@
@Test
public void testWatchActiveOpsForExternalDevice() {
- final VirtualDeviceManager virtualDeviceManager = getContext().getSystemService(
- VirtualDeviceManager.class);
- AtomicInteger virtualDeviceId = new AtomicInteger();
- runWithShellPermissionIdentity(() -> {
- final VirtualDeviceManager.VirtualDevice virtualDevice =
- virtualDeviceManager.createVirtualDevice(
- mFakeAssociationRule.getAssociationInfo().getId(),
- new VirtualDeviceParams.Builder().setName("virtual_device").build());
- virtualDeviceId.set(virtualDevice.getDeviceId());
- });
+ VirtualDeviceManager.VirtualDevice virtualDevice =
+ virtualDeviceRule.createManagedVirtualDevice(
+ new VirtualDeviceParams.Builder()
+ .setDevicePolicy(POLICY_TYPE_CAMERA, DEVICE_POLICY_CUSTOM)
+ .build()
+ );
+
+ PermissionManager permissionManager =
+ getContext().getSystemService(PermissionManager.class);
+
+ // Unlike runtime permission being automatically granted to the default device, we need to
+ // grant camera permission to the external device first before we can start op.
+ permissionManager.grantRuntimePermission(
+ getContext().getOpPackageName(),
+ Manifest.permission.CAMERA,
+ virtualDevice.getPersistentDeviceId()
+ );
+
final OnOpActiveChangedListener listener = mock(OnOpActiveChangedListener.class);
AttributionSource attributionSource = new AttributionSource(Process.myUid(),
getContext().getOpPackageName(), getContext().getAttributionTag(),
- virtualDeviceId.get());
+ virtualDevice.getDeviceId());
final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
appOpsManager.startWatchingActive(new String[]{AppOpsManager.OPSTR_CAMERA,
@@ -171,7 +187,7 @@
verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
.times(1)).onOpActiveChanged(eq(AppOpsManager.OPSTR_CAMERA),
eq(Process.myUid()), eq(getContext().getOpPackageName()),
- eq(getContext().getAttributionTag()), eq(virtualDeviceId.get()), eq(true),
+ eq(getContext().getAttributionTag()), eq(virtualDevice.getDeviceId()), eq(true),
eq(AppOpsManager.ATTRIBUTION_FLAGS_NONE),
eq(AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE));
verifyNoMoreInteractions(listener);
@@ -182,7 +198,7 @@
verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
.times(1)).onOpActiveChanged(eq(AppOpsManager.OPSTR_CAMERA),
eq(Process.myUid()), eq(getContext().getOpPackageName()),
- eq(getContext().getAttributionTag()), eq(virtualDeviceId.get()), eq(false),
+ eq(getContext().getAttributionTag()), eq(virtualDevice.getDeviceId()), eq(false),
eq(AppOpsManager.ATTRIBUTION_FLAGS_NONE),
eq(AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE));
verifyNoMoreInteractions(listener);
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
index 90b131a..3dc375c 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
@@ -24,8 +24,6 @@
import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_ERROR_CANCELED;
import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_SUCCESS;
-import static com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR;
-
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
@@ -452,7 +450,6 @@
@Test
public void testRegisterAuthenticationStateListener_callsFingerprintService()
throws Exception {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
setInternalAndTestBiometricPermissions(mContext, true /* hasPermission */);
mAuthService = new AuthService(mContext, mInjector);
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java
index 74f8f08..d6eadf2 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java
@@ -16,8 +16,6 @@
package com.android.server.biometrics.sensors;
-import static com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -26,7 +24,6 @@
import static org.mockito.Mockito.when;
import android.hardware.biometrics.BiometricRequestConstants;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.SetFlagsRule;
@@ -52,21 +49,18 @@
private static final long REQUEST_ID = 8;
@Rule public final MockitoRule mockito = MockitoJUnit.rule();
-
@Mock private IUdfpsOverlayController mUdfpsOverlayController;
- @Mock private ISidefpsController mSidefpsController;
@Mock private AcquisitionClient<?> mAcquisitionClient;
@Before
public void setup() {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
when(mAcquisitionClient.getRequestId()).thenReturn(REQUEST_ID);
when(mAcquisitionClient.hasRequestId()).thenReturn(true);
}
@Test
public void noopWhenBothNull() {
- final SensorOverlays useless = new SensorOverlays(null, null);
+ final SensorOverlays useless = new SensorOverlays(null);
useless.show(SENSOR_ID, 2, null);
useless.hide(SENSOR_ID);
}
@@ -74,34 +68,24 @@
@Test
public void testProvidesUdfps() {
final List<IUdfpsOverlayController> udfps = new ArrayList<>();
- SensorOverlays sensorOverlays = new SensorOverlays(null, mSidefpsController);
+ SensorOverlays sensorOverlays = new SensorOverlays(null);
sensorOverlays.ifUdfps(udfps::add);
assertThat(udfps).isEmpty();
- sensorOverlays = new SensorOverlays(mUdfpsOverlayController, mSidefpsController);
+ sensorOverlays = new SensorOverlays(mUdfpsOverlayController);
sensorOverlays.ifUdfps(udfps::add);
assertThat(udfps).containsExactly(mUdfpsOverlayController);
}
@Test
- public void testShow() throws Exception {
- testShow(mUdfpsOverlayController, mSidefpsController);
- }
-
- @Test
public void testShowUdfps() throws Exception {
- testShow(mUdfpsOverlayController, null);
+ testShow(mUdfpsOverlayController);
}
- @Test
- public void testShowSidefps() throws Exception {
- testShow(null, mSidefpsController);
- }
-
- private void testShow(IUdfpsOverlayController udfps, ISidefpsController sidefps)
+ private void testShow(IUdfpsOverlayController udfps)
throws Exception {
- final SensorOverlays sensorOverlays = new SensorOverlays(udfps, sidefps);
+ final SensorOverlays sensorOverlays = new SensorOverlays(udfps);
final int reason = BiometricRequestConstants.REASON_UNKNOWN;
sensorOverlays.show(SENSOR_ID, reason, mAcquisitionClient);
@@ -109,36 +93,20 @@
verify(mUdfpsOverlayController).showUdfpsOverlay(
eq(REQUEST_ID), eq(SENSOR_ID), eq(reason), any());
}
- if (sidefps != null) {
- verify(mSidefpsController).show(eq(SENSOR_ID), eq(reason));
- }
- }
-
- @Test
- public void testHide() throws Exception {
- testHide(mUdfpsOverlayController, mSidefpsController);
}
@Test
public void testHideUdfps() throws Exception {
- testHide(mUdfpsOverlayController, null);
+ testHide(mUdfpsOverlayController);
}
- @Test
- public void testHideSidefps() throws Exception {
- testHide(null, mSidefpsController);
- }
-
- private void testHide(IUdfpsOverlayController udfps, ISidefpsController sidefps)
+ private void testHide(IUdfpsOverlayController udfps)
throws Exception {
- final SensorOverlays sensorOverlays = new SensorOverlays(udfps, sidefps);
+ final SensorOverlays sensorOverlays = new SensorOverlays(udfps);
sensorOverlays.hide(SENSOR_ID);
if (udfps != null) {
verify(mUdfpsOverlayController).hideUdfpsOverlay(eq(SENSOR_ID));
}
- if (sidefps != null) {
- verify(mSidefpsController).hide(eq(SENSOR_ID));
- }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
index a8e0c26..40de1b2 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
@@ -23,8 +23,6 @@
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE;
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_LOCKOUT_PERMANENT;
-import static com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -49,6 +47,7 @@
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.common.OperationContext;
+import android.hardware.biometrics.common.OperationState;
import android.hardware.biometrics.events.AuthenticationAcquiredInfo;
import android.hardware.biometrics.events.AuthenticationErrorInfo;
import android.hardware.biometrics.events.AuthenticationFailedInfo;
@@ -61,7 +60,6 @@
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintAuthenticateOptions;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.os.RemoteException;
@@ -82,6 +80,7 @@
import com.android.server.biometrics.log.OperationContextExt;
import com.android.server.biometrics.log.Probe;
import com.android.server.biometrics.sensors.AuthSessionCoordinator;
+import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.AuthenticationStateListeners;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
@@ -143,8 +142,6 @@
@Mock
private IUdfpsOverlayController mUdfpsOverlayController;
@Mock
- private ISidefpsController mSideFpsController;
- @Mock
private AuthenticationStateListeners mAuthenticationStateListeners;
@Mock
private FingerprintSensorPropertiesInternal mSensorProps;
@@ -189,7 +186,6 @@
@Before
public void setup() {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
mContext.addMockSystemService(BiometricManager.class, mBiometricManager);
mContext.getOrCreateTestableResources().addOverride(
R.string.fingerprint_error_hw_not_available, "hw not available");
@@ -391,8 +387,8 @@
verify(mBiometricContext).subscribe(mOperationContextCaptor.capture(),
mStartHalConsumerCaptor.capture(), mContextInjector.capture(), any());
- mStartHalConsumerCaptor.getValue().accept(mOperationContextCaptor
- .getValue().toAidlContext());
+ final OperationContextExt operationContext = mOperationContextCaptor.getValue();
+ mStartHalConsumerCaptor.getValue().accept(operationContext.toAidlContext());
final ArgumentCaptor<OperationContext> captor =
ArgumentCaptor.forClass(OperationContext.class);
@@ -400,26 +396,30 @@
OperationContext opContext = captor.getValue();
- assertThat(opContext).isSameInstanceAs(
- mOperationContextCaptor.getValue().toAidlContext());
+ assertThat(opContext).isSameInstanceAs(operationContext.toAidlContext());
+ opContext.operationState = new OperationState();
+ opContext.operationState.setFingerprintOperationState(
+ new OperationState.FingerprintOperationState());
mContextInjector.getValue().accept(opContext);
verify(mHal).onContextChanged(same(opContext));
+ verify(mHal, times(2)).setIgnoreDisplayTouches(
+ opContext.operationState.getFingerprintOperationState().isHardwareIgnoringTouches);
client.stopHalOperation();
- verify(mBiometricContext).unsubscribe(same(mOperationContextCaptor.getValue()));
+ verify(mBiometricContext).unsubscribe(same(operationContext));
}
@Test
public void showHideOverlay_cancel() throws RemoteException {
- showHideOverlay(c -> c.cancel());
+ showHideOverlay(AuthenticationClient::cancel);
}
@Test
public void showHideOverlay_stop() throws RemoteException {
- showHideOverlay(c -> c.stopHalOperation());
+ showHideOverlay(FingerprintAuthenticationClient::stopHalOperation);
}
@Test
@@ -434,57 +434,13 @@
}
@Test
- public void showHideOverlay_lockoutPerm() throws RemoteException {
- showHideOverlay(c -> c.onLockoutPermanent());
- }
-
- private void showHideOverlay(Consumer<FingerprintAuthenticationClient> block)
+ public void showHideOverlay_lockoutPerm()
throws RemoteException {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
- final FingerprintAuthenticationClient client = createClient();
-
- client.start(mCallback);
-
- verify(mUdfpsOverlayController).showUdfpsOverlay(eq(REQUEST_ID), anyInt(), anyInt(), any());
- verify(mSideFpsController).show(anyInt(), anyInt());
-
- block.accept(client);
-
- verify(mUdfpsOverlayController).hideUdfpsOverlay(anyInt());
- verify(mSideFpsController).hide(anyInt());
- verify(mHal, times(2)).setIgnoreDisplayTouches(false);
+ showHideOverlay(FingerprintAuthenticationClient::onLockoutPermanent);
}
- @Test
- public void showHideOverlay_cancel_sidefpsControllerRemovalRefactor() throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(c -> c.cancel());
- }
-
- @Test
- public void showHideOverlay_stop_sidefpsControllerRemovalRefactor() throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(c -> c.stopHalOperation());
- }
-
- @Test
- public void showHideOverlay_error_sidefpsControllerRemovalRefactor() throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(c -> c.onError(0, 0));
- verify(mCallback).onClientFinished(any(), eq(false));
- }
-
- @Test
- public void showHideOverlay_lockout_sidefpsControllerRemovalRefactor() throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(c -> c.onLockoutTimed(5000));
- }
-
- @Test
- public void showHideOverlay_lockoutPerm_sidefpsControllerRemovalRefactor()
- throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(c -> c.onLockoutPermanent());
- }
-
- private void showHideOverlay_sidefpsControllerRemovalRefactor(
+ private void showHideOverlay(
Consumer<FingerprintAuthenticationClient> block) throws RemoteException {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
final FingerprintAuthenticationClient client = createClient();
client.start(mCallback);
@@ -498,7 +454,6 @@
BiometricRequestConstants.REASON_AUTH_BP).build()
);
-
block.accept(client);
verify(mUdfpsOverlayController).hideUdfpsOverlay(anyInt());
@@ -552,7 +507,6 @@
@Test
public void testAuthenticationStateListeners_onError()
throws RemoteException {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
final FingerprintAuthenticationClient client = createClient();
client.start(mCallback);
client.onError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0);
@@ -578,7 +532,6 @@
@Test
public void testAuthenticationStateListeners_onLockoutPermanent()
throws RemoteException {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
final FingerprintAuthenticationClient client = createClient();
client.start(mCallback);
client.onLockoutPermanent();
@@ -732,17 +685,12 @@
.setUserId(USER_ID)
.setSensorId(SENSOR_ID)
.build();
- return new FingerprintAuthenticationClient(mContext, () -> aidl, mToken,
- REQUEST_ID, listener, OP_ID,
- false /* restricted */, options, 4 /* cookie */,
- false /* requireConfirmation */,
- mBiometricLogger, mBiometricContext,
- true /* isStrongBiometric */,
- null /* taskStackListener */,
- mUdfpsOverlayController, mSideFpsController, mAuthenticationStateListeners,
- allowBackgroundAuthentication,
- mSensorProps, 0 /* biometricStrength */,
- lockoutTracker) {
+ return new FingerprintAuthenticationClient(mContext, () -> aidl, mToken, REQUEST_ID,
+ listener, OP_ID, false /* restricted */, options, 4 /* cookie */,
+ false /* requireConfirmation */, mBiometricLogger, mBiometricContext,
+ true /* isStrongBiometric */, null /* taskStackListener */, mUdfpsOverlayController,
+ mAuthenticationStateListeners, allowBackgroundAuthentication, mSensorProps,
+ 0 /* biometricStrength */, lockoutTracker) {
@Override
protected ActivityTaskManager getActivityTaskManager() {
return mActivityTaskManager;
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java
index b26f8c8..5c6513d 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java
@@ -20,8 +20,6 @@
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_TOO_FAST;
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_TIMEOUT;
-import static com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -33,7 +31,6 @@
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.same;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -52,7 +49,6 @@
import android.hardware.fingerprint.FingerprintEnrollOptions;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.os.RemoteException;
@@ -71,6 +67,7 @@
import com.android.server.biometrics.log.CallbackWithProbe;
import com.android.server.biometrics.log.OperationContextExt;
import com.android.server.biometrics.log.Probe;
+import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.AuthenticationStateListeners;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
@@ -127,8 +124,6 @@
@Mock
private IUdfpsOverlayController mUdfpsOverlayController;
@Mock
- private ISidefpsController mSideFpsController;
- @Mock
private AuthenticationStateListeners mAuthenticationStateListeners;
@Mock
private FingerprintSensorPropertiesInternal mSensorProps;
@@ -287,12 +282,12 @@
@Test
public void showHideOverlay_cancel() throws RemoteException {
- showHideOverlay(c -> c.cancel());
+ showHideOverlay(AcquisitionClient::cancel);
}
@Test
public void showHideOverlay_stop() throws RemoteException {
- showHideOverlay(c -> c.stopHalOperation());
+ showHideOverlay(FingerprintEnrollClient::stopHalOperation);
}
@Test
@@ -303,45 +298,7 @@
@Test
public void showHideOverlay_result() throws RemoteException {
- showHideOverlay(c -> c.onEnrollResult(new Fingerprint("", 1, 1), 0));
- }
-
- private void showHideOverlay(Consumer<FingerprintEnrollClient> block)
- throws RemoteException {
- mSetFlagsRule.disableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
- final FingerprintEnrollClient client = createClient();
-
- client.start(mCallback);
-
- verify(mUdfpsOverlayController).showUdfpsOverlay(eq(REQUEST_ID), anyInt(), anyInt(), any());
- verify(mSideFpsController).show(anyInt(), anyInt());
-
- block.accept(client);
-
- verify(mUdfpsOverlayController).hideUdfpsOverlay(anyInt());
- verify(mSideFpsController).hide(anyInt());
- verify(mHal, times(2)).setIgnoreDisplayTouches(false);
- }
-
- @Test
- public void showHideOverlay_cancel_sidefpsControllerRemovalRefactor() throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(c -> c.cancel());
- }
-
- @Test
- public void showHideOverlay_stop_sidefpsControllerRemovalRefactor() throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(c -> c.stopHalOperation());
- }
-
- @Test
- public void showHideOverlay_error_sidefpsControllerRemovalRefactor() throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(c -> c.onError(0, 0));
- verify(mCallback).onClientFinished(any(), eq(false));
- }
-
- @Test
- public void showHideOverlay_result_sidefpsControllerRemovalRefactor() throws RemoteException {
- showHideOverlay_sidefpsControllerRemovalRefactor(
+ showHideOverlay(
c -> c.onEnrollResult(new Fingerprint("", 1, 1), 0));
}
@@ -355,9 +312,8 @@
eq(BiometricsProtoEnums.ENROLLMENT_SOURCE_SUW));
}
- private void showHideOverlay_sidefpsControllerRemovalRefactor(
+ private void showHideOverlay(
Consumer<FingerprintEnrollClient> block) throws RemoteException {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
final FingerprintEnrollClient client = createClient();
client.start(mCallback);
@@ -414,7 +370,6 @@
@Test
public void testAuthenticationStateListeners_onError()
throws RemoteException {
- mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR);
final FingerprintEnrollClient client = createClient();
client.start(mCallback);
client.onError(FINGERPRINT_ERROR_TIMEOUT, 0);
@@ -449,7 +404,7 @@
mClientMonitorCallbackConverter, 0 /* userId */,
HAT, "owner", mBiometricUtils, 8 /* sensorId */,
mBiometricLogger, mBiometricContext, mSensorProps, mUdfpsOverlayController,
- mSideFpsController, mAuthenticationStateListeners, 6 /* maxTemplatesPerUser */,
+ mAuthenticationStateListeners, 6 /* maxTemplatesPerUser */,
FingerprintManager.ENROLL_ENROLL, (new FingerprintEnrollOptions.Builder())
.setEnrollReason(ENROLL_SOURCE).build()
);
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/HidlToAidlSensorAdapterTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/HidlToAidlSensorAdapterTest.java
index 6c3bfe8..1db74b4 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/HidlToAidlSensorAdapterTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/HidlToAidlSensorAdapterTest.java
@@ -217,7 +217,7 @@
mContext, mHidlToAidlSensorAdapter.getLazySession(), null /* token */,
1 /* requestId */, null /* listener */, USER_ID, HAT, TAG, mBiometricUtils,
SENSOR_ID, mLogger, mBiometricContext,
- mHidlToAidlSensorAdapter.getSensorProperties(), null, null,
+ mHidlToAidlSensorAdapter.getSensorProperties(), null,
mAuthenticationStateListeners, 5 /* maxTemplatesPerUser */, ENROLL_ENROLL,
(new FingerprintEnrollOptions.Builder()).build()));
mLooper.dispatchAll();
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
index de3cfbf..855c658 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
@@ -30,8 +30,6 @@
import android.content.pm.IPackageManager;
import android.content.pm.PackageManagerInternal;
import android.database.ContentObserver;
-import android.hardware.usb.UsbManager;
-import android.media.IAudioService;
import android.net.IIpConnectivityMetrics;
import android.net.Uri;
import android.os.Bundle;
@@ -216,11 +214,6 @@
}
@Override
- IAudioService getIAudioService() {
- return services.iaudioService;
- }
-
- @Override
PersistentDataBlockManagerInternal getPersistentDataBlockManagerInternal() {
return services.persistentDataBlockManagerInternal;
}
@@ -244,11 +237,6 @@
}
@Override
- UsbManager getUsbManager() {
- return services.usbManager;
- }
-
- @Override
boolean storageManagerIsFileBasedEncryptionEnabled() {
return services.storageManager.isFileBasedEncryptionEnabled();
}
@@ -380,21 +368,11 @@
}
@Override
- void settingsSecurePutInt(String name, int value) {
- services.settings.settingsSecurePutInt(name, value);
- }
-
- @Override
void settingsGlobalPutInt(String name, int value) {
services.settings.settingsGlobalPutInt(name, value);
}
@Override
- void settingsSecurePutString(String name, String value) {
- services.settings.settingsSecurePutString(name, value);
- }
-
- @Override
void settingsGlobalPutString(String name, String value) {
services.settings.settingsGlobalPutString(name, value);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
index 400f9bb..4f94704 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
@@ -317,6 +317,70 @@
}
@Test
+ public void testEnterPipModeWhenResumed_autoEnterEnabled_returnTrue() {
+ final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
+ final ActivityRecord activity = stack.getBottomMostTask().getTopNonFinishingActivity();
+ PictureInPictureParams params = mock(PictureInPictureParams.class);
+ activity.pictureInPictureArgs = params;
+
+ doReturn(true).when(activity).isState(RESUMED);
+ doReturn(false).when(activity).inPinnedWindowingMode();
+ doReturn(true).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean());
+ doReturn(true).when(params).isAutoEnterEnabled();
+
+ assertTrue(mAtm.enterPictureInPictureMode(activity, params,
+ true /* fromClient */, true /* isAutoEnter */));
+ }
+
+ @Test
+ public void testEnterPipModeWhenResumed_autoEnterDisabled_returnTrue() {
+ final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
+ final ActivityRecord activity = stack.getBottomMostTask().getTopNonFinishingActivity();
+ PictureInPictureParams params = mock(PictureInPictureParams.class);
+ activity.pictureInPictureArgs = params;
+
+ doReturn(true).when(activity).isState(RESUMED);
+ doReturn(false).when(activity).inPinnedWindowingMode();
+ doReturn(true).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean());
+ doReturn(false).when(params).isAutoEnterEnabled();
+
+ assertTrue(mAtm.enterPictureInPictureMode(activity, params,
+ true /* fromClient */, false /* isAutoEnter */));
+ }
+
+ @Test
+ public void testEnterPipModeWhenPausing_autoEnterEnabled_returnFalse() {
+ final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
+ final ActivityRecord activity = stack.getBottomMostTask().getTopNonFinishingActivity();
+ PictureInPictureParams params = mock(PictureInPictureParams.class);
+ activity.pictureInPictureArgs = params;
+
+ doReturn(true).when(activity).isState(PAUSING);
+ doReturn(false).when(activity).inPinnedWindowingMode();
+ doReturn(true).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean());
+ doReturn(true).when(params).isAutoEnterEnabled();
+
+ assertFalse(mAtm.enterPictureInPictureMode(activity, params,
+ true /* fromClient */, true /* isAutoEnter */));
+ }
+
+ @Test
+ public void testEnterPipModeWhenPausing_autoEnterDisabled_returnTrue() {
+ final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
+ final ActivityRecord activity = stack.getBottomMostTask().getTopNonFinishingActivity();
+ PictureInPictureParams params = mock(PictureInPictureParams.class);
+ activity.pictureInPictureArgs = params;
+
+ doReturn(true).when(activity).isState(PAUSING);
+ doReturn(false).when(activity).inPinnedWindowingMode();
+ doReturn(true).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean());
+ doReturn(false).when(params).isAutoEnterEnabled();
+
+ assertTrue(mAtm.enterPictureInPictureMode(activity, params,
+ true /* fromClient */, false /* isAutoEnter */));
+ }
+
+ @Test
public void testResumeNextActivityOnCrashedAppDied() {
mSupervisor.beginDeferResume();
final ActivityRecord homeActivity = new ActivityBuilder(mAtm)
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java
index 6b614fa..27a4a2b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java
@@ -343,6 +343,20 @@
verify(mAtm).setLastResumedActivityUncheckLocked(any(), eq("test"));
}
+ @Test
+ public void testUpdateTopResumed_moveToFront() {
+ final ActivityRecord activity1 = new ActivityBuilder(mAtm).setCreateTask(true).build();
+ final ActivityRecord activity2 = new ActivityBuilder(mAtm).setCreateTask(true).build();
+ activity2.setState(ActivityRecord.State.RESUMED, "test");
+ assertEquals(activity2.app, mAtm.mTopApp);
+ activity1.getTask().moveToFront("test");
+ // If the device is not sleeping, the app should be only set with resumed state.
+ assertEquals(activity2.app, mAtm.mTopApp);
+ activity2.setState(ActivityRecord.State.PAUSED, "test");
+ activity1.setState(ActivityRecord.State.RESUMED, "test");
+ assertEquals(activity1.app, mAtm.mTopApp);
+ }
+
/**
* We need to launch home again after user unlocked for those displays that do not have
* encryption aware home app.
diff --git a/services/tests/wmtests/src/com/android/server/wm/CameraIdPackageNameBiMappingTests.java b/services/tests/wmtests/src/com/android/server/wm/CameraIdPackageNameBiMappingTests.java
new file mode 100644
index 0000000..f3a20a6
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/CameraIdPackageNameBiMappingTests.java
@@ -0,0 +1,107 @@
+/*
+ * 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.wm;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for {@link CameraIdPackageNameBiMapping}.
+ *
+ * Build/Install/Run:
+ * atest WmTests:CameraIdPackageNameBiMapTests
+ */
+@SmallTest
+@Presubmit
+public class CameraIdPackageNameBiMappingTests {
+ private CameraIdPackageNameBiMapping mMapping;
+
+ private static final String PACKAGE_1 = "PACKAGE_1";
+ private static final String PACKAGE_2 = "PACKAGE_2";
+ private static final String CAMERA_ID_1 = "1234";
+ private static final String CAMERA_ID_2 = "5678";
+
+ @Before
+ public void setUp() {
+ mMapping = new CameraIdPackageNameBiMapping();
+ }
+
+ @Test
+ public void mappingEmptyAtStart() {
+ assertTrue(mMapping.isEmpty());
+ }
+
+ @Test
+ public void addPackageAndId_containsPackage() {
+ mMapping.put(PACKAGE_1, CAMERA_ID_1);
+ assertTrue(mMapping.containsPackageName(PACKAGE_1));
+ }
+
+ @Test
+ public void addTwoPackagesAndId_containsPackages() {
+ mMapping.put(PACKAGE_1, CAMERA_ID_1);
+ mMapping.put(PACKAGE_2, CAMERA_ID_2);
+ assertTrue(mMapping.containsPackageName(PACKAGE_1));
+ assertTrue(mMapping.containsPackageName(PACKAGE_2));
+ }
+
+ @Test
+ public void addPackageAndId_mapContainsPackageAndId() {
+ mMapping.put(PACKAGE_1, CAMERA_ID_1);
+ assertEquals(CAMERA_ID_1, mMapping.getCameraId(PACKAGE_1));
+ }
+
+ @Test
+ public void changeCameraId_newestCameraId() {
+ mMapping.put(PACKAGE_1, CAMERA_ID_1);
+ mMapping.put(PACKAGE_1, CAMERA_ID_2);
+ assertEquals(CAMERA_ID_2, mMapping.getCameraId(PACKAGE_1));
+ }
+
+ @Test
+ public void changePackage_newestPackage() {
+ mMapping.put(PACKAGE_1, CAMERA_ID_1);
+ mMapping.put(PACKAGE_2, CAMERA_ID_1);
+ assertFalse(mMapping.containsPackageName(PACKAGE_1));
+ assertTrue(mMapping.containsPackageName(PACKAGE_2));
+ assertEquals(CAMERA_ID_1, mMapping.getCameraId(PACKAGE_2));
+ }
+
+ @Test
+ public void addAndRemoveCameraId_containsOtherPackage() {
+ mMapping.put(PACKAGE_1, CAMERA_ID_1);
+ mMapping.put(PACKAGE_2, CAMERA_ID_2);
+ mMapping.removeCameraId(CAMERA_ID_1);
+ assertFalse(mMapping.containsPackageName(PACKAGE_1));
+ assertTrue(mMapping.containsPackageName(PACKAGE_2));
+ }
+
+ @Test
+ public void addAndRemoveOnlyCameraId_empty() {
+ mMapping.put(PACKAGE_1, CAMERA_ID_1);
+ mMapping.removeCameraId(CAMERA_ID_1);
+ assertTrue(mMapping.isEmpty());
+ }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index 000162a..ac1dc08 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -4484,6 +4484,21 @@
}
@Test
+ public void testPortraitAppInTabletop_notSplitScreen() {
+ final int dw = 2400;
+ setUpDisplaySizeWithApp(dw, 2000);
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+
+ final int initialWidth = mActivity.getBounds().width();
+
+ setFoldablePosture(true /* isHalfFolded */, true /* isTabletop */);
+
+ final int finalWidth = mActivity.getBounds().width();
+ assertEquals(initialWidth, finalWidth);
+ assertNotEquals(finalWidth, getExpectedSplitSize(dw));
+ }
+
+ @Test
public void testUpdateResolvedBoundsHorizontalPosition_bookModeEnabled() {
// Set up a display in landscape with a fixed-orientation PORTRAIT app
setUpDisplaySizeWithApp(2800, 1400);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
index 69b5c37..43b424f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -1681,8 +1681,7 @@
WindowContainerToken wct = rootTask.mRemoteToken.toWindowContainerToken();
t.setWindowingMode(wct, WINDOWING_MODE_PINNED);
mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
- verify(mWm.mAtmService.mRootWindowContainer).resumeFocusedTasksTopActivitiesUnchecked(any(),
- any(), any(), anyBoolean());
+ verify(mWm.mAtmService.mRootWindowContainer).resumeFocusedTasksTopActivities();
clearInvocations(mWm.mAtmService.mRootWindowContainer);
// The token for the PIP root task may have changed when the task entered PIP mode, so do
@@ -1691,8 +1690,7 @@
record.getRootTask().mRemoteToken.toWindowContainerToken();
t.setWindowingMode(newToken, WINDOWING_MODE_FULLSCREEN);
mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
- verify(mWm.mAtmService.mRootWindowContainer).resumeFocusedTasksTopActivitiesUnchecked(any(),
- any(), any(), anyBoolean());
+ verify(mWm.mAtmService.mRootWindowContainer).resumeFocusedTasksTopActivities();
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
index 400e4b6..059fed20 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
@@ -406,6 +406,7 @@
verify(tracker).onActivityResumedWhileVisible(mWpc);
assertTrue(tracker.hasResumedActivity(mWpc.mUid));
+ mAtm.mTopApp = null;
activity.makeFinishingLocked();
activity.setState(PAUSING, "test");
diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java
index 87bb0f0..b005715 100644
--- a/telephony/java/android/telephony/satellite/SatelliteManager.java
+++ b/telephony/java/android/telephony/satellite/SatelliteManager.java
@@ -954,6 +954,11 @@
@FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
public static final int SATELLITE_MODEM_STATE_CONNECTED = 7;
/**
+ * The satellite modem is being powered on.
+ * @hide
+ */
+ public static final int SATELLITE_MODEM_STATE_ENABLING_SATELLITE = 8;
+ /**
* Satellite modem state is unknown. This generic modem state should be used only when the
* modem state cannot be mapped to other specific modem states.
*/
@@ -970,6 +975,7 @@
SATELLITE_MODEM_STATE_UNAVAILABLE,
SATELLITE_MODEM_STATE_NOT_CONNECTED,
SATELLITE_MODEM_STATE_CONNECTED,
+ SATELLITE_MODEM_STATE_ENABLING_SATELLITE,
SATELLITE_MODEM_STATE_UNKNOWN
})
@Retention(RetentionPolicy.SOURCE)
diff --git a/tests/FlickerTests/test-apps/app-helpers/OWNERS b/tests/FlickerTests/test-apps/app-helpers/OWNERS
new file mode 100644
index 0000000..ab62532
--- /dev/null
+++ b/tests/FlickerTests/test-apps/app-helpers/OWNERS
@@ -0,0 +1,2 @@
+uysalorhan@google.com
+pragyabajoria@google.com
\ No newline at end of file
diff --git a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt
new file mode 100644
index 0000000..461dfec
--- /dev/null
+++ b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt
@@ -0,0 +1,124 @@
+/*
+ * 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.wm.flicker.helpers
+
+import android.tools.device.apphelpers.IStandardAppHelper
+import android.tools.helpers.SYSTEMUI_PACKAGE
+import android.tools.traces.parsers.WindowManagerStateHelper
+import android.tools.traces.wm.WindowingMode
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.BySelector
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiObject2
+import androidx.test.uiautomator.Until
+
+/**
+ * Wrapper class around App helper classes. This class adds functionality to the apps that the
+ * desktop apps would have.
+ */
+open class DesktopModeAppHelper(private val innerHelper: IStandardAppHelper) :
+ IStandardAppHelper by innerHelper {
+ private val TIMEOUT_MS = 3_000L
+ private val CAPTION = "desktop_mode_caption"
+ private val CAPTION_HANDLE = "caption_handle"
+ private val MAXIMIZE_BUTTON = "maximize_window"
+ private val MAXIMIZE_BUTTON_VIEW = "maximize_button_view"
+ private val CLOSE_BUTTON = "close_window"
+
+ private val caption: BySelector
+ get() = By.res(SYSTEMUI_PACKAGE, CAPTION)
+
+ /** Wait for an app moved to desktop to finish its transition. */
+ private fun waitForAppToMoveToDesktop(wmHelper: WindowManagerStateHelper) {
+ wmHelper
+ .StateSyncBuilder()
+ .withWindowSurfaceAppeared(innerHelper)
+ .withFreeformApp(innerHelper)
+ .withAppTransitionIdle()
+ .waitForAndVerify()
+ }
+
+ /** Move an app to Desktop by dragging the app handle at the top. */
+ fun enterDesktopWithDrag(
+ wmHelper: WindowManagerStateHelper,
+ device: UiDevice,
+ ) {
+ innerHelper.launchViaIntent(wmHelper)
+ dragToDesktop(wmHelper, device)
+ waitForAppToMoveToDesktop(wmHelper)
+ }
+
+ private fun dragToDesktop(wmHelper: WindowManagerStateHelper, device: UiDevice) {
+ val windowRect = wmHelper.getWindowRegion(innerHelper).bounds
+ val startX = windowRect.centerX()
+
+ // Start dragging a little under the top to prevent dragging the notification shade.
+ val startY = 10
+
+ val displayRect =
+ wmHelper.currentState.wmState.getDefaultDisplay()?.displayRect
+ ?: throw IllegalStateException("Default display is null")
+
+ // The position we want to drag to
+ val endY = displayRect.centerY() / 2
+
+ // drag the window to move to desktop
+ device.drag(startX, startY, startX, endY, 100)
+ }
+
+ /** Click maximise button on the app header for the given app. */
+ fun maximiseDesktopApp(wmHelper: WindowManagerStateHelper, device: UiDevice) {
+ val caption = getCaptionForTheApp(wmHelper, device)
+ val maximizeButton =
+ caption
+ ?.children
+ ?.find { it.resourceName.endsWith(MAXIMIZE_BUTTON_VIEW) }
+ ?.children
+ ?.get(0)
+ maximizeButton?.click()
+ wmHelper.StateSyncBuilder().withAppTransitionIdle().waitForAndVerify()
+ }
+ /** Click close button on the app header for the given app. */
+ fun closeDesktopApp(wmHelper: WindowManagerStateHelper, device: UiDevice) {
+ val caption = getCaptionForTheApp(wmHelper, device)
+ val closeButton = caption?.children?.find { it.resourceName.endsWith(CLOSE_BUTTON) }
+ closeButton?.click()
+ wmHelper
+ .StateSyncBuilder()
+ .withAppTransitionIdle()
+ .withWindowSurfaceDisappeared(innerHelper)
+ .waitForAndVerify()
+ }
+
+ private fun getCaptionForTheApp(
+ wmHelper: WindowManagerStateHelper,
+ device: UiDevice
+ ): UiObject2? {
+ if (
+ wmHelper.getWindow(innerHelper)?.windowingMode !=
+ WindowingMode.WINDOWING_MODE_FREEFORM.value
+ )
+ error("expected a freeform window with caption but window is not in freeform mode")
+ val captions =
+ device.wait(Until.findObjects(caption), TIMEOUT_MS)
+ ?: error("Unable to find view $caption\n")
+
+ return captions.find {
+ wmHelper.getWindowRegion(innerHelper).bounds.contains(it.visibleBounds)
+ }
+ }
+}