Merge "Fade NSSL with brightness slider" into main
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index fa8fe3b..74e9583 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -4222,6 +4222,10 @@
* Return a list of {@link ApplicationStartInfo} records containing the information about the
* most recent app startups.
*
+ * Records accessed using this path might include "incomplete" records such as in-progress app
+ * starts. Accessing in-progress starts using this method lets you access start information
+ * early to better optimize your startup path.
+ *
* <p class="note"> Note: System stores this historical information in a ring buffer and only
* the most recent records will be returned. </p>
*
@@ -4249,6 +4253,9 @@
* Return a list of {@link ApplicationStartInfo} records containing the information about the
* most recent app startups.
*
+ * Records accessed using this path might include "incomplete" records such as in-progress app
+ * starts.
+ *
* <p class="note"> Note: System stores this historical information in a ring buffer and only
* the most recent records will be returned. </p>
*
@@ -4294,17 +4301,19 @@
}
/**
- * Adds a callback to be notified when the {@link ApplicationStartInfo} records of this startup
- * are complete.
+ * Adds a callback that is notified when the {@link ApplicationStartInfo} record of this startup
+ * is complete. The startup is considered complete when the first frame is drawn.
*
- * <p class="note"> Note: callback will be removed automatically after being triggered.</p>
+ * The callback doesn't wait for {@link Activity#reportFullyDrawn} to occur. Retrieve a copy
+ * of {@link ApplicationStartInfo} after {@link Activity#reportFullyDrawn} is called (using this
+ * callback or {@link getHistoricalProcessStartReasons}) if you need the
+ * {@link ApplicationStartInfo.START_TIMESTAMP_FULLY_DRAWN} timestamp.
*
- * <p class="note"> Note: callback will not wait for {@link Activity#reportFullyDrawn} to occur.
- * Timestamp for fully drawn may be added after callback occurs. Set callback after invoking
- * {@link Activity#reportFullyDrawn} if timestamp for fully drawn is required.</p>
+ * If the current start record has already been completed (that is, the process is not currently
+ * starting), the callback will be invoked immediately on the specified executor with the
+ * previously completed {@link ApplicationStartInfo} record.
*
- * <p class="note"> Note: if start records have already been retrieved, the callback will be
- * invoked immediately on the specified executor with the previously resolved AppStartInfo.</p>
+ * Callback will be called at most once and removed automatically after being triggered.
*
* <p class="note"> Note: callback is asynchronous and should be made from a background thread.
* </p>
@@ -4394,8 +4403,8 @@
* Adds an optional developer supplied timestamp to the calling apps most recent
* {@link ApplicationStartInfo}. This is in addition to system recorded timestamps.
*
- * <p class="note"> Note: timestamps added after {@link Activity#reportFullyDrawn} is called
- * will be discarded.</p>
+ * <p class="note"> Note: any timestamps added after {@link Activity#reportFullyDrawn} is called
+ * are discarded.</p>
*
* <p class="note"> Note: will overwrite existing timestamp if called with same key.</p>
*
diff --git a/core/java/android/app/ApplicationStartInfo.java b/core/java/android/app/ApplicationStartInfo.java
index f77c50a..0ff5514 100644
--- a/core/java/android/app/ApplicationStartInfo.java
+++ b/core/java/android/app/ApplicationStartInfo.java
@@ -60,6 +60,16 @@
* start times, throttling, and other useful diagnostic data can be obtained from
* {@link ApplicationStartInfo} records.
* </p>
+ *
+ * <p>
+* ApplicationStartInfo objects can be retrieved via:
+* - {@link ActivityManager#getHistoricalProcessStartReasons}, which can be called during or after
+ * a application's startup. Using this method, an app can retrieve information about an
+ * in-progress app start.
+* - {@link ActivityManager#addApplicationStartInfoCompletionListener}, which returns an
+ * ApplicationStartInfo object via a callback when the startup is complete, or immediately
+ * if requested after the startup is complete.
+ * </p>
*/
@FlaggedApi(Flags.FLAG_APP_START_INFO)
public final class ApplicationStartInfo implements Parcelable {
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 5bc0ddc..e2bee64 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -122,6 +122,7 @@
boolean onlyHasDefaultChannel(String pkg, int uid);
boolean areChannelsBypassingDnd();
ParceledListSlice getNotificationChannelsBypassingDnd(String pkg, int uid);
+ List<String> getPackagesBypassingDnd(int userId, boolean includeConversationChannels);
boolean isPackagePaused(String pkg);
void deleteNotificationHistoryItem(String pkg, int uid, long postedTime);
boolean isPermissionFixed(String pkg, int userId);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index a1fa404..a1c4267 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -6222,6 +6222,7 @@
if (appIconRes != 0) {
mN.mAppIcon = Icon.createWithResource(mContext, appIconRes);
contentView.setImageViewIcon(R.id.icon, mN.mAppIcon);
+ contentView.setBoolean(R.id.icon, "setShouldShowAppIcon", true);
usingAppIcon = true;
} else {
Log.w(TAG, "bindSmallIcon: could not get the app icon");
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 67752f2..fb0ce0d 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -13725,6 +13725,13 @@
* {@link #EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT} in the provisioning parameters.
* In that case the device owner's control will be limited to denying these permissions.
* <p>
+ * When sensor-related permissions aren't grantable due to the above cases, calling this method
+ * to grant these permissions will silently fail, if device admins are built with
+ * {@code targetSdkVersion} < {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM}. If
+ * they are built with {@code targetSdkVersion} >=
+ * {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM}, this method will throw a
+ * {@link SecurityException}.
+ * <p>
* NOTE: On devices running {@link android.os.Build.VERSION_CODES#S} and above, control over
* the following permissions are restricted for managed profile owners:
* <ul>
diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig
index 7d5806a..8227112 100644
--- a/core/java/android/app/admin/flags/flags.aconfig
+++ b/core/java/android/app/admin/flags/flags.aconfig
@@ -383,3 +383,13 @@
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "management_mode_policy_metrics"
+ namespace: "enterprise"
+ description: "Enabling management mode and password complexity policy metrics collection"
+ bug: "293091314"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 2e60cb0..dfa29738 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -6109,11 +6109,17 @@
* {@link ContentProvider#query(Uri, String[], Bundle, CancellationSignal)}
* method will contains the original intent Chooser has been launched with under the
* {@link #EXTRA_INTENT} key as a context for the current sharing session. The returned
- * {@link android.database.Cursor} should contain
- * {@link android.service.chooser.AdditionalContentContract.Columns#URI} column for the item URI
- * and, optionally, {@link AdditionalContentContract.CursorExtraKeys#POSITION} extra that
+ * {@link android.database.Cursor} should contain:
+ * <ul>
+ * <li>{@link android.service.chooser.AdditionalContentContract.Columns#URI} column for the item
+ * URI.</li>
+ * <li>Optional columns {@link MediaStore.MediaColumns#WIDTH} and
+ * {@link MediaStore.MediaColumns#HEIGHT} for the dimensions of the preview image.
+ * These columns can also be returned for each {@link #EXTRA_STREAM} item metadata
+ * {@link ContentProvider#query(Uri, String[], Bundle, CancellationSignal)} call.</li>
+ * <li>Optional {@link AdditionalContentContract.CursorExtraKeys#POSITION} extra that
* specifies the cursor starting position; the item at this position is expected to match the
- * item specified by {@link #EXTRA_CHOOSER_FOCUSED_ITEM_POSITION}.</p>
+ * item specified by {@link #EXTRA_CHOOSER_FOCUSED_ITEM_POSITION}.</li></ul></p>
*
* <p>When the user makes a selection change,
* {@link ContentProvider#call(String, String, Bundle)} method will be invoked with the "method"
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 1ebced5..52000d9 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -2954,6 +2954,15 @@
* There is a second caption drawn underneath it that will be fast enough. By default the
* caption is constructed from the theme. You can provide a drawable, that will be drawn instead
* to better match your application.
+ *
+ * Starting in Android 15, this API is a no-op. New window decorations introduced in Android 14
+ * are drawn in SystemUI process, and OEMs are responsible to make them responsive to resizing.
+ * There is no need to set a background drawable to improve UX anymore since then. Additionally,
+ * the foremost activity can draw in caption areas starting in Android 15. Check
+ * {@link WindowInsetsController#APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND},
+ * {@link WindowInsetsController#APPEARANCE_LIGHT_CAPTION_BARS},
+ * {@link WindowInsetsController#setSystemBarsAppearance(int, int)} and
+ * {@link WindowInsets#getBoundingRects(int)}.
*/
public abstract void setResizingCaptionDrawable(Drawable drawable);
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index d74867c..724e8fa 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -18,7 +18,6 @@
import static android.view.contentcapture.ContentCaptureHelper.sDebug;
import static android.view.contentcapture.ContentCaptureHelper.sVerbose;
import static android.view.contentcapture.ContentCaptureHelper.toSet;
-import static android.view.contentcapture.flags.Flags.runOnBackgroundThreadEnabled;
import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
@@ -602,26 +601,16 @@
public ContentCaptureSession getMainContentCaptureSession() {
synchronized (mLock) {
if (mMainSession == null) {
- mMainSession = prepareMainSession();
- if (sVerbose) Log.v(TAG, "getMainContentCaptureSession(): created " + mMainSession);
- }
- return mMainSession;
- }
- }
-
- @NonNull
- @GuardedBy("mLock")
- private ContentCaptureSession prepareMainSession() {
- if (runOnBackgroundThreadEnabled()) {
- return new MainContentCaptureSessionV2(
+ mMainSession = new MainContentCaptureSession(
mContext,
this,
prepareUiHandler(),
prepareContentCaptureHandler(),
mService
- );
- } else {
- return new MainContentCaptureSession(mContext, this, prepareUiHandler(), mService);
+ );
+ if (sVerbose) Log.v(TAG, "getMainContentCaptureSession(): created " + mMainSession);
+ }
+ return mMainSession;
}
}
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index a90c94e..eb827dd 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -69,16 +69,13 @@
import java.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
-// TODO(b/309411951): Replace V2 as the only main session once the experiment is done.
/**
* Main session associated with a context.
*
- * <p>This session is created when the activity starts and finished when it stops; clients can use
- * it to create children activities.
- *
* @hide
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
@@ -107,7 +104,10 @@
private final ContentCaptureManager mManager;
@NonNull
- private final Handler mHandler;
+ private final Handler mUiHandler;
+
+ @NonNull
+ private final Handler mContentCaptureHandler;
/**
* Interface to the system_server binder object - it's only used to start the session (and
@@ -142,6 +142,18 @@
public ComponentName mComponentName;
/**
+ * Thread-safe queue of events held to be processed as a batch.
+ *
+ * Because it is not guaranteed that the events will be enqueued from a single thread, the
+ * implementation must be thread-safe to prevent unexpected behaviour.
+ *
+ * @hide
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ @NonNull
+ public final ConcurrentLinkedQueue<ContentCaptureEvent> mEventProcessQueue;
+
+ /**
* List of events held to be sent to the {@link ContentCaptureService} as a batch.
*
* @hide
@@ -200,14 +212,14 @@
binder = resultData.getBinder(EXTRA_BINDER);
if (binder == null) {
Log.wtf(TAG, "No " + EXTRA_BINDER + " extra result");
- mainSession.mHandler.post(() -> mainSession.resetSession(
+ mainSession.runOnContentCaptureThread(() -> mainSession.resetSession(
STATE_DISABLED | STATE_INTERNAL_ERROR));
return;
}
} else {
binder = null;
}
- mainSession.mHandler.post(() ->
+ mainSession.runOnContentCaptureThread(() ->
mainSession.onSessionStarted(resultCode, binder));
}
}
@@ -217,17 +229,21 @@
public MainContentCaptureSession(
@NonNull ContentCaptureManager.StrippedContext context,
@NonNull ContentCaptureManager manager,
- @NonNull Handler handler,
+ @NonNull Handler uiHandler,
+ @NonNull Handler contentCaptureHandler,
@NonNull IContentCaptureManager systemServerInterface) {
mContext = context;
mManager = manager;
- mHandler = handler;
+ mUiHandler = uiHandler;
+ mContentCaptureHandler = contentCaptureHandler;
mSystemServerInterface = systemServerInterface;
final int logHistorySize = mManager.mOptions.logHistorySize;
mFlushHistory = logHistorySize > 0 ? new LocalLog(logHistorySize) : null;
mSessionStateReceiver = new SessionStateReceiver(this);
+
+ mEventProcessQueue = new ConcurrentLinkedQueue<>();
}
@Override
@@ -248,7 +264,13 @@
@Override
void start(@NonNull IBinder token, @NonNull IBinder shareableActivityToken,
@NonNull ComponentName component, int flags) {
- checkOnUiThread();
+ runOnContentCaptureThread(
+ () -> startImpl(token, shareableActivityToken, component, flags));
+ }
+
+ private void startImpl(@NonNull IBinder token, @NonNull IBinder shareableActivityToken,
+ @NonNull ComponentName component, int flags) {
+ checkOnContentCaptureThread();
if (!isContentCaptureEnabled()) return;
if (sVerbose) {
@@ -282,17 +304,15 @@
Log.w(TAG, "Error starting session for " + component.flattenToShortString() + ": " + e);
}
}
-
@Override
void onDestroy() {
- mHandler.removeMessages(MSG_FLUSH);
- mHandler.post(() -> {
+ clearAndRunOnContentCaptureThread(() -> {
try {
flush(FLUSH_REASON_SESSION_FINISHED);
} finally {
destroySession();
}
- });
+ }, MSG_FLUSH);
}
/**
@@ -305,7 +325,7 @@
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public void onSessionStarted(int resultCode, @Nullable IBinder binder) {
- checkOnUiThread();
+ checkOnContentCaptureThread();
if (binder != null) {
mDirectServiceInterface = IContentCaptureDirectManager.Stub.asInterface(binder);
mDirectServiceVulture = () -> {
@@ -324,7 +344,7 @@
mContentProtectionEventProcessor =
new ContentProtectionEventProcessor(
mManager.getContentProtectionEventBuffer(),
- mHandler,
+ mContentCaptureHandler,
mSystemServerInterface,
mComponentName.getPackageName(),
mManager.mOptions.contentProtectionOptions);
@@ -354,7 +374,7 @@
}
private void sendEvent(@NonNull ContentCaptureEvent event, boolean forceFlush) {
- checkOnUiThread();
+ checkOnContentCaptureThread();
final int eventType = event.getType();
if (sVerbose) Log.v(TAG, "handleSendEvent(" + getDebugState() + "): " + event);
if (!hasStarted() && eventType != ContentCaptureEvent.TYPE_SESSION_STARTED
@@ -398,14 +418,14 @@
}
private void sendContentProtectionEvent(@NonNull ContentCaptureEvent event) {
- checkOnUiThread();
+ checkOnContentCaptureThread();
if (mContentProtectionEventProcessor != null) {
mContentProtectionEventProcessor.processEvent(event);
}
}
private void sendContentCaptureEvent(@NonNull ContentCaptureEvent event, boolean forceFlush) {
- checkOnUiThread();
+ checkOnContentCaptureThread();
final int eventType = event.getType();
final int maxBufferSize = mManager.mOptions.maxBufferSize;
if (mEvents == null) {
@@ -540,12 +560,12 @@
}
private boolean hasStarted() {
- checkOnUiThread();
+ checkOnContentCaptureThread();
return mState != UNKNOWN_STATE;
}
private void scheduleFlush(@FlushReason int reason, boolean checkExisting) {
- checkOnUiThread();
+ checkOnContentCaptureThread();
if (sVerbose) {
Log.v(TAG, "handleScheduleFlush(" + getDebugState(reason)
+ ", checkExisting=" + checkExisting);
@@ -562,9 +582,9 @@
+ "when disabled. events=" + (mEvents == null ? null : mEvents.size()));
return;
}
- if (checkExisting && mHandler.hasMessages(MSG_FLUSH)) {
+ if (checkExisting && mContentCaptureHandler.hasMessages(MSG_FLUSH)) {
// "Renew" the flush message by removing the previous one
- mHandler.removeMessages(MSG_FLUSH);
+ mContentCaptureHandler.removeMessages(MSG_FLUSH);
}
final int flushFrequencyMs;
@@ -586,12 +606,12 @@
+ flushFrequencyMs + "ms: " + TimeUtils.logTimeOfDay(mNextFlush));
}
// Post using a Runnable directly to trim a few μs from PooledLambda.obtainMessage()
- mHandler.postDelayed(() ->
+ mContentCaptureHandler.postDelayed(() ->
flushIfNeeded(reason), MSG_FLUSH, flushFrequencyMs);
}
private void flushIfNeeded(@FlushReason int reason) {
- checkOnUiThread();
+ checkOnContentCaptureThread();
if (mEvents == null || mEvents.isEmpty()) {
if (sVerbose) Log.v(TAG, "Nothing to flush");
return;
@@ -603,7 +623,11 @@
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
@Override
public void flush(@FlushReason int reason) {
- checkOnUiThread();
+ runOnContentCaptureThread(() -> flushImpl(reason));
+ }
+
+ private void flushImpl(@FlushReason int reason) {
+ checkOnContentCaptureThread();
if (mEvents == null || mEvents.size() == 0) {
if (sVerbose) {
Log.v(TAG, "Don't flush for empty event buffer.");
@@ -626,7 +650,7 @@
Log.v(TAG, "handleForceFlush(" + getDebugState(reason) + "): hold your horses, "
+ "client not ready: " + mEvents);
}
- if (!mHandler.hasMessages(MSG_FLUSH)) {
+ if (!mContentCaptureHandler.hasMessages(MSG_FLUSH)) {
scheduleFlush(reason, /* checkExisting= */ false);
}
return;
@@ -652,7 +676,7 @@
mFlushHistory.log(logRecord);
}
try {
- mHandler.removeMessages(MSG_FLUSH);
+ mContentCaptureHandler.removeMessages(MSG_FLUSH);
final ParceledListSlice<ContentCaptureEvent> events = clearEvents();
mDirectServiceInterface.sendEvents(events, reason, mManager.mOptions);
@@ -672,7 +696,7 @@
*/
@NonNull
private ParceledListSlice<ContentCaptureEvent> clearEvents() {
- checkOnUiThread();
+ checkOnContentCaptureThread();
// NOTE: we must save a reference to the current mEvents and then set it to to null,
// otherwise clearing it would clear it in the receiving side if the service is also local.
if (mEvents == null) {
@@ -687,7 +711,7 @@
/** hide */
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public void destroySession() {
- checkOnUiThread();
+ checkOnContentCaptureThread();
if (sDebug) {
Log.d(TAG, "Destroying session (ctx=" + mContext + ", id=" + mId + ") with "
+ (mEvents == null ? 0 : mEvents.size()) + " event(s) for "
@@ -707,6 +731,7 @@
}
mDirectServiceInterface = null;
mContentProtectionEventProcessor = null;
+ mEventProcessQueue.clear();
}
// TODO(b/122454205): once we support multiple sessions, we might need to move some of these
@@ -714,7 +739,7 @@
/** @hide */
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public void resetSession(int newState) {
- checkOnUiThread();
+ checkOnContentCaptureThread();
if (sVerbose) {
Log.v(TAG, "handleResetSession(" + getActivityName() + "): from "
+ getStateAsString(mState) + " to " + getStateAsString(newState));
@@ -735,21 +760,21 @@
}
mDirectServiceInterface = null;
mContentProtectionEventProcessor = null;
- mHandler.removeMessages(MSG_FLUSH);
+ mContentCaptureHandler.removeMessages(MSG_FLUSH);
}
@Override
void internalNotifyViewAppeared(int sessionId, @NonNull ViewStructureImpl node) {
final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, TYPE_VIEW_APPEARED)
.setViewNode(node.mNode);
- mHandler.post(() -> sendEvent(event));
+ enqueueEvent(event);
}
@Override
void internalNotifyViewDisappeared(int sessionId, @NonNull AutofillId id) {
final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, TYPE_VIEW_DISAPPEARED)
.setAutofillId(id);
- mHandler.post(() -> sendEvent(event));
+ enqueueEvent(event);
}
@Override
@@ -780,7 +805,7 @@
.setAutofillId(id).setText(eventText)
.setComposingIndex(composingStart, composingEnd)
.setSelectionIndex(startIndex, endIndex);
- mHandler.post(() -> sendEvent(event));
+ enqueueEvent(event);
}
@Override
@@ -788,7 +813,7 @@
final ContentCaptureEvent event =
new ContentCaptureEvent(sessionId, TYPE_VIEW_INSETS_CHANGED)
.setInsets(viewInsets);
- mHandler.post(() -> sendEvent(event));
+ enqueueEvent(event);
}
@Override
@@ -798,19 +823,19 @@
final boolean forceFlush = disableFlush ? !started : FORCE_FLUSH;
final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, type);
- mHandler.post(() -> sendEvent(event, FORCE_FLUSH));
+ enqueueEvent(event, forceFlush);
}
@Override
public void internalNotifySessionResumed() {
final ContentCaptureEvent event = new ContentCaptureEvent(mId, TYPE_SESSION_RESUMED);
- mHandler.post(() -> sendEvent(event, FORCE_FLUSH));
+ enqueueEvent(event, FORCE_FLUSH);
}
@Override
public void internalNotifySessionPaused() {
final ContentCaptureEvent event = new ContentCaptureEvent(mId, TYPE_SESSION_PAUSED);
- mHandler.post(() -> sendEvent(event, FORCE_FLUSH));
+ enqueueEvent(event, FORCE_FLUSH);
}
@Override
@@ -818,12 +843,16 @@
return super.isContentCaptureEnabled() && mManager.isContentCaptureEnabled();
}
- @Override
+ // Called by ContentCaptureManager.isContentCaptureEnabled
boolean isDisabled() {
return mDisabled.get();
}
- @Override
+ /**
+ * Sets the disabled state of content capture.
+ *
+ * @return whether disabled state was changed.
+ */
boolean setDisabled(boolean disabled) {
return mDisabled.compareAndSet(!disabled, disabled);
}
@@ -835,7 +864,7 @@
new ContentCaptureEvent(childSessionId, TYPE_SESSION_STARTED)
.setParentSessionId(parentSessionId)
.setClientContext(clientContext);
- mHandler.post(() -> sendEvent(event, FORCE_FLUSH));
+ enqueueEvent(event, FORCE_FLUSH);
}
@Override
@@ -843,14 +872,14 @@
final ContentCaptureEvent event =
new ContentCaptureEvent(childSessionId, TYPE_SESSION_FINISHED)
.setParentSessionId(parentSessionId);
- mHandler.post(() -> sendEvent(event, FORCE_FLUSH));
+ enqueueEvent(event, FORCE_FLUSH);
}
@Override
void internalNotifyContextUpdated(int sessionId, @Nullable ContentCaptureContext context) {
final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, TYPE_CONTEXT_UPDATED)
.setClientContext(context);
- mHandler.post(() -> sendEvent(event, FORCE_FLUSH));
+ enqueueEvent(event, FORCE_FLUSH);
}
@Override
@@ -858,18 +887,97 @@
final ContentCaptureEvent event =
new ContentCaptureEvent(sessionId, TYPE_WINDOW_BOUNDS_CHANGED)
.setBounds(bounds);
- mHandler.post(() -> sendEvent(event));
+ enqueueEvent(event);
+ }
+
+ private List<ContentCaptureEvent> clearBufferEvents() {
+ final ArrayList<ContentCaptureEvent> bufferEvents = new ArrayList<>();
+ ContentCaptureEvent event;
+ while ((event = mEventProcessQueue.poll()) != null) {
+ bufferEvents.add(event);
+ }
+ return bufferEvents;
+ }
+
+ private void enqueueEvent(@NonNull final ContentCaptureEvent event) {
+ enqueueEvent(event, /* forceFlush */ false);
+ }
+
+ /**
+ * Enqueue the event into {@code mEventProcessBuffer} if it is not an urgent request. Otherwise,
+ * clear the buffer events then starting sending out current event.
+ */
+ private void enqueueEvent(@NonNull final ContentCaptureEvent event, boolean forceFlush) {
+ if (forceFlush || mEventProcessQueue.size() >= mManager.mOptions.maxBufferSize - 1) {
+ // The buffer events are cleared in the same thread first to prevent new events
+ // being added during the time of context switch. This would disrupt the sequence
+ // of events.
+ final List<ContentCaptureEvent> batchEvents = clearBufferEvents();
+ runOnContentCaptureThread(() -> {
+ for (int i = 0; i < batchEvents.size(); i++) {
+ sendEvent(batchEvents.get(i));
+ }
+ sendEvent(event, /* forceFlush= */ true);
+ });
+ } else {
+ mEventProcessQueue.offer(event);
+ }
}
@Override
public void notifyContentCaptureEvents(
@NonNull SparseArray<ArrayList<Object>> contentCaptureEvents) {
- notifyContentCaptureEventsImpl(contentCaptureEvents);
+ runOnUiThread(() -> {
+ prepareViewStructures(contentCaptureEvents);
+ runOnContentCaptureThread(() ->
+ notifyContentCaptureEventsImpl(contentCaptureEvents));
+ });
+ }
+
+ /**
+ * Traverse events and pre-process {@link View} events to {@link ViewStructureSession} events.
+ * If a {@link View} event is invalid, an empty {@link ViewStructureSession} will still be
+ * provided.
+ */
+ private void prepareViewStructures(
+ @NonNull SparseArray<ArrayList<Object>> contentCaptureEvents) {
+ for (int i = 0; i < contentCaptureEvents.size(); i++) {
+ int sessionId = contentCaptureEvents.keyAt(i);
+ ArrayList<Object> events = contentCaptureEvents.valueAt(i);
+ for_each_event: for (int j = 0; j < events.size(); j++) {
+ Object event = events.get(j);
+ if (event instanceof View) {
+ View view = (View) event;
+ ContentCaptureSession session = view.getContentCaptureSession();
+ ViewStructureSession structureSession = new ViewStructureSession();
+
+ // Replace the View event with ViewStructureSession no matter the data is
+ // available or not. This is to ensure the sequence of the events are still
+ // the same. Calls to notifyViewAppeared will check the availability later.
+ events.set(j, structureSession);
+ if (session == null) {
+ Log.w(TAG, "no content capture session on view: " + view);
+ continue for_each_event;
+ }
+ int actualId = session.getId();
+ if (actualId != sessionId) {
+ Log.w(TAG, "content capture session mismatch for view (" + view
+ + "): was " + sessionId + " before, it's " + actualId + " now");
+ continue for_each_event;
+ }
+ ViewStructure structure = session.newViewStructure(view);
+ view.onProvideContentCaptureStructure(structure, /* flags= */ 0);
+
+ structureSession.setSession(session);
+ structureSession.setStructure(structure);
+ }
+ }
+ }
}
private void notifyContentCaptureEventsImpl(
@NonNull SparseArray<ArrayList<Object>> contentCaptureEvents) {
- checkOnUiThread();
+ checkOnContentCaptureThread();
try {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "notifyContentCaptureEvents");
@@ -882,22 +990,8 @@
Object event = events.get(j);
if (event instanceof AutofillId) {
internalNotifyViewDisappeared(sessionId, (AutofillId) event);
- } else if (event instanceof View) {
- View view = (View) event;
- ContentCaptureSession session = view.getContentCaptureSession();
- if (session == null) {
- Log.w(TAG, "no content capture session on view: " + view);
- continue for_each_event;
- }
- int actualId = session.getId();
- if (actualId != sessionId) {
- Log.w(TAG, "content capture session mismatch for view (" + view
- + "): was " + sessionId + " before, it's " + actualId + " now");
- continue for_each_event;
- }
- ViewStructure structure = session.newViewStructure(view);
- view.onProvideContentCaptureStructure(structure, /* flags= */ 0);
- session.notifyViewAppeared(structure);
+ } else if (event instanceof ViewStructureSession viewStructureSession) {
+ viewStructureSession.notifyViewAppeared();
} else if (event instanceof Insets) {
internalNotifyViewInsetsChanged(sessionId, (Insets) event);
} else {
@@ -1015,9 +1109,9 @@
* Therefore, accessing internal properties in {@link MainContentCaptureSession} should
* always delegate to the assigned thread from {@code mHandler} for synchronization.</p>
*/
- private void checkOnUiThread() {
- final boolean onUiThread = mHandler.getLooper().isCurrentThread();
- if (!onUiThread) {
+ private void checkOnContentCaptureThread() {
+ final boolean onContentCaptureThread = mContentCaptureHandler.getLooper().isCurrentThread();
+ if (!onContentCaptureThread) {
mWrongThreadCount.incrementAndGet();
Log.e(TAG, "MainContentCaptureSession running on " + Thread.currentThread());
}
@@ -1028,4 +1122,63 @@
Counter.logIncrement(
CONTENT_CAPTURE_WRONG_THREAD_METRIC_ID, mWrongThreadCount.getAndSet(0));
}
+
+ /**
+ * Ensures that {@code r} will be running on the assigned thread.
+ *
+ * <p>This is to prevent unnecessary delegation to Handler that results in fragmented runnable.
+ * </p>
+ */
+ private void runOnContentCaptureThread(@NonNull Runnable r) {
+ if (!mContentCaptureHandler.getLooper().isCurrentThread()) {
+ mContentCaptureHandler.post(r);
+ } else {
+ r.run();
+ }
+ }
+
+ private void clearAndRunOnContentCaptureThread(@NonNull Runnable r, int what) {
+ if (!mContentCaptureHandler.getLooper().isCurrentThread()) {
+ mContentCaptureHandler.removeMessages(what);
+ mContentCaptureHandler.post(r);
+ } else {
+ r.run();
+ }
+ }
+
+ private void runOnUiThread(@NonNull Runnable r) {
+ if (mUiHandler.getLooper().isCurrentThread()) {
+ r.run();
+ } else {
+ mUiHandler.post(r);
+ }
+ }
+
+ /**
+ * Holds {@link ContentCaptureSession} and related {@link ViewStructure} for processing.
+ */
+ private static final class ViewStructureSession {
+ @Nullable private ContentCaptureSession mSession;
+ @Nullable private ViewStructure mStructure;
+
+ ViewStructureSession() {}
+
+ void setSession(@Nullable ContentCaptureSession session) {
+ this.mSession = session;
+ }
+
+ void setStructure(@Nullable ViewStructure struct) {
+ this.mStructure = struct;
+ }
+
+ /**
+ * Calls {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)} if the session and
+ * the view structure are available.
+ */
+ void notifyViewAppeared() {
+ if (mSession != null && mStructure != null) {
+ mSession.notifyViewAppeared(mStructure);
+ }
+ }
+ }
}
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSessionV2.java b/core/java/android/view/contentcapture/MainContentCaptureSessionV2.java
deleted file mode 100644
index fbb66d1..0000000
--- a/core/java/android/view/contentcapture/MainContentCaptureSessionV2.java
+++ /dev/null
@@ -1,1187 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.view.contentcapture;
-
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_CONTEXT_UPDATED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_FINISHED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_PAUSED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_RESUMED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_STARTED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_APPEARED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_DISAPPEARED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_INSETS_CHANGED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_TEXT_CHANGED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_TREE_APPEARED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_TREE_APPEARING;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_WINDOW_BOUNDS_CHANGED;
-import static android.view.contentcapture.ContentCaptureHelper.getSanitizedString;
-import static android.view.contentcapture.ContentCaptureHelper.sDebug;
-import static android.view.contentcapture.ContentCaptureHelper.sVerbose;
-import static android.view.contentcapture.ContentCaptureManager.RESULT_CODE_FALSE;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.pm.ParceledListSlice;
-import android.graphics.Insets;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.IBinder.DeathRecipient;
-import android.os.RemoteException;
-import android.os.Trace;
-import android.service.contentcapture.ContentCaptureService;
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.TextUtils;
-import android.util.LocalLog;
-import android.util.Log;
-import android.util.SparseArray;
-import android.util.TimeUtils;
-import android.view.View;
-import android.view.ViewStructure;
-import android.view.autofill.AutofillId;
-import android.view.contentcapture.ViewNode.ViewStructureImpl;
-import android.view.contentprotection.ContentProtectionEventProcessor;
-import android.view.inputmethod.BaseInputConnection;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.os.IResultReceiver;
-import com.android.modules.expresslog.Counter;
-
-import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Main session associated with a context.
- *
- * <p>This is forked from {@link MainContentCaptureSession} to hold the logic of running operations
- * in the background thread.</p>
- *
- * @hide
- */
-@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
-public final class MainContentCaptureSessionV2 extends ContentCaptureSession {
-
- private static final String TAG = MainContentCaptureSession.class.getSimpleName();
-
- private static final String CONTENT_CAPTURE_WRONG_THREAD_METRIC_ID =
- "content_capture.value_content_capture_wrong_thread_count";
-
- // For readability purposes...
- private static final boolean FORCE_FLUSH = true;
-
- /**
- * Handler message used to flush the buffer.
- */
- private static final int MSG_FLUSH = 1;
-
- @NonNull
- private final AtomicBoolean mDisabled = new AtomicBoolean(false);
-
- @NonNull
- private final ContentCaptureManager.StrippedContext mContext;
-
- @NonNull
- private final ContentCaptureManager mManager;
-
- @NonNull
- private final Handler mUiHandler;
-
- @NonNull
- private final Handler mContentCaptureHandler;
-
- /**
- * Interface to the system_server binder object - it's only used to start the session (and
- * notify when the session is finished).
- */
- @NonNull
- private final IContentCaptureManager mSystemServerInterface;
-
- /**
- * Direct interface to the service binder object - it's used to send the events, including the
- * last ones (when the session is finished)
- *
- * @hide
- */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- @Nullable
- public IContentCaptureDirectManager mDirectServiceInterface;
-
- @Nullable
- private DeathRecipient mDirectServiceVulture;
-
- private int mState = UNKNOWN_STATE;
-
- @Nullable
- private IBinder mApplicationToken;
- @Nullable
- private IBinder mShareableActivityToken;
-
- /** @hide */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- @Nullable
- public ComponentName mComponentName;
-
- /**
- * Thread-safe queue of events held to be processed as a batch.
- *
- * Because it is not guaranteed that the events will be enqueued from a single thread, the
- * implementation must be thread-safe to prevent unexpected behaviour.
- *
- * @hide
- */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- @NonNull
- public final ConcurrentLinkedQueue<ContentCaptureEvent> mEventProcessQueue;
-
- /**
- * List of events held to be sent to the {@link ContentCaptureService} as a batch.
- *
- * @hide
- */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- @Nullable
- public ArrayList<ContentCaptureEvent> mEvents;
-
- // Used just for debugging purposes (on dump)
- private long mNextFlush;
-
- /**
- * Whether the next buffer flush is queued by a text changed event.
- */
- private boolean mNextFlushForTextChanged = false;
-
- @Nullable
- private final LocalLog mFlushHistory;
-
- private final AtomicInteger mWrongThreadCount = new AtomicInteger(0);
-
- /**
- * Binder object used to update the session state.
- */
- @NonNull
- private final SessionStateReceiver mSessionStateReceiver;
-
- /** @hide */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- @Nullable
- public ContentProtectionEventProcessor mContentProtectionEventProcessor;
-
- private static class SessionStateReceiver extends IResultReceiver.Stub {
- private final WeakReference<MainContentCaptureSessionV2> mMainSession;
-
- SessionStateReceiver(MainContentCaptureSessionV2 session) {
- mMainSession = new WeakReference<>(session);
- }
-
- @Override
- public void send(int resultCode, Bundle resultData) {
- final MainContentCaptureSessionV2 mainSession = mMainSession.get();
- if (mainSession == null) {
- Log.w(TAG, "received result after mina session released");
- return;
- }
- final IBinder binder;
- if (resultData != null) {
- // Change in content capture enabled.
- final boolean hasEnabled = resultData.getBoolean(EXTRA_ENABLED_STATE);
- if (hasEnabled) {
- final boolean disabled = (resultCode == RESULT_CODE_FALSE);
- mainSession.mDisabled.set(disabled);
- return;
- }
- binder = resultData.getBinder(EXTRA_BINDER);
- if (binder == null) {
- Log.wtf(TAG, "No " + EXTRA_BINDER + " extra result");
- mainSession.runOnContentCaptureThread(() -> mainSession.resetSession(
- STATE_DISABLED | STATE_INTERNAL_ERROR));
- return;
- }
- } else {
- binder = null;
- }
- mainSession.runOnContentCaptureThread(() ->
- mainSession.onSessionStarted(resultCode, binder));
- }
- }
-
- /** @hide */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
- public MainContentCaptureSessionV2(
- @NonNull ContentCaptureManager.StrippedContext context,
- @NonNull ContentCaptureManager manager,
- @NonNull Handler uiHandler,
- @NonNull Handler contentCaptureHandler,
- @NonNull IContentCaptureManager systemServerInterface) {
- mContext = context;
- mManager = manager;
- mUiHandler = uiHandler;
- mContentCaptureHandler = contentCaptureHandler;
- mSystemServerInterface = systemServerInterface;
-
- final int logHistorySize = mManager.mOptions.logHistorySize;
- mFlushHistory = logHistorySize > 0 ? new LocalLog(logHistorySize) : null;
-
- mSessionStateReceiver = new SessionStateReceiver(this);
-
- mEventProcessQueue = new ConcurrentLinkedQueue<>();
- }
-
- @Override
- ContentCaptureSession getMainCaptureSession() {
- return this;
- }
-
- @Override
- ContentCaptureSession newChild(@NonNull ContentCaptureContext clientContext) {
- final ContentCaptureSession child = new ChildContentCaptureSession(this, clientContext);
- internalNotifyChildSessionStarted(mId, child.mId, clientContext);
- return child;
- }
-
- /**
- * Starts this session.
- */
- @Override
- void start(@NonNull IBinder token, @NonNull IBinder shareableActivityToken,
- @NonNull ComponentName component, int flags) {
- runOnContentCaptureThread(
- () -> startImpl(token, shareableActivityToken, component, flags));
- }
-
- private void startImpl(@NonNull IBinder token, @NonNull IBinder shareableActivityToken,
- @NonNull ComponentName component, int flags) {
- checkOnContentCaptureThread();
- if (!isContentCaptureEnabled()) return;
-
- if (sVerbose) {
- Log.v(TAG, "start(): token=" + token + ", comp="
- + ComponentName.flattenToShortString(component));
- }
-
- if (hasStarted()) {
- // TODO(b/122959591): make sure this is expected (and when), or use Log.w
- if (sDebug) {
- Log.d(TAG, "ignoring handleStartSession(" + token + "/"
- + ComponentName.flattenToShortString(component) + " while on state "
- + getStateAsString(mState));
- }
- return;
- }
- mState = STATE_WAITING_FOR_SERVER;
- mApplicationToken = token;
- mShareableActivityToken = shareableActivityToken;
- mComponentName = component;
-
- if (sVerbose) {
- Log.v(TAG, "handleStartSession(): token=" + token + ", act="
- + getDebugState() + ", id=" + mId);
- }
-
- try {
- mSystemServerInterface.startSession(mApplicationToken, mShareableActivityToken,
- component, mId, flags, mSessionStateReceiver);
- } catch (RemoteException e) {
- Log.w(TAG, "Error starting session for " + component.flattenToShortString() + ": " + e);
- }
- }
- @Override
- void onDestroy() {
- clearAndRunOnContentCaptureThread(() -> {
- try {
- flush(FLUSH_REASON_SESSION_FINISHED);
- } finally {
- destroySession();
- }
- }, MSG_FLUSH);
- }
-
- /**
- * Callback from {@code system_server} after call to {@link
- * IContentCaptureManager#startSession(IBinder, ComponentName, String, int, IResultReceiver)}.
- *
- * @param resultCode session state
- * @param binder handle to {@code IContentCaptureDirectManager}
- * @hide
- */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- public void onSessionStarted(int resultCode, @Nullable IBinder binder) {
- checkOnContentCaptureThread();
- if (binder != null) {
- mDirectServiceInterface = IContentCaptureDirectManager.Stub.asInterface(binder);
- mDirectServiceVulture = () -> {
- Log.w(TAG, "Keeping session " + mId + " when service died");
- mState = STATE_SERVICE_DIED;
- mDisabled.set(true);
- };
- try {
- binder.linkToDeath(mDirectServiceVulture, 0);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to link to death on " + binder + ": " + e);
- }
- }
-
- if (isContentProtectionEnabled()) {
- mContentProtectionEventProcessor =
- new ContentProtectionEventProcessor(
- mManager.getContentProtectionEventBuffer(),
- mContentCaptureHandler,
- mSystemServerInterface,
- mComponentName.getPackageName(),
- mManager.mOptions.contentProtectionOptions);
- } else {
- mContentProtectionEventProcessor = null;
- }
-
- if ((resultCode & STATE_DISABLED) != 0) {
- resetSession(resultCode);
- } else {
- mState = resultCode;
- mDisabled.set(false);
- // Flush any pending data immediately as buffering forced until now.
- flushIfNeeded(FLUSH_REASON_SESSION_CONNECTED);
- }
- if (sVerbose) {
- Log.v(TAG, "handleSessionStarted() result: id=" + mId + " resultCode=" + resultCode
- + ", state=" + getStateAsString(mState) + ", disabled=" + mDisabled.get()
- + ", binder=" + binder + ", events=" + (mEvents == null ? 0 : mEvents.size()));
- }
- }
-
- /** @hide */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- public void sendEvent(@NonNull ContentCaptureEvent event) {
- sendEvent(event, /* forceFlush= */ false);
- }
-
- private void sendEvent(@NonNull ContentCaptureEvent event, boolean forceFlush) {
- checkOnContentCaptureThread();
- final int eventType = event.getType();
- if (sVerbose) Log.v(TAG, "handleSendEvent(" + getDebugState() + "): " + event);
- if (!hasStarted() && eventType != ContentCaptureEvent.TYPE_SESSION_STARTED
- && eventType != ContentCaptureEvent.TYPE_CONTEXT_UPDATED) {
- // TODO(b/120494182): comment when this could happen (dialogs?)
- if (sVerbose) {
- Log.v(TAG, "handleSendEvent(" + getDebugState() + ", "
- + ContentCaptureEvent.getTypeAsString(eventType)
- + "): dropping because session not started yet");
- }
- return;
- }
- if (mDisabled.get()) {
- // This happens when the event was queued in the handler before the sesison was ready,
- // then handleSessionStarted() returned and set it as disabled - we need to drop it,
- // otherwise it will keep triggering handleScheduleFlush()
- if (sVerbose) Log.v(TAG, "handleSendEvent(): ignoring when disabled");
- return;
- }
-
- if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
- if (eventType == TYPE_VIEW_TREE_APPEARING) {
- Trace.asyncTraceBegin(
- Trace.TRACE_TAG_VIEW, /* methodName= */ "sendEventAsync", /* cookie= */ 0);
- }
- }
-
- if (isContentProtectionReceiverEnabled()) {
- sendContentProtectionEvent(event);
- }
- if (isContentCaptureReceiverEnabled()) {
- sendContentCaptureEvent(event, forceFlush);
- }
-
- if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
- if (eventType == TYPE_VIEW_TREE_APPEARED) {
- Trace.asyncTraceEnd(
- Trace.TRACE_TAG_VIEW, /* methodName= */ "sendEventAsync", /* cookie= */ 0);
- }
- }
- }
-
- private void sendContentProtectionEvent(@NonNull ContentCaptureEvent event) {
- checkOnContentCaptureThread();
- if (mContentProtectionEventProcessor != null) {
- mContentProtectionEventProcessor.processEvent(event);
- }
- }
-
- private void sendContentCaptureEvent(@NonNull ContentCaptureEvent event, boolean forceFlush) {
- checkOnContentCaptureThread();
- final int eventType = event.getType();
- final int maxBufferSize = mManager.mOptions.maxBufferSize;
- if (mEvents == null) {
- if (sVerbose) {
- Log.v(TAG, "handleSendEvent(): creating buffer for " + maxBufferSize + " events");
- }
- mEvents = new ArrayList<>(maxBufferSize);
- }
-
- // Some type of events can be merged together
- boolean addEvent = true;
-
- if (eventType == TYPE_VIEW_TEXT_CHANGED) {
- // We determine whether to add or merge the current event by following criteria:
- // 1. Don't have composing span: always add.
- // 2. Have composing span:
- // 2.1 either last or current text is empty: add.
- // 2.2 last event doesn't have composing span: add.
- // Otherwise, merge.
- final CharSequence text = event.getText();
- final boolean hasComposingSpan = event.hasComposingSpan();
- if (hasComposingSpan) {
- ContentCaptureEvent lastEvent = null;
- for (int index = mEvents.size() - 1; index >= 0; index--) {
- final ContentCaptureEvent tmpEvent = mEvents.get(index);
- if (event.getId().equals(tmpEvent.getId())) {
- lastEvent = tmpEvent;
- break;
- }
- }
- if (lastEvent != null && lastEvent.hasComposingSpan()) {
- final CharSequence lastText = lastEvent.getText();
- final boolean bothNonEmpty = !TextUtils.isEmpty(lastText)
- && !TextUtils.isEmpty(text);
- boolean equalContent =
- TextUtils.equals(lastText, text)
- && lastEvent.hasSameComposingSpan(event)
- && lastEvent.hasSameSelectionSpan(event);
- if (equalContent) {
- addEvent = false;
- } else if (bothNonEmpty) {
- lastEvent.mergeEvent(event);
- addEvent = false;
- }
- if (!addEvent && sVerbose) {
- Log.v(TAG, "Buffering VIEW_TEXT_CHANGED event, updated text="
- + getSanitizedString(text));
- }
- }
- }
- }
-
- if (!mEvents.isEmpty() && eventType == TYPE_VIEW_DISAPPEARED) {
- final ContentCaptureEvent lastEvent = mEvents.get(mEvents.size() - 1);
- if (lastEvent.getType() == TYPE_VIEW_DISAPPEARED
- && event.getSessionId() == lastEvent.getSessionId()) {
- if (sVerbose) {
- Log.v(TAG, "Buffering TYPE_VIEW_DISAPPEARED events for session "
- + lastEvent.getSessionId());
- }
- lastEvent.mergeEvent(event);
- addEvent = false;
- }
- }
-
- if (addEvent) {
- mEvents.add(event);
- }
-
- // TODO: we need to change when the flush happens so that we don't flush while the
- // composing span hasn't changed. But we might need to keep flushing the events for the
- // non-editable views and views that don't have the composing state; otherwise some other
- // Content Capture features may be delayed.
-
- final int numberEvents = mEvents.size();
-
- final boolean bufferEvent = numberEvents < maxBufferSize;
-
- if (bufferEvent && !forceFlush) {
- final int flushReason;
- if (eventType == TYPE_VIEW_TEXT_CHANGED) {
- mNextFlushForTextChanged = true;
- flushReason = FLUSH_REASON_TEXT_CHANGE_TIMEOUT;
- } else {
- if (mNextFlushForTextChanged) {
- if (sVerbose) {
- Log.i(TAG, "Not scheduling flush because next flush is for text changed");
- }
- return;
- }
-
- flushReason = FLUSH_REASON_IDLE_TIMEOUT;
- }
- scheduleFlush(flushReason, /* checkExisting= */ true);
- return;
- }
-
- if (mState != STATE_ACTIVE && numberEvents >= maxBufferSize) {
- // Callback from startSession hasn't been called yet - typically happens on system
- // apps that are started before the system service
- // TODO(b/122959591): try to ignore session while system is not ready / boot
- // not complete instead. Similarly, the manager service should return right away
- // when the user does not have a service set
- if (sDebug) {
- Log.d(TAG, "Closing session for " + getDebugState()
- + " after " + numberEvents + " delayed events");
- }
- resetSession(STATE_DISABLED | STATE_NO_RESPONSE);
- // TODO(b/111276913): denylist activity / use special flag to indicate that
- // when it's launched again
- return;
- }
- final int flushReason;
- switch (eventType) {
- case ContentCaptureEvent.TYPE_SESSION_STARTED:
- flushReason = FLUSH_REASON_SESSION_STARTED;
- break;
- case ContentCaptureEvent.TYPE_SESSION_FINISHED:
- flushReason = FLUSH_REASON_SESSION_FINISHED;
- break;
- case ContentCaptureEvent.TYPE_VIEW_TREE_APPEARING:
- flushReason = FLUSH_REASON_VIEW_TREE_APPEARING;
- break;
- case ContentCaptureEvent.TYPE_VIEW_TREE_APPEARED:
- flushReason = FLUSH_REASON_VIEW_TREE_APPEARED;
- break;
- default:
- flushReason = forceFlush ? FLUSH_REASON_FORCE_FLUSH : FLUSH_REASON_FULL;
- }
-
- flush(flushReason);
- }
-
- private boolean hasStarted() {
- checkOnContentCaptureThread();
- return mState != UNKNOWN_STATE;
- }
-
- private void scheduleFlush(@FlushReason int reason, boolean checkExisting) {
- checkOnContentCaptureThread();
- if (sVerbose) {
- Log.v(TAG, "handleScheduleFlush(" + getDebugState(reason)
- + ", checkExisting=" + checkExisting);
- }
- if (!hasStarted()) {
- if (sVerbose) Log.v(TAG, "handleScheduleFlush(): session not started yet");
- return;
- }
-
- if (mDisabled.get()) {
- // Should not be called on this state, as handleSendEvent checks.
- // But we rather add one if check and log than re-schedule and keep the session alive...
- Log.e(TAG, "handleScheduleFlush(" + getDebugState(reason) + "): should not be called "
- + "when disabled. events=" + (mEvents == null ? null : mEvents.size()));
- return;
- }
- if (checkExisting && mContentCaptureHandler.hasMessages(MSG_FLUSH)) {
- // "Renew" the flush message by removing the previous one
- mContentCaptureHandler.removeMessages(MSG_FLUSH);
- }
-
- final int flushFrequencyMs;
- if (reason == FLUSH_REASON_TEXT_CHANGE_TIMEOUT) {
- flushFrequencyMs = mManager.mOptions.textChangeFlushingFrequencyMs;
- } else {
- if (reason != FLUSH_REASON_IDLE_TIMEOUT) {
- if (sDebug) {
- Log.d(TAG, "handleScheduleFlush(" + getDebugState(reason) + "): not a timeout "
- + "reason because mDirectServiceInterface is not ready yet");
- }
- }
- flushFrequencyMs = mManager.mOptions.idleFlushingFrequencyMs;
- }
-
- mNextFlush = System.currentTimeMillis() + flushFrequencyMs;
- if (sVerbose) {
- Log.v(TAG, "handleScheduleFlush(): scheduled to flush in "
- + flushFrequencyMs + "ms: " + TimeUtils.logTimeOfDay(mNextFlush));
- }
- // Post using a Runnable directly to trim a few μs from PooledLambda.obtainMessage()
- mContentCaptureHandler.postDelayed(() ->
- flushIfNeeded(reason), MSG_FLUSH, flushFrequencyMs);
- }
-
- private void flushIfNeeded(@FlushReason int reason) {
- checkOnContentCaptureThread();
- if (mEvents == null || mEvents.isEmpty()) {
- if (sVerbose) Log.v(TAG, "Nothing to flush");
- return;
- }
- flush(reason);
- }
-
- /** @hide */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
- @Override
- public void flush(@FlushReason int reason) {
- runOnContentCaptureThread(() -> flushImpl(reason));
- }
-
- private void flushImpl(@FlushReason int reason) {
- checkOnContentCaptureThread();
- if (mEvents == null || mEvents.size() == 0) {
- if (sVerbose) {
- Log.v(TAG, "Don't flush for empty event buffer.");
- }
- return;
- }
-
- if (mDisabled.get()) {
- Log.e(TAG, "handleForceFlush(" + getDebugState(reason) + "): should not be when "
- + "disabled");
- return;
- }
-
- if (!isContentCaptureReceiverEnabled()) {
- return;
- }
-
- if (mDirectServiceInterface == null) {
- if (sVerbose) {
- Log.v(TAG, "handleForceFlush(" + getDebugState(reason) + "): hold your horses, "
- + "client not ready: " + mEvents);
- }
- if (!mContentCaptureHandler.hasMessages(MSG_FLUSH)) {
- scheduleFlush(reason, /* checkExisting= */ false);
- }
- return;
- }
-
- mNextFlushForTextChanged = false;
-
- final int numberEvents = mEvents.size();
- final String reasonString = getFlushReasonAsString(reason);
-
- if (sVerbose) {
- ContentCaptureEvent event = mEvents.get(numberEvents - 1);
- String forceString = (reason == FLUSH_REASON_FORCE_FLUSH) ? ". The force flush event "
- + ContentCaptureEvent.getTypeAsString(event.getType()) : "";
- Log.v(TAG, "Flushing " + numberEvents + " event(s) for " + getDebugState(reason)
- + forceString);
- }
- if (mFlushHistory != null) {
- // Logs reason, size, max size, idle timeout
- final String logRecord = "r=" + reasonString + " s=" + numberEvents
- + " m=" + mManager.mOptions.maxBufferSize
- + " i=" + mManager.mOptions.idleFlushingFrequencyMs;
- mFlushHistory.log(logRecord);
- }
- try {
- mContentCaptureHandler.removeMessages(MSG_FLUSH);
-
- final ParceledListSlice<ContentCaptureEvent> events = clearEvents();
- mDirectServiceInterface.sendEvents(events, reason, mManager.mOptions);
- } catch (RemoteException e) {
- Log.w(TAG, "Error sending " + numberEvents + " for " + getDebugState()
- + ": " + e);
- }
- }
-
- @Override
- public void updateContentCaptureContext(@Nullable ContentCaptureContext context) {
- internalNotifyContextUpdated(mId, context);
- }
-
- /**
- * Resets the buffer and return a {@link ParceledListSlice} with the previous events.
- */
- @NonNull
- private ParceledListSlice<ContentCaptureEvent> clearEvents() {
- checkOnContentCaptureThread();
- // NOTE: we must save a reference to the current mEvents and then set it to to null,
- // otherwise clearing it would clear it in the receiving side if the service is also local.
- if (mEvents == null) {
- return new ParceledListSlice<>(Collections.EMPTY_LIST);
- }
-
- final List<ContentCaptureEvent> events = new ArrayList<>(mEvents);
- mEvents.clear();
- return new ParceledListSlice<>(events);
- }
-
- /** hide */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- public void destroySession() {
- checkOnContentCaptureThread();
- if (sDebug) {
- Log.d(TAG, "Destroying session (ctx=" + mContext + ", id=" + mId + ") with "
- + (mEvents == null ? 0 : mEvents.size()) + " event(s) for "
- + getDebugState());
- }
-
- reportWrongThreadMetric();
- try {
- mSystemServerInterface.finishSession(mId);
- } catch (RemoteException e) {
- Log.e(TAG, "Error destroying system-service session " + mId + " for "
- + getDebugState() + ": " + e);
- }
-
- if (mDirectServiceInterface != null) {
- mDirectServiceInterface.asBinder().unlinkToDeath(mDirectServiceVulture, 0);
- }
- mDirectServiceInterface = null;
- mContentProtectionEventProcessor = null;
- mEventProcessQueue.clear();
- }
-
- // TODO(b/122454205): once we support multiple sessions, we might need to move some of these
- // clearings out.
- /** @hide */
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- public void resetSession(int newState) {
- checkOnContentCaptureThread();
- if (sVerbose) {
- Log.v(TAG, "handleResetSession(" + getActivityName() + "): from "
- + getStateAsString(mState) + " to " + getStateAsString(newState));
- }
- mState = newState;
- mDisabled.set((newState & STATE_DISABLED) != 0);
- // TODO(b/122454205): must reset children (which currently is owned by superclass)
- mApplicationToken = null;
- mShareableActivityToken = null;
- mComponentName = null;
- mEvents = null;
- if (mDirectServiceInterface != null) {
- try {
- mDirectServiceInterface.asBinder().unlinkToDeath(mDirectServiceVulture, 0);
- } catch (NoSuchElementException e) {
- Log.w(TAG, "IContentCaptureDirectManager does not exist");
- }
- }
- mDirectServiceInterface = null;
- mContentProtectionEventProcessor = null;
- mContentCaptureHandler.removeMessages(MSG_FLUSH);
- }
-
- @Override
- void internalNotifyViewAppeared(int sessionId, @NonNull ViewStructureImpl node) {
- final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, TYPE_VIEW_APPEARED)
- .setViewNode(node.mNode);
- enqueueEvent(event);
- }
-
- @Override
- void internalNotifyViewDisappeared(int sessionId, @NonNull AutofillId id) {
- final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, TYPE_VIEW_DISAPPEARED)
- .setAutofillId(id);
- enqueueEvent(event);
- }
-
- @Override
- void internalNotifyViewTextChanged(
- int sessionId, @NonNull AutofillId id, @Nullable CharSequence text) {
- // Since the same CharSequence instance may be reused in the TextView, we need to make
- // a copy of its content so that its value will not be changed by subsequent updates
- // in the TextView.
- CharSequence trimmed = TextUtils.trimToParcelableSize(text);
- final CharSequence eventText = trimmed != null && trimmed == text
- ? trimmed.toString()
- : trimmed;
-
- final int composingStart;
- final int composingEnd;
- if (text instanceof Spannable) {
- composingStart = BaseInputConnection.getComposingSpanStart((Spannable) text);
- composingEnd = BaseInputConnection.getComposingSpanEnd((Spannable) text);
- } else {
- composingStart = ContentCaptureEvent.MAX_INVALID_VALUE;
- composingEnd = ContentCaptureEvent.MAX_INVALID_VALUE;
- }
-
- final int startIndex = Selection.getSelectionStart(text);
- final int endIndex = Selection.getSelectionEnd(text);
-
- final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, TYPE_VIEW_TEXT_CHANGED)
- .setAutofillId(id).setText(eventText)
- .setComposingIndex(composingStart, composingEnd)
- .setSelectionIndex(startIndex, endIndex);
- enqueueEvent(event);
- }
-
- @Override
- void internalNotifyViewInsetsChanged(int sessionId, @NonNull Insets viewInsets) {
- final ContentCaptureEvent event =
- new ContentCaptureEvent(sessionId, TYPE_VIEW_INSETS_CHANGED)
- .setInsets(viewInsets);
- enqueueEvent(event);
- }
-
- @Override
- public void internalNotifyViewTreeEvent(int sessionId, boolean started) {
- final int type = started ? TYPE_VIEW_TREE_APPEARING : TYPE_VIEW_TREE_APPEARED;
- final boolean disableFlush = mManager.getFlushViewTreeAppearingEventDisabled();
- final boolean forceFlush = disableFlush ? !started : FORCE_FLUSH;
-
- final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, type);
- enqueueEvent(event, forceFlush);
- }
-
- @Override
- public void internalNotifySessionResumed() {
- final ContentCaptureEvent event = new ContentCaptureEvent(mId, TYPE_SESSION_RESUMED);
- enqueueEvent(event, FORCE_FLUSH);
- }
-
- @Override
- public void internalNotifySessionPaused() {
- final ContentCaptureEvent event = new ContentCaptureEvent(mId, TYPE_SESSION_PAUSED);
- enqueueEvent(event, FORCE_FLUSH);
- }
-
- @Override
- boolean isContentCaptureEnabled() {
- return super.isContentCaptureEnabled() && mManager.isContentCaptureEnabled();
- }
-
- // Called by ContentCaptureManager.isContentCaptureEnabled
- boolean isDisabled() {
- return mDisabled.get();
- }
-
- /**
- * Sets the disabled state of content capture.
- *
- * @return whether disabled state was changed.
- */
- boolean setDisabled(boolean disabled) {
- return mDisabled.compareAndSet(!disabled, disabled);
- }
-
- @Override
- void internalNotifyChildSessionStarted(int parentSessionId, int childSessionId,
- @NonNull ContentCaptureContext clientContext) {
- final ContentCaptureEvent event =
- new ContentCaptureEvent(childSessionId, TYPE_SESSION_STARTED)
- .setParentSessionId(parentSessionId)
- .setClientContext(clientContext);
- enqueueEvent(event, FORCE_FLUSH);
- }
-
- @Override
- void internalNotifyChildSessionFinished(int parentSessionId, int childSessionId) {
- final ContentCaptureEvent event =
- new ContentCaptureEvent(childSessionId, TYPE_SESSION_FINISHED)
- .setParentSessionId(parentSessionId);
- enqueueEvent(event, FORCE_FLUSH);
- }
-
- @Override
- void internalNotifyContextUpdated(int sessionId, @Nullable ContentCaptureContext context) {
- final ContentCaptureEvent event = new ContentCaptureEvent(sessionId, TYPE_CONTEXT_UPDATED)
- .setClientContext(context);
- enqueueEvent(event, FORCE_FLUSH);
- }
-
- @Override
- public void notifyWindowBoundsChanged(int sessionId, @NonNull Rect bounds) {
- final ContentCaptureEvent event =
- new ContentCaptureEvent(sessionId, TYPE_WINDOW_BOUNDS_CHANGED)
- .setBounds(bounds);
- enqueueEvent(event);
- }
-
- private List<ContentCaptureEvent> clearBufferEvents() {
- final ArrayList<ContentCaptureEvent> bufferEvents = new ArrayList<>();
- ContentCaptureEvent event;
- while ((event = mEventProcessQueue.poll()) != null) {
- bufferEvents.add(event);
- }
- return bufferEvents;
- }
-
- private void enqueueEvent(@NonNull final ContentCaptureEvent event) {
- enqueueEvent(event, /* forceFlush */ false);
- }
-
- /**
- * Enqueue the event into {@code mEventProcessBuffer} if it is not an urgent request. Otherwise,
- * clear the buffer events then starting sending out current event.
- */
- private void enqueueEvent(@NonNull final ContentCaptureEvent event, boolean forceFlush) {
- if (forceFlush || mEventProcessQueue.size() >= mManager.mOptions.maxBufferSize - 1) {
- // The buffer events are cleared in the same thread first to prevent new events
- // being added during the time of context switch. This would disrupt the sequence
- // of events.
- final List<ContentCaptureEvent> batchEvents = clearBufferEvents();
- runOnContentCaptureThread(() -> {
- for (int i = 0; i < batchEvents.size(); i++) {
- sendEvent(batchEvents.get(i));
- }
- sendEvent(event, /* forceFlush= */ true);
- });
- } else {
- mEventProcessQueue.offer(event);
- }
- }
-
- @Override
- public void notifyContentCaptureEvents(
- @NonNull SparseArray<ArrayList<Object>> contentCaptureEvents) {
- runOnUiThread(() -> {
- prepareViewStructures(contentCaptureEvents);
- runOnContentCaptureThread(() ->
- notifyContentCaptureEventsImpl(contentCaptureEvents));
- });
- }
-
- /**
- * Traverse events and pre-process {@link View} events to {@link ViewStructureSession} events.
- * If a {@link View} event is invalid, an empty {@link ViewStructureSession} will still be
- * provided.
- */
- private void prepareViewStructures(
- @NonNull SparseArray<ArrayList<Object>> contentCaptureEvents) {
- for (int i = 0; i < contentCaptureEvents.size(); i++) {
- int sessionId = contentCaptureEvents.keyAt(i);
- ArrayList<Object> events = contentCaptureEvents.valueAt(i);
- for_each_event: for (int j = 0; j < events.size(); j++) {
- Object event = events.get(j);
- if (event instanceof View) {
- View view = (View) event;
- ContentCaptureSession session = view.getContentCaptureSession();
- ViewStructureSession structureSession = new ViewStructureSession();
-
- // Replace the View event with ViewStructureSession no matter the data is
- // available or not. This is to ensure the sequence of the events are still
- // the same. Calls to notifyViewAppeared will check the availability later.
- events.set(j, structureSession);
- if (session == null) {
- Log.w(TAG, "no content capture session on view: " + view);
- continue for_each_event;
- }
- int actualId = session.getId();
- if (actualId != sessionId) {
- Log.w(TAG, "content capture session mismatch for view (" + view
- + "): was " + sessionId + " before, it's " + actualId + " now");
- continue for_each_event;
- }
- ViewStructure structure = session.newViewStructure(view);
- view.onProvideContentCaptureStructure(structure, /* flags= */ 0);
-
- structureSession.setSession(session);
- structureSession.setStructure(structure);
- }
- }
- }
- }
-
- private void notifyContentCaptureEventsImpl(
- @NonNull SparseArray<ArrayList<Object>> contentCaptureEvents) {
- checkOnContentCaptureThread();
- try {
- if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
- Trace.traceBegin(Trace.TRACE_TAG_VIEW, "notifyContentCaptureEvents");
- }
- for (int i = 0; i < contentCaptureEvents.size(); i++) {
- int sessionId = contentCaptureEvents.keyAt(i);
- internalNotifyViewTreeEvent(sessionId, /* started= */ true);
- ArrayList<Object> events = contentCaptureEvents.valueAt(i);
- for_each_event: for (int j = 0; j < events.size(); j++) {
- Object event = events.get(j);
- if (event instanceof AutofillId) {
- internalNotifyViewDisappeared(sessionId, (AutofillId) event);
- } else if (event instanceof ViewStructureSession viewStructureSession) {
- viewStructureSession.notifyViewAppeared();
- } else if (event instanceof Insets) {
- internalNotifyViewInsetsChanged(sessionId, (Insets) event);
- } else {
- Log.w(TAG, "invalid content capture event: " + event);
- }
- }
- internalNotifyViewTreeEvent(sessionId, /* started= */ false);
- }
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIEW);
- }
- }
-
- @Override
- void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
- super.dump(prefix, pw);
-
- pw.print(prefix); pw.print("mContext: "); pw.println(mContext);
- pw.print(prefix); pw.print("user: "); pw.println(mContext.getUserId());
- if (mDirectServiceInterface != null) {
- pw.print(prefix); pw.print("mDirectServiceInterface: ");
- pw.println(mDirectServiceInterface);
- }
- pw.print(prefix); pw.print("mDisabled: "); pw.println(mDisabled.get());
- pw.print(prefix); pw.print("isEnabled(): "); pw.println(isContentCaptureEnabled());
- pw.print(prefix); pw.print("state: "); pw.println(getStateAsString(mState));
- if (mApplicationToken != null) {
- pw.print(prefix); pw.print("app token: "); pw.println(mApplicationToken);
- }
- if (mShareableActivityToken != null) {
- pw.print(prefix); pw.print("sharable activity token: ");
- pw.println(mShareableActivityToken);
- }
- if (mComponentName != null) {
- pw.print(prefix); pw.print("component name: ");
- pw.println(mComponentName.flattenToShortString());
- }
- if (mEvents != null && !mEvents.isEmpty()) {
- final int numberEvents = mEvents.size();
- pw.print(prefix); pw.print("buffered events: "); pw.print(numberEvents);
- pw.print('/'); pw.println(mManager.mOptions.maxBufferSize);
- if (sVerbose && numberEvents > 0) {
- final String prefix3 = prefix + " ";
- for (int i = 0; i < numberEvents; i++) {
- final ContentCaptureEvent event = mEvents.get(i);
- pw.print(prefix3); pw.print(i); pw.print(": "); event.dump(pw);
- pw.println();
- }
- }
- pw.print(prefix); pw.print("mNextFlushForTextChanged: ");
- pw.println(mNextFlushForTextChanged);
- pw.print(prefix); pw.print("flush frequency: ");
- if (mNextFlushForTextChanged) {
- pw.println(mManager.mOptions.textChangeFlushingFrequencyMs);
- } else {
- pw.println(mManager.mOptions.idleFlushingFrequencyMs);
- }
- pw.print(prefix); pw.print("next flush: ");
- TimeUtils.formatDuration(mNextFlush - System.currentTimeMillis(), pw);
- pw.print(" ("); pw.print(TimeUtils.logTimeOfDay(mNextFlush)); pw.println(")");
- }
- if (mFlushHistory != null) {
- pw.print(prefix); pw.println("flush history:");
- mFlushHistory.reverseDump(/* fd= */ null, pw, /* args= */ null); pw.println();
- } else {
- pw.print(prefix); pw.println("not logging flush history");
- }
-
- super.dump(prefix, pw);
- }
-
- /**
- * Gets a string that can be used to identify the activity on logging statements.
- */
- private String getActivityName() {
- return mComponentName == null
- ? "pkg:" + mContext.getPackageName()
- : "act:" + mComponentName.flattenToShortString();
- }
-
- @NonNull
- private String getDebugState() {
- return getActivityName() + " [state=" + getStateAsString(mState) + ", disabled="
- + mDisabled.get() + "]";
- }
-
- @NonNull
- private String getDebugState(@FlushReason int reason) {
- return getDebugState() + ", reason=" + getFlushReasonAsString(reason);
- }
-
- private boolean isContentProtectionReceiverEnabled() {
- return mManager.mOptions.contentProtectionOptions.enableReceiver;
- }
-
- private boolean isContentCaptureReceiverEnabled() {
- return mManager.mOptions.enableReceiver;
- }
-
- private boolean isContentProtectionEnabled() {
- // Should not be possible for mComponentName to be null here but check anyway
- // Should not be possible for groups to be empty if receiver is enabled but check anyway
- return mManager.mOptions.contentProtectionOptions.enableReceiver
- && mManager.getContentProtectionEventBuffer() != null
- && mComponentName != null
- && (!mManager.mOptions.contentProtectionOptions.requiredGroups.isEmpty()
- || !mManager.mOptions.contentProtectionOptions.optionalGroups.isEmpty());
- }
-
- /**
- * Checks that the current work is running on the assigned thread from {@code mHandler} and
- * count the number of times running on the wrong thread.
- *
- * <p>It is not guaranteed that the callers always invoke function from a single thread.
- * Therefore, accessing internal properties in {@link MainContentCaptureSession} should
- * always delegate to the assigned thread from {@code mHandler} for synchronization.</p>
- */
- private void checkOnContentCaptureThread() {
- final boolean onContentCaptureThread = mContentCaptureHandler.getLooper().isCurrentThread();
- if (!onContentCaptureThread) {
- mWrongThreadCount.incrementAndGet();
- Log.e(TAG, "MainContentCaptureSession running on " + Thread.currentThread());
- }
- }
-
- /** Reports number of times running on the wrong thread. */
- private void reportWrongThreadMetric() {
- Counter.logIncrement(
- CONTENT_CAPTURE_WRONG_THREAD_METRIC_ID, mWrongThreadCount.getAndSet(0));
- }
-
- /**
- * Ensures that {@code r} will be running on the assigned thread.
- *
- * <p>This is to prevent unnecessary delegation to Handler that results in fragmented runnable.
- * </p>
- */
- private void runOnContentCaptureThread(@NonNull Runnable r) {
- if (!mContentCaptureHandler.getLooper().isCurrentThread()) {
- mContentCaptureHandler.post(r);
- } else {
- r.run();
- }
- }
-
- private void clearAndRunOnContentCaptureThread(@NonNull Runnable r, int what) {
- if (!mContentCaptureHandler.getLooper().isCurrentThread()) {
- mContentCaptureHandler.removeMessages(what);
- mContentCaptureHandler.post(r);
- } else {
- r.run();
- }
- }
-
- private void runOnUiThread(@NonNull Runnable r) {
- if (mUiHandler.getLooper().isCurrentThread()) {
- r.run();
- } else {
- mUiHandler.post(r);
- }
- }
-
- /**
- * Holds {@link ContentCaptureSession} and related {@link ViewStructure} for processing.
- */
- private static final class ViewStructureSession {
- @Nullable private ContentCaptureSession mSession;
- @Nullable private ViewStructure mStructure;
-
- ViewStructureSession() {}
-
- void setSession(@Nullable ContentCaptureSession session) {
- this.mSession = session;
- }
-
- void setStructure(@Nullable ViewStructure struct) {
- this.mStructure = struct;
- }
-
- /**
- * Calls {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)} if the session and
- * the view structure are available.
- */
- void notifyViewAppeared() {
- if (mSession != null && mStructure != null) {
- mSession.notifyViewAppeared(mStructure);
- }
- }
- }
-}
diff --git a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
index acc74b2..e7a2fb9 100644
--- a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
+++ b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
@@ -29,9 +29,11 @@
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
+import android.util.ExceptionUtils;
import android.view.WindowManager;
import android.window.ImeOnBackInvokedDispatcher;
+import com.android.internal.infra.AndroidFuture;
import com.android.internal.inputmethod.DirectBootAwareness;
import com.android.internal.inputmethod.IBooleanListener;
import com.android.internal.inputmethod.IConnectionlessHandwritingCallback;
@@ -48,6 +50,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
/**
@@ -62,6 +65,10 @@
* a wrapper method in {@link InputMethodManagerGlobal} instead of making this class public.</p>
*/
final class IInputMethodManagerGlobalInvoker {
+
+ /** The threshold in milliseconds for an {@link AndroidFuture} completion signal. */
+ private static final long TIMEOUT_MS = 10_000;
+
@Nullable
private static volatile IInputMethodManager sServiceCache = null;
@@ -801,9 +808,13 @@
return;
}
try {
- service.finishTrackingPendingImeVisibilityRequests();
+ final var completionSignal = new AndroidFuture<Void>();
+ service.finishTrackingPendingImeVisibilityRequests(completionSignal);
+ completionSignal.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
+ } catch (Exception e) {
+ throw ExceptionUtils.propagate(e);
}
}
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index 8bd39fb..8ded608 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -663,6 +663,7 @@
private final Rect mStartAbsBounds = new Rect();
private final Rect mEndAbsBounds = new Rect();
private final Point mEndRelOffset = new Point();
+ private final Point mEndParentSize = new Point();
private ActivityManager.RunningTaskInfo mTaskInfo = null;
private boolean mAllowEnterPip;
private int mStartDisplayId = INVALID_DISPLAY;
@@ -697,6 +698,7 @@
mStartAbsBounds.readFromParcel(in);
mEndAbsBounds.readFromParcel(in);
mEndRelOffset.readFromParcel(in);
+ mEndParentSize.readFromParcel(in);
mTaskInfo = in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR);
mAllowEnterPip = in.readBoolean();
mStartDisplayId = in.readInt();
@@ -721,6 +723,7 @@
out.mStartAbsBounds.set(mStartAbsBounds);
out.mEndAbsBounds.set(mEndAbsBounds);
out.mEndRelOffset.set(mEndRelOffset);
+ out.mEndParentSize.set(mEndParentSize);
out.mTaskInfo = mTaskInfo;
out.mAllowEnterPip = mAllowEnterPip;
out.mStartDisplayId = mStartDisplayId;
@@ -781,6 +784,13 @@
}
/**
+ * Sets the size of its parent container after the change.
+ */
+ public void setEndParentSize(int width, int height) {
+ mEndParentSize.set(width, height);
+ }
+
+ /**
* Sets the taskinfo of this container if this is a task. WARNING: this takes the
* reference, so don't modify it afterwards.
*/
@@ -916,6 +926,14 @@
return mEndRelOffset;
}
+ /**
+ * Returns the size of parent container after the change.
+ */
+ @NonNull
+ public Point getEndParentSize() {
+ return mEndParentSize;
+ }
+
/** @return the leash or surface to animate for this container */
@NonNull
public SurfaceControl getLeash() {
@@ -1003,6 +1021,7 @@
mStartAbsBounds.writeToParcel(dest, flags);
mEndAbsBounds.writeToParcel(dest, flags);
mEndRelOffset.writeToParcel(dest, flags);
+ mEndParentSize.writeToParcel(dest, flags);
dest.writeTypedObject(mTaskInfo, flags);
dest.writeBoolean(mAllowEnterPip);
dest.writeInt(mStartDisplayId);
@@ -1055,6 +1074,9 @@
if (mEndRelOffset.x != 0 || mEndRelOffset.y != 0) {
sb.append(" eo="); sb.append(mEndRelOffset);
}
+ if (!mEndParentSize.equals(0, 0)) {
+ sb.append(" epz=").append(mEndParentSize);
+ }
sb.append(" d=");
if (mStartDisplayId != mEndDisplayId) {
sb.append(mStartDisplayId).append("->");
diff --git a/core/java/com/android/internal/inputmethod/IImeTracker.aidl b/core/java/com/android/internal/inputmethod/IImeTracker.aidl
index ebae39e..0eaf02b 100644
--- a/core/java/com/android/internal/inputmethod/IImeTracker.aidl
+++ b/core/java/com/android/internal/inputmethod/IImeTracker.aidl
@@ -18,6 +18,8 @@
import android.view.inputmethod.ImeTracker;
+import com.android.internal.infra.AndroidFuture;
+
/**
* Interface to the global IME tracker service, used by all client applications.
* {@hide}
@@ -98,9 +100,12 @@
/**
* Finishes the tracking of any pending IME visibility requests. This won't stop the actual
* requests, but allows resetting the state when starting up test runs.
+ *
+ * @param completionSignal used to signal when the tracking has been finished.
*/
@EnforcePermission("TEST_INPUT_METHOD")
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
+ "android.Manifest.permission.TEST_INPUT_METHOD)")
- oneway void finishTrackingPendingImeVisibilityRequests();
+ oneway void finishTrackingPendingImeVisibilityRequests(
+ in AndroidFuture completionSignal /* T=Void */);
}
diff --git a/core/java/com/android/internal/os/OWNERS b/core/java/com/android/internal/os/OWNERS
index 996e424..391d257 100644
--- a/core/java/com/android/internal/os/OWNERS
+++ b/core/java/com/android/internal/os/OWNERS
@@ -12,3 +12,6 @@
per-file *PowerProfile* = file:/BATTERY_STATS_OWNERS
per-file *PowerStats* = file:/BATTERY_STATS_OWNERS
+# ANRs
+# Bug component : 158088 = per-file TimeoutRecord.java
+per-file TimeoutRecord.java = file:/PERFORMANCE_OWNERS
diff --git a/core/java/com/android/internal/os/TimeoutRecord.java b/core/java/com/android/internal/os/TimeoutRecord.java
index e9a8d4b..9306956 100644
--- a/core/java/com/android/internal/os/TimeoutRecord.java
+++ b/core/java/com/android/internal/os/TimeoutRecord.java
@@ -80,6 +80,9 @@
/** Latency tracker associated with this instance. */
public final AnrLatencyTracker mLatencyTracker;
+ /** A handle to the timer that expired. A value of null means "no timer". */
+ private AutoCloseable mExpiredTimer;
+
private TimeoutRecord(@TimeoutKind int kind, @NonNull String reason, long endUptimeMillis,
boolean endTakenBeforeLocks) {
this.mKind = kind;
@@ -87,6 +90,7 @@
this.mEndUptimeMillis = endUptimeMillis;
this.mEndTakenBeforeLocks = endTakenBeforeLocks;
this.mLatencyTracker = new AnrLatencyTracker(kind, endUptimeMillis);
+ this.mExpiredTimer = null;
}
private static TimeoutRecord endingNow(@TimeoutKind int kind, String reason) {
@@ -197,4 +201,22 @@
public static TimeoutRecord forAppStart(String reason) {
return TimeoutRecord.endingNow(TimeoutKind.APP_START, reason);
}
+
+ /** Record the ID of the timer that expired. */
+ @NonNull
+ public TimeoutRecord setExpiredTimer(@Nullable AutoCloseable handle) {
+ mExpiredTimer = handle;
+ return this;
+ }
+
+ /** Close the ExpiredTimer, if one is present. */
+ public void closeExpiredTimer() {
+ try {
+ if (mExpiredTimer != null) mExpiredTimer.close();
+ } catch (Exception e) {
+ // mExpiredTimer.close() should never, ever throw. If it does, just rethrow as a
+ // RuntimeException.
+ throw new RuntimeException(e);
+ }
+ }
}
diff --git a/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java b/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java
index f1ed3be..b7e68ba 100644
--- a/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java
+++ b/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java
@@ -36,11 +36,13 @@
private Context mContext;
private Runnable mOnChangeRunnable;
private Handler mMainHandler;
+ private Handler mBgHandler;
- public GestureNavigationSettingsObserver(Handler handler, Context context,
- Runnable onChangeRunnable) {
- super(handler);
- mMainHandler = handler;
+ public GestureNavigationSettingsObserver(
+ Handler mainHandler, Handler bgHandler, Context context, Runnable onChangeRunnable) {
+ super(mainHandler);
+ mMainHandler = mainHandler;
+ mBgHandler = bgHandler;
mContext = context;
mOnChangeRunnable = onChangeRunnable;
}
@@ -60,45 +62,51 @@
* Registers the observer for all users.
*/
public void register() {
- ContentResolver r = mContext.getContentResolver();
- r.registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_LEFT),
- false, this, UserHandle.USER_ALL);
- r.registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_RIGHT),
- false, this, UserHandle.USER_ALL);
- r.registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE),
- false, this, UserHandle.USER_ALL);
- DeviceConfig.addOnPropertiesChangedListener(
- DeviceConfig.NAMESPACE_SYSTEMUI,
- runnable -> mMainHandler.post(runnable),
- mOnPropertiesChangedListener);
+ mBgHandler.post(() -> {
+ ContentResolver r = mContext.getContentResolver();
+ r.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_LEFT),
+ false, this, UserHandle.USER_ALL);
+ r.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_RIGHT),
+ false, this, UserHandle.USER_ALL);
+ r.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE),
+ false, this, UserHandle.USER_ALL);
+ DeviceConfig.addOnPropertiesChangedListener(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ runnable -> mMainHandler.post(runnable),
+ mOnPropertiesChangedListener);
+ });
}
/**
* Registers the observer for the calling user.
*/
public void registerForCallingUser() {
- ContentResolver r = mContext.getContentResolver();
- r.registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_LEFT),
- false, this);
- r.registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_RIGHT),
- false, this);
- r.registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE),
- false, this);
- DeviceConfig.addOnPropertiesChangedListener(
- DeviceConfig.NAMESPACE_SYSTEMUI,
- runnable -> mMainHandler.post(runnable),
- mOnPropertiesChangedListener);
+ mBgHandler.post(() -> {
+ ContentResolver r = mContext.getContentResolver();
+ r.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_LEFT),
+ false, this);
+ r.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_RIGHT),
+ false, this);
+ r.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE),
+ false, this);
+ DeviceConfig.addOnPropertiesChangedListener(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ runnable -> mMainHandler.post(runnable),
+ mOnPropertiesChangedListener);
+ });
}
public void unregister() {
- mContext.getContentResolver().unregisterContentObserver(this);
- DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
+ mBgHandler.post(() -> {
+ mContext.getContentResolver().unregisterContentObserver(this);
+ DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
+ });
}
@Override
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 40d760e..42be4fc 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -4069,10 +4069,7 @@
}
@Override
- public void setResizingCaptionDrawable(Drawable drawable) {
- // TODO(b/333724879): Deprecate this public API. The new caption in WM shell allows the app
- // content to draw behind it directly if requested.
- }
+ public void setResizingCaptionDrawable(Drawable drawable) {}
@Override
public void setDecorCaptionShade(int decorCaptionShade) {
diff --git a/core/java/com/android/internal/widget/NotificationRowIconView.java b/core/java/com/android/internal/widget/NotificationRowIconView.java
index 58bddae..f5f04a7 100644
--- a/core/java/com/android/internal/widget/NotificationRowIconView.java
+++ b/core/java/com/android/internal/widget/NotificationRowIconView.java
@@ -22,7 +22,12 @@
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
@@ -36,6 +41,13 @@
@RemoteViews.RemoteView
public class NotificationRowIconView extends CachingIconView {
private boolean mApplyCircularCrop = false;
+ private boolean mShouldShowAppIcon = false;
+
+ // Padding and background set on the view prior to being changed by setShouldShowAppIcon(true),
+ // to be restored if shouldShowAppIcon becomes false again.
+ private Rect mOriginalPadding = null;
+ private Drawable mOriginalBackground = null;
+
public NotificationRowIconView(Context context) {
super(context);
@@ -59,7 +71,7 @@
@Override
protected void onFinishInflate() {
// If showing the app icon, we don't need background or padding.
- if (Flags.notificationsUseAppIcon() || Flags.notificationsUseAppIconInRow()) {
+ if (Flags.notificationsUseAppIcon()) {
setPadding(0, 0, 0, 0);
setBackground(null);
}
@@ -67,6 +79,42 @@
super.onFinishInflate();
}
+ /** Whether the icon represents the app icon (instead of the small icon). */
+ @RemotableViewMethod
+ public void setShouldShowAppIcon(boolean shouldShowAppIcon) {
+ if (Flags.notificationsUseAppIconInRow()) {
+ if (mShouldShowAppIcon == shouldShowAppIcon) {
+ return; // no change
+ }
+
+ mShouldShowAppIcon = shouldShowAppIcon;
+ if (mShouldShowAppIcon) {
+ if (mOriginalPadding == null && mOriginalBackground == null) {
+ mOriginalPadding = new Rect(getPaddingLeft(), getPaddingTop(),
+ getPaddingRight(), getPaddingBottom());
+ mOriginalBackground = getBackground();
+ }
+
+ setPadding(0, 0, 0, 0);
+
+ // Make the background white in case the icon itself doesn't have one.
+ int white = Color.rgb(255, 255, 255);
+ ColorFilter colorFilter = new PorterDuffColorFilter(white,
+ PorterDuff.Mode.SRC_ATOP);
+ getBackground().mutate().setColorFilter(colorFilter);
+ } else {
+ // Restore original padding and background if needed
+ if (mOriginalPadding != null) {
+ setPadding(mOriginalPadding.left, mOriginalPadding.top, mOriginalPadding.right,
+ mOriginalPadding.bottom);
+ mOriginalPadding = null;
+ }
+ setBackground(mOriginalBackground);
+ mOriginalBackground = null;
+ }
+ }
+ }
+
@Nullable
@Override
Drawable loadSizeRestrictedIcon(@Nullable Icon icon) {
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 18425fe..0c6d49e 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is te kort. Moet ten minste 4 syfers wees."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Probeer later weer"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Bekyk tans volskerm"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Swiep van bo na onder as jy wil uitgaan."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Het dit"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Draai vir ’n beter aansig"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Maak <xliff:g id="NAME">%s</xliff:g> in volskerm oop vir ’n beter aansig"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 965160e..39152fe 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ፒን በጣም አጭር ነው። ቢያንስ 4 አሃዝ መሆን አለበት።"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ቆይተው እንደገና ይሞክሩ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ሙሉ ገፅ በማሳየት ላይ"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"ለመውጣት፣ ከላይ ወደታች ጠረግ ያድርጉ።"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"ገባኝ"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"ለተሻለ ዕይታ ያሽከርክሩ"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"ለተሻለ ዕይታ <xliff:g id="NAME">%s</xliff:g>ን በሙሉ ገጽ ዕይታ ይክፈቱ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 3e396e0..3d066d9 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1887,7 +1887,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"رقم التعريف الشخصي أقصر مما يلزم، يجب ألا يقل عن ٤ أرقام. "</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"أعد المحاولة لاحقًا"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"جارٍ العرض بملء الشاشة"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"للخروج، مرر بسرعة من أعلى إلى أسفل."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"حسنًا"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"يمكنك تدوير الجهاز لرؤية شاشة معاينة الكاميرا بشكل أوضح."</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"عليك فتح \"<xliff:g id="NAME">%s</xliff:g>\" في وضع ملء الشاشة لرؤية شاشة معاينة الكاميرا بشكل أوضح."</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 5f9f16a..b9c072b 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"পিনটো অতি চুটি। কমেও ৪টা সংখ্যাৰ হ\'ব লাগিব।"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"পাছত আকৌ চেষ্টা কৰক"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"স্ক্ৰীন পূৰ্ণৰূপত চাই আছে"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"বাহিৰ হ\'বলৈ ওপৰৰপৰা তললৈ ছোৱাইপ কৰক।"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"বুজি পালোঁ"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"ভালকৈ চাবলৈ ঘূৰাওক"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"ভালকৈ চাবলৈ <xliff:g id="NAME">%s</xliff:g> পূৰ্ণ স্ক্ৰীনত খোলক"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index c4327e7..32210f7 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PİN çox qısadır. Ən azı 4 rəqəm olmalıdır."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Daha sonra yenidən yoxlayın."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Tam ekrana baxış"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Çıxmaq üçün yuxarıdan aşağı sürüşdürün."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Anladım"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Daha yaxşı görünüş üçün fırladın"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Yaxşı görmək üçün <xliff:g id="NAME">%s</xliff:g> tətbiqini tam ekranda açın"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 2b81e1c..ac01883 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN je prekratak. Mora da ima bar 4 cifre."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Probajte ponovo kasnije"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Prikazuje se ceo ekran"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Da biste izašli, prevucite nadole odozgo."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Važi"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotirajte radi boljeg prikaza"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Otvorite aplikaciju <xliff:g id="NAME">%s</xliff:g> preko celog ekrana da biste bolje videli"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 7d1f6be..cbcc90a 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1885,7 +1885,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-код занадта кароткі. Павінен змяшчаць не менш за 4 лічбы."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Паўтарыце спробу пазней"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Прагляд у поўнаэкранным рэжыме"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Для выхаду правядзіце зверху ўніз."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Зразумела"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Павярнуць для лепшага прагляду"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Для больш зручнага прагляду адкрыйце праграму \"<xliff:g id="NAME">%s</xliff:g>\", выкарыстоўваючы поўнаэкранны рэжым"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index a2f0364..affa311 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ПИН кодът е твърде кратък. Трябва да е поне 4 цифри."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Опитайте отново по-късно"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Изглед на цял екран"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"За изход плъзнете пръст надолу от горната част."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Разбрах"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Завъртете за по-добър изглед"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Отворете <xliff:g id="NAME">%s</xliff:g> на цял екран за по-добър изглед"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index e21b5c0..889de67 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"পিন খুবই ছোট৷ এটিকে কমপক্ষে ৪ সংখ্যার হতে হবে৷"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"পরে আবার চেষ্টা করুন"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"পূর্ণ স্ক্রিনে দেখা হচ্ছে"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"প্রস্থান করতে উপর থেকে নিচের দিকে সোয়াইপ করুন"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"বুঝেছি"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"আরও ভাল ক্যামেরা ভিউ পাওয়ার জন্য ঘোরান"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"আরও ভাল ভিউয়ের জন্য ফুল স্ক্রিনে <xliff:g id="NAME">%s</xliff:g> খুলুন"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 2f285f1..af9ac56 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN je prekratak. Mora imati najmanje 4 cifre."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Pokušajte ponovo kasnije."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Prikazuje se cijeli ekran"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Da izađete, prevucite odozgo nadolje."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Razumijem"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotirajte za bolji prikaz"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Otvorite aplikaciju <xliff:g id="NAME">%s</xliff:g> preko cijelog ekrana radi boljeg pregleda"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 48ba090c..66c81e6 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"El PIN és massa curt. Ha de tenir quatre dígits com a mínim."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Torna-ho a provar més tard"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Mode de pantalla completa"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Per sortir, llisca cap avall des de la part superior."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Entesos"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Gira per a una millor visualització"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Obre <xliff:g id="NAME">%s</xliff:g> en pantalla completa per a una millor visualització"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 64ccaf5..ad43a95 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1885,7 +1885,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Kód PIN je příliš krátký. Musí mít alespoň čtyři číslice."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Zkuste to znovu později"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Zobrazení celé obrazovky"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Režim ukončíte přejetím prstem shora dolů."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Rozumím"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Otočte obrazovku, abyste lépe viděli"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Otevřete aplikaci <xliff:g id="NAME">%s</xliff:g> na celou obrazovku, aby byla lépe vidět"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index a499afc..e32b0b6 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Pinkoden er for kort. Den skal være på mindst 4 tal."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Prøv igen senere"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visning i fuld skærm"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Stryg ned fra toppen for at afslutte."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK, det er forstået"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Roter, og få en bedre visning"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Åbn <xliff:g id="NAME">%s</xliff:g> i fuld skærm for at få en bedre visning"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 464a5373..ca858790 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Die PIN ist zu kurz. Sie muss mindestens 4 Ziffern umfassen."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Später erneut versuchen"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Vollbildmodus wird aktiviert"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Zum Beenden von oben nach unten wischen"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Ok"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Drehen, um die Ansicht zu verbessern"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Du kannst <xliff:g id="NAME">%s</xliff:g> im Vollbildmodus öffnen, um die Ansicht zu verbessern"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 98ce03c..cb1d3b1 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Το PIN είναι υπερβολικά μικρό. Πρέπει να έχει μέγεθος τουλάχιστον 4 χαρακτήρων."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Δοκιμάστε ξανά αργότερα"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Προβολή σε πλήρη οθόνη"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Για έξοδο, σύρετε προς τα κάτω από το επάνω μέρος."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Το κατάλαβα"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Περιστρέψτε την οθόνη για καλύτερη προβολή"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Ανοίξτε την εφαρμογή <xliff:g id="NAME">%s</xliff:g> σε πλήρη οθόνη για καλύτερη προβολή"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 1d2fc4d..e748648 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least four digits."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Got it"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotate for a better view"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Open <xliff:g id="NAME">%s</xliff:g> in full screen for a better view"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index c03bb3c..3c1ae77 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least 4 digits."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Got it"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotate for a better view"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Open <xliff:g id="NAME">%s</xliff:g> in full screen for a better view"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 436d7ae..818614a 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least four digits."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Got it"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotate for a better view"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Open <xliff:g id="NAME">%s</xliff:g> in full screen for a better view"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index d34ed3f6e..a58f731 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least four digits."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Got it"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotate for a better view"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Open <xliff:g id="NAME">%s</xliff:g> in full screen for a better view"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index c2c107c..5572714 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least 4 digits."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Got it"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotate for a better view"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Open <xliff:g id="NAME">%s</xliff:g> in full screen for a better view"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index df7deac..94591ea8 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"El PIN es demasiado corto. Debe tener al menos 4 dígitos."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Vuelve a intentar más tarde."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualización en pantalla completa"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Para salir, desliza el dedo hacia abajo desde la parte superior."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Entendido"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Gira la pantalla para obtener una mejor vista"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Abre <xliff:g id="NAME">%s</xliff:g> en pantalla completa para una mejor visualización"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index e22430f..2634494 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"El PIN es demasiado corto. Debe tener al menos 4 dígitos."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Reintentar más tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Modo de pantalla completa"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Para salir, desliza el dedo de arriba abajo."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Entendido"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Gira la pantalla para verlo mejor"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Abre <xliff:g id="NAME">%s</xliff:g> en pantalla completa para verlo mejor"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 979079d..9c9ff1b 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-kood on liiga lühike. Peab olema vähemalt 4-kohaline."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Proovige hiljem uuesti"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Kuvamine täisekraanil"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Väljumiseks pühkige ülevalt alla."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Selge"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Pöörake parema vaate jaoks"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Parema vaate jaoks avage rakendus <xliff:g id="NAME">%s</xliff:g> täisekraanil"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 06855f5..d2f77eb 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PINa laburregia da. Lau digitu izan behar ditu gutxienez."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Saiatu berriro geroago"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Pantaila osoko ikuspegia"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Irteteko, pasatu hatza goitik behera."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Ados"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Biratu pantaila ikuspegi hobea lortzeko"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Ireki <xliff:g id="NAME">%s</xliff:g> pantaila osoan eta ikuspegi hobea lortuko duzu"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index b0e6e6e..d761c8a 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"پین بیش از حد کوتاه است. باید حداقل ۴ رقم باشد."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"بعداً دوباره امتحان کنید"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"مشاهده در حالت تمام صفحه"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"برای خروج، انگشتتان را از بالای صفحه به پایین بکشید."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"متوجه شدم"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"برای دید بهتر، دستگاه را بچرخانید"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"برای دید بهتر، <xliff:g id="NAME">%s</xliff:g> را بهصورت تمامصفحه باز کنید"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 7e2fa9c..9a7bfff 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-koodi on liian lyhyt. Vähimmäispituus on neljä merkkiä."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Yritä myöhemmin uudelleen"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Koko ruudun tilassa"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Sulje palkki pyyhkäisemällä alas ruudun ylälaidasta."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Selvä"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Kierrä, niin saat paremman näkymän"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Avaa <xliff:g id="NAME">%s</xliff:g>, niin saat paremman näkymän"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index a21aefb..cc56526 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le NIP est trop court. Il doit comporter au moins 4 chiffres."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Réessayez plus tard"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Affichage plein écran"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Pour quitter, balayez vers le bas à partir du haut."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Faire pivoter pour obtenir un meilleur affichage"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Ouvrir <xliff:g id="NAME">%s</xliff:g> en plein écran pour un meilleur affichage"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 486124e..f1a81a3 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le code PIN est trop court. Il doit comporter au moins 4 chiffres."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Veuillez réessayer ultérieurement."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Affichage en plein écran"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Pour quitter, balayez l\'écran du haut vers le bas."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Faites pivoter pour mieux voir"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Ouvrez <xliff:g id="NAME">%s</xliff:g> en plein écran pour mieux voir"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 9994a3e..c29d888 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"O PIN é demasiado curto. Debe conter polo menos 4 díxitos."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Téntao de novo máis tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Vendo pantalla completa"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Para saír, pasa o dedo cara abaixo desde a parte superior."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Entendido"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Xira a pantalla para que se vexa mellor"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Abre <xliff:g id="NAME">%s</xliff:g> en pantalla completa para unha mellor visualización"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 3206242..4d350a0 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"પિન ખૂબ નાનો છે. ઓછામાં ઓછો 4 અંકનો હોવો આવશ્યક છે."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"પછી ફરી પ્રયાસ કરો"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"પૂર્ણ સ્ક્રીન પર જુઓ"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"બહાર નીકળવા માટે, ટોચ પરથી નીચે સ્વાઇપ કરો."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"સમજાઈ ગયું"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"બહેતર વ્યૂ માટે ફેરવો"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"બહેતર વ્યૂ માટે, પૂર્ણ સ્ક્રીનમાં <xliff:g id="NAME">%s</xliff:g> ખોલો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index f7ae13e..39e6625 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN बहुत छोटा है. कम से कम 4 अंकों का होना चाहिए."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"बाद में फिर से प्रयास करें"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"आप पूरे स्क्रीन पर देख रहे हैं"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"बाहर निकलने के लिए, ऊपर से नीचे स्वाइप करें."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"ठीक है"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"बेहतर व्यू पाने के लिए, डिवाइस की स्क्रीन को घुमाएं"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"बेहतर व्यू पाने के लिए <xliff:g id="NAME">%s</xliff:g> को फ़ुल स्क्रीन में खोलें"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index f6f7e8b..08ea4a2 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN je prekratak. Mora imati barem 4 znamenke."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Pokušajte ponovo kasnije"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Gledanje preko cijelog zaslona"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Za izlaz prijeđite prstom od vrha prema dolje."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Shvaćam"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Zakrenite kako biste bolje vidjeli"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Otvorite aplikaciju <xliff:g id="NAME">%s</xliff:g> preko cijelog zaslona za bolji prikaz"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 5162616..729fad9 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"A PIN-kód túl rövid. Legalább 4 számjegyből kell állnia."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Próbálkozzon később"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Megtekintése teljes képernyőn"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Kilépéshez csúsztassa ujját fentről lefelé."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Értem"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Forgassa el a jobb élmény érdekében"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"A jobb élmény érdekében teljes képernyős módban nyissa meg a(z) <xliff:g id="NAME">%s</xliff:g> alkalmazást"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index f2b6932..c3eec0f 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-ը չափազանց կարճ է: Պետք է ունենա առնվազն 4 թվանիշ:"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Կրկին փորձեք մի փոքր ուշ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Լիաէկրան դիտում"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Դուրս գալու համար վերևից սահահարվածեք դեպի ներքև:"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Պարզ է"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Պտտեք՝ դիտակերպը լավացնելու համար"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Բացեք <xliff:g id="NAME">%s</xliff:g> հավելվածը լիաէկրան ռեժիմում՝ դիտակերպը լավացնելու համար"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index d1a20f34..34a52e4 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN terlalu pendek. Minimal 4 digit."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Coba lagi nanti"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Melihat layar penuh"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Untuk keluar, geser layar ke bawah dari atas."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Mengerti"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Putar posisi layar untuk mendapatkan tampilan yang lebih baik"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Buka <xliff:g id="NAME">%s</xliff:g> dalam layar penuh untuk mendapatkan tampilan yang lebih baik"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index c8da948..9495626 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-númerið er of stutt. Það verður að vera a.m.k. 4 tölustafir."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Reyndu aftur síðar"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Notar allan skjáinn"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Strjúktu niður frá efri brún til að hætta."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Ég skil"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Snúðu til að sjá betur"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Opnaðu <xliff:g id="NAME">%s</xliff:g> á öllum skjánum til að fá betra yfirlit"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 403c522..3952837 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Il PIN è troppo corto. Deve avere almeno quattro cifre."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Riprova più tardi"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualizzazione a schermo intero"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Per uscire, scorri dall\'alto verso il basso."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Ruota per migliorare l\'anteprima"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Apri <xliff:g id="NAME">%s</xliff:g> a schermo intero per migliorare la visualizzazione"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 21e9293..9c143c7 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"קוד הגישה קצר מדי. חייב להיות באורך 4 ספרות לפחות."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"יש לנסות שוב מאוחר יותר"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"צפייה במסך מלא"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"כדי לצאת, פשוט מחליקים אצבע מלמעלה למטה."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"הבנתי"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"מסובבים כדי לראות טוב יותר"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"צריך לפתוח את <xliff:g id="NAME">%s</xliff:g> במסך מלא כדי לראות טוב יותר"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 149f3cd..934967f 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PINが短すぎます。4桁以上で設定してください。"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"しばらくしてから再試行"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"全画面表示"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"終了するには、上から下にスワイプします。"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"画面を回転させて見やすくしましょう"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"<xliff:g id="NAME">%s</xliff:g> を全画面表示で開いて見やすくしましょう"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index ee1e89d..013125e 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ძალიან მოკლეა. უნდა შედგებოდეს სულ ცოტა 4 ციფრისგან."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"სცადეთ მოგვიანებით"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"სრულ ეკრანზე ნახვა"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"გამოსვლისათვის, გაასრიალეთ ზემოდან ქვემოთ."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"გასაგებია"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"შეატრიალეთ უკეთესი ხედისთვის"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"გახსენით <xliff:g id="NAME">%s</xliff:g> სრულ ეკრანზე უკეთესი ხედისთვის"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 63457e0..791644d 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN тым қысқа. Кем дегенде 4 бірлік болуы тиіс."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Кейінірек қайта әрекеттеніңіз."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Толық экранда көру"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Шығу үшін жоғарыдан төмен қарай сырғытыңыз."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Түсінікті"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Жақсырақ көру үшін бұрыңыз."</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Жақсырақ көру үшін <xliff:g id="NAME">%s</xliff:g> қолданбасын толық экранда ашыңыз."</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 7294d4b..12e1a36 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"កូដ PIN ខ្លីពេក។ ត្រូវតែមានយ៉ាងហោចណាស់ ៤ តួ។"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"សូមព្យាយាមម្ដងទៀតនៅពេលក្រោយ។"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"កំពុងមើលពេញអេក្រង់"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"ដើម្បីចាកចេញ សូមអូសពីលើចុះក្រោម។"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"យល់ហើយ"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"បង្វិលដើម្បីមើលបានកាន់តែច្បាស់"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"បើក <xliff:g id="NAME">%s</xliff:g> នៅក្នុងអេក្រង់ពេញ ដើម្បីមើលបានកាន់តែច្បាស់"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 3d7c782..c134b74 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ಪಿನ್ ತುಂಬಾ ಚಿಕ್ಕದಾಗಿದೆ. ಕನಿಷ್ಠ ಪಕ್ಷ 4 ಅಂಕಿಗಳಾಗಿರಬೇಕು."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ಪೂರ್ಣ ಪರದೆಯನ್ನು ವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"ನಿರ್ಗಮಿಸಲು, ಮೇಲಿನಿಂದ ಕೆಳಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"ತಿಳಿಯಿತು"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"ಅತ್ಯುತ್ತಮ ವೀಕ್ಷಣೆಗಾಗಿ ತಿರುಗಿಸಿ"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"ಅತ್ಯುತ್ತಮ ವೀಕ್ಷಣೆಗಾಗಿ <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ತೆರೆಯಿರಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index d815fe8..62ec778 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN이 너무 짧습니다. 최소 4자 이상이어야 합니다."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"나중에 다시 시도"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"전체 화면 모드"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"종료하려면 위에서 아래로 스와이프합니다."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"확인"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"카메라 미리보기 화면이 잘 보이도록 회전하세요."</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"화면이 더 잘 보이도록 <xliff:g id="NAME">%s</xliff:g>을(를) 전체 화면에서 여세요."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 3cdf3ca..4df1e7e 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN өтө кыска. Аз дегенде 4 сандан турушу керек."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Бир аздан кийин кайталап көрүңүз"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Толук экран режими"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Чыгуу үчүн экранды ылдый сүрүп коюңуз."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Түшүндүм"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Жакшыраак көрүү үчүн буруңуз"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Жакшыраак көрүү үчүн <xliff:g id="NAME">%s</xliff:g> колдонмосун толук экранда ачыңыз"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 80e09a6..3b77acb 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ສັ້ນເກີນໄປ. ຕ້ອງມີຢ່າງໜ້ອຍ 4 ຫຼັກ."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ລອງໃໝ່ອີກຄັ້ງໃນພາຍຫລັງ."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ການເບິ່ງເຕັມໜ້າຈໍ"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"ຫາກຕ້ອງການອອກ, ໃຫ້ຮູດຈາກທາງເທິງລົງມາທາງລຸ່ມ."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"ເຂົ້າໃຈແລ້ວ"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"ໝຸນເພື່ອມຸມມອງທີ່ດີຂຶ້ນ"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"ເປີດ <xliff:g id="NAME">%s</xliff:g> ໃນໂໝດເຕັມຈໍເພື່ອມຸມມອງທີ່ດີຂຶ້ນ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index b237241..b864773 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1885,7 +1885,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN kodas per trumpas. Jis turi būti bent 4 skaitmenų."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Vėliau bandykite dar kartą"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Peržiūrima viso ekrano režimu"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Jei norite išeiti, perbraukite žemyn iš viršaus."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Supratau"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Pasukite, kad geriau matytumėte vaizdą"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Atidarykite „<xliff:g id="NAME">%s</xliff:g>“ viso ekrano režimu, kad geriau matytumėte vaizdą"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index cc902cd..9147e9b 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ir pārāk īss. Tam ir jābūt vismaz 4 ciparus garam."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Vēlāk mēģiniet vēlreiz."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Skatīšanās pilnekrāna režīmā"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Lai izietu, no augšdaļas velciet lejup."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Labi"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Lai uzlabotu skatu, pagrieziet ekrānu."</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Labākam skatam atveriet lietotni <xliff:g id="NAME">%s</xliff:g> pilnekrāna režīmā."</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index b61b817..f4ed853 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN кодот е премногу краток. Мора да има најмалку 4 цифри."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Обиди се повторно подоцна"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Се прикажува на цел екран"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"За да излезете, повлечете одозгора надолу."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Сфатив"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Ротирајте за подобар приказ"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"За подобар приказ, отворете ја апликацијата <xliff:g id="NAME">%s</xliff:g> на цел екран"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 9906470..ede15a1 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"പിൻ തീരെ ചെറുതാണ്. 4 അക്കമെങ്കിലും ഉണ്ടായിരിക്കണം."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"പിന്നീട് വീണ്ടും ശ്രമിക്കുക"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"പൂർണ്ണ സ്ക്രീനിൽ കാണുന്നു"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"അവസാനിപ്പിക്കാൻ, മുകളിൽ നിന്ന് താഴോട്ട് സ്വൈപ്പ് ചെയ്യുക."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"മനസ്സിലായി"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"മികച്ച കാഴ്ചയ്ക്കായി റൊട്ടേറ്റ് ചെയ്യുക"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"മികച്ച കാഴ്ചയ്ക്ക് പൂർണ്ണ സ്ക്രീനിൽ <xliff:g id="NAME">%s</xliff:g> തുറക്കുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 22f8f15..955b025 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ПИН хэт богино байна. Хамгийн багадаа 4 цифртэй байх ёстой."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Дараа дахин оролдоно уу"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Бүтэн дэлгэцээр үзэж байна"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Гарахаар бол дээрээс нь доош нь чирнэ үү."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Ойлголоо"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Харагдах байдлыг сайжруулах бол эргүүлнэ үү"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Харагдах байдлыг сайжруулах бол <xliff:g id="NAME">%s</xliff:g>-г бүтэн дэлгэцээр нээнэ үү"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 36d0bba..2df1bc9 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"पिन खूप लहान आहे. किमान 4 अंकांचा असणे आवश्यक आहे."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"नंतर पुन्हा प्रयत्न करा"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"पूर्ण स्क्रीनवर पाहत आहात"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"बाहेर पडण्यासाठी, वरून खाली स्वाइप करा."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"समजले"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"अधिक चांगल्या दृश्यासाठी फिरवा"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"अधिक चांगल्या दृश्यासाठी <xliff:g id="NAME">%s</xliff:g> हे फुल स्क्रीनमध्ये उघडा"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index c215f62..31180be 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN terlalu pendek. Mesti sekurang-kurangnya 4 angka."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Cuba sebentar lagi"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Melihat skrin penuh"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Untuk keluar, leret dari atas ke bawah."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Faham"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Putar untuk mendapatkan paparan yang lebih baik"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Buka <xliff:g id="NAME">%s</xliff:g> dalam skrin penuh untuk mendapatkan paparan yang lebih baik"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index f030ef2..f1ab9e0 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ပင် နံပါတ် တိုလွန်းသည်။. အနည်းဆုံး ဂဏန်း ၄ လုံး ဖြစ်ရမည်။"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"နောက်မှ ပြန်ကြိုးစားပါ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"မျက်နှာပြင်အပြည့် ကြည့်နေသည်"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"ထွက်ရန် အပေါ်မှ အောက်သို့ ဆွဲချပါ။"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"ရပါပြီ"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"ပိုကောင်းသောမြင်ကွင်းအတွက် လှည့်ပါ"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"ပိုကောင်းသောမြင်ကွင်းအတွက် ဖန်သားပြင်အပြည့်ဖြင့် <xliff:g id="NAME">%s</xliff:g> ကို ဖွင့်ပါ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 116c586..456366f 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-koden er for kort. Den må bestå av minst fire sifre."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Prøv på nytt senere"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visning i fullskjerm"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Sveip ned fra toppen for å avslutte."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Skjønner"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Roter for å få en bedre visning"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Åpne <xliff:g id="NAME">%s</xliff:g> i fullskjerm for å se bedre"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index a202d4c..55c2ef4 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN अति छोटो भयो। कम्तीमा ४ अङ्क हुन आवश्यक छ।"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"पछि पुनः प्रयास गर्नुहोस्"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"पूरा पर्दा हेर्दै"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"बाहिर निस्कन, माथिबाट तल स्वाइप गर्नुहोस्।"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"बुझेँ"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"अझ राम्रो दृश्य हेर्न चाहनुहुन्छ भने रोटेट गर्नुहोस्"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"अझ राम्रो दृश्य हेर्न चाहनुहुन्छ भने <xliff:g id="NAME">%s</xliff:g> खोल्नुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 51d8959..b1b3060 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Pincode is te kort. Moet ten minste vier cijfers lang zijn."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Probeer het later opnieuw"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Volledig scherm wordt getoond"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Swipe omlaag vanaf de bovenkant van het scherm om af te sluiten."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Ik snap het"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Draai voor een betere weergave"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Open <xliff:g id="NAME">%s</xliff:g> op volledig scherm voor een betere weergave"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 90ab620..b56c114 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ବହୁତ ଛୋଟ। ଅତି କମ୍ରେ 4 ସଂଖ୍ୟା ବିଶିଷ୍ଟ ହେବା ଦରକାର।"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ଦେଖାଯାଉଛି"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"ବାହାରିବା ପାଇଁ, ଉପରୁ ତଳକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ।"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"ବୁଝିଗଲି"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"ଏକ ଭଲ ଭ୍ୟୁ ପାଇଁ ରୋଟେଟ କରନ୍ତୁ"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"ଏକ ଭଲ ଭ୍ୟୁ ପାଇଁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନରେ <xliff:g id="NAME">%s</xliff:g> ଖୋଲନ୍ତୁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index de91ea7..72598d1 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ਪਿੰਨ ਬਹੁਤ ਜ਼ਿਆਦਾ ਛੋਟਾ ਹੈ। ਘੱਟੋ-ਘੱਟ 4 ਅੰਕ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ।"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦੇਖੋ"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"ਬਾਹਰ ਜਾਣ ਲਈ, ਉਪਰੋਂ ਹੇਠਾਂ ਸਵਾਈਪ ਕਰੋ।"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"ਸਮਝ ਲਿਆ"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"ਬਿਹਤਰ ਦ੍ਰਿਸ਼ ਅਨੁਭਵ ਲਈ ਘੁਮਾਓ"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"ਬਿਹਤਰ ਦ੍ਰਿਸ਼ ਅਨੁਭਵ ਲਈ <xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਪੂਰੀ-ਸਕ੍ਰੀਨ ਵਿੱਚ ਖੋਲ੍ਹੋ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index d9a95b8..f19b0d0 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1885,7 +1885,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN jest za krótki. Musi mieć co najmniej 4 cyfry."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Spróbuj ponownie później"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Włączony pełny ekran"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Aby wyjść, przesuń palcem z góry na dół."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Obróć, aby lepiej widzieć"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Otwórz aplikację <xliff:g id="NAME">%s</xliff:g> na pełnym ekranie, aby lepiej widzieć"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index cd3a7c5..bc6c99c 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"O PIN é curto demais. Deve ter pelo menos 4 dígitos."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Tente novamente mais tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualização em tela cheia"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Para sair, deslize de cima para baixo."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Entendi"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Gire a tela para ter uma visualização melhor"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Abra o app <xliff:g id="NAME">%s</xliff:g> em tela cheia para ter uma melhor visualização"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index d8fe4fe..5cf49fbd 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Tente mais tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualização de ecrã inteiro"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Para sair, deslize rapidamente para baixo a partir da parte superior."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rode para uma melhor visualização"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Abra <xliff:g id="NAME">%s</xliff:g> em ecrã inteiro para uma melhor visualização"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index cd3a7c5..bc6c99c 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"O PIN é curto demais. Deve ter pelo menos 4 dígitos."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Tente novamente mais tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualização em tela cheia"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Para sair, deslize de cima para baixo."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Entendi"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Gire a tela para ter uma visualização melhor"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Abra o app <xliff:g id="NAME">%s</xliff:g> em tela cheia para ter uma melhor visualização"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index d43556d..e4a6a07 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Codul PIN este prea scurt. Trebuie să aibă cel puțin 4 cifre."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Reîncearcă mai târziu"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Vizualizare pe ecran complet"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Pentru a ieși, glisează de sus în jos."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Am înțeles"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotește pentru o previzualizare mai bună"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Deschide <xliff:g id="NAME">%s</xliff:g> pe ecran complet pentru o imagine mai bună"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 16ddae8..0e98b3f 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1885,7 +1885,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-код должен содержать не менее 4 символов."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Повторите попытку позже."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Полноэкранный режим"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Чтобы выйти, проведите по экрану сверху вниз."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"ОК"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Поверните, чтобы лучше видеть."</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Откройте приложение \"<xliff:g id="NAME">%s</xliff:g>\" в полноэкранном режиме, чтобы лучше видеть."</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 4f6e756..03068fe 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN කුඩා වැඩිය. ඉලක්කම් 4 වත් විය යුතුය."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"පසුව නැවත උත්සාහ කරන්න"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"මුළු තිරය බලමින්"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"ඉවත් වීමට, ඉහළ සිට පහළට ස්වයිප් කරන්න"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"වැටහුණි"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"වඩා හොඳ දසුනක් සඳහා කරකවන්න"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"වඩා හොඳ දසුනක් සඳහා <xliff:g id="NAME">%s</xliff:g> පූර්ණ තිරයේ විවෘත කරන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index aeea7b6..694c55bb 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -159,7 +159,7 @@
<string name="scCellularNetworkSecuritySummary" msgid="7042036754550545005">"Šifrovanie, upozornenia na nešifrované siete"</string>
<string name="scIdentifierDisclosureIssueTitle" msgid="2898888825129970328">"Bol zaznamenaný prístup k identifikátoru zariadenia"</string>
<string name="scIdentifierDisclosureIssueSummaryNotification" msgid="3699930821270580416">"Sieť v okolí nahrala o <xliff:g id="DISCLOSURE_TIME">%1$s</xliff:g> jedinečný identifikátor vášho zariadenia (IMSI alebo IMEI), keď ste používali SIM siete <xliff:g id="DISCLOSURE_NETWORK">%2$s</xliff:g>"</string>
- <string name="scIdentifierDisclosureIssueSummary" msgid="7283387338827749276">"Sieť v okolí nahrala o <xliff:g id="DISCLOSURE_TIME">%1$s</xliff:g> jedinečný identifikátor vášho zariadenia (IMSI alebo IMEI), keď ste používali SIM siete <xliff:g id="DISCLOSURE_NETWORK">%2$s</xliff:g>.\n\nZnamená to, že vaša poloha, aktivita alebo totožnosť bola zaznamenaná. Ide o bežný postup, ale môže to byť problém pre ľudí, ktorí majú obavy o ochranu súkromia."</string>
+ <string name="scIdentifierDisclosureIssueSummary" msgid="7283387338827749276">"O <xliff:g id="DISCLOSURE_TIME">%1$s</xliff:g> zaznamenala sieť v okolí pri použití SIM karty <xliff:g id="DISCLOSURE_NETWORK">%2$s</xliff:g> jedinečný identifikátor vášho zariadenia (IMSI alebo IMEI).\n\nZnamená to, že bola zaznamenaná vaša poloha, aktivita alebo totožnosť. Ide o bežný postup, ale pre ľudí, ktorým záleží na ochrane súkromia, to môže byť problém."</string>
<string name="scNullCipherIssueEncryptedTitle" msgid="234717016411824969">"Pripojené k šifrovanej sieti <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
<string name="scNullCipherIssueEncryptedSummary" msgid="8577510708842150475">"Pripojenie SIM siete <xliff:g id="NETWORK_NAME">%1$s</xliff:g> je teraz zabezpečenejšie"</string>
<string name="scNullCipherIssueNonEncryptedTitle" msgid="3978071464929453915">"Pripojené k nešifrovanej sieti"</string>
@@ -1885,7 +1885,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Kód PIN je príliš krátky. Musí mať minimálne 4 číslice."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Skúste to neskôr"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Zobrazenie na celú obrazovku"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Ukončíte potiahnutím zhora nadol."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Dobre"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Otočte zariadenie pre lepšie zobrazenie"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Otvorte <xliff:g id="NAME">%s</xliff:g> na celej obrazovke pre lepšie zobrazenie"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index d3ce57c..edf80c5 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1885,7 +1885,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN je prekratek. Imeti mora vsaj 4 števke."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Poskusite znova pozneje"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Vklopljen je celozaslonski način"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Zaprete ga tako, da z vrha s prstom povlečete navzdol."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Razumem"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Zasukajte za boljši pregled."</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Aplikacijo <xliff:g id="NAME">%s</xliff:g> odprite v celozaslonskem načinu za boljši pregled."</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index de02100..88c4987 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-i është shumë i shkurtër. Duhet të jetë të paktën 4 shifra."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Provo sërish më vonë"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Po shikon ekranin e plotë"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Për të dalë, rrëshqit nga lart poshtë."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"E kuptova"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rrotullo për një pamje më të mirë"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Hape <xliff:g id="NAME">%s</xliff:g> në ekran të plotë për pamje më të mirë"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index f200ac1..f620246 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1884,7 +1884,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN је прекратак. Мора да има бар 4 цифре."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Пробајте поново касније"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Приказује се цео екран"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Да бисте изашли, превуците надоле одозго."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Важи"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Ротирајте ради бољег приказа"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Отворите апликацију <xliff:g id="NAME">%s</xliff:g> преко целог екрана да бисте боље видели"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 589414d..35c4c71 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Pinkoden är för kort. Måste vara minst fyra siffror."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Försök igen senare"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visar på fullskärm"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Svep nedåt från skärmens överkant för att avsluta."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Rotera för att få en bättre vy"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Öppna <xliff:g id="NAME">%s</xliff:g> i fullskärmsläget för att få en bättre vy"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 4b50cb7..dc19026 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ni fupi mno. Lazima iwe angalau tarakimu 4."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Jaribu tena baadaye"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Unatazama skrini nzima"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Ili kuondoka, telezesha kidole kutoka juu hadi chini."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Nimeelewa"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Zungusha ili upate mwonekano bora"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Fungua <xliff:g id="NAME">%s</xliff:g> kwenye skrini nzima ili uone maudhui kwa urahisi"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 6ad8f59..91ae904 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"பின் மிகவும் சிறியதாக உள்ளது. குறைந்தது 4 இலக்கங்கள் இருக்க வேண்டும்."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"மீண்டும் முயற்சிக்கவும்"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"முழுத் திரையில் காட்டுகிறது"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"வெளியேற, மேலிருந்து கீழே ஸ்வைப் செய்யவும்"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"புரிந்தது"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"சிறந்த காட்சிக்கு சுழற்றுங்கள்"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"சிறந்த காட்சிக்கு, <xliff:g id="NAME">%s</xliff:g> ஆப்ஸை முழுத்திரைப் பயன்முறையில் திறக்கவும்"</string>
@@ -2396,7 +2397,7 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"கீபோர்டு தளவமைப்பு <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… ஆகிய மொழிகளில் அமைக்கப்பட்டது, மாற்ற தட்டவும்."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"கீபோர்டுகள் உள்ளமைக்கப்பட்டன"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"கீபோர்டுகளைப் பார்க்க தட்டவும்"</string>
- <string name="profile_label_private" msgid="6463418670715290696">"தனிப்பட்டது"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"இரகசியமானவை"</string>
<string name="profile_label_clone" msgid="769106052210954285">"குளோன்"</string>
<string name="profile_label_work" msgid="3495359133038584618">"பணி"</string>
<string name="profile_label_work_2" msgid="4691533661598632135">"பணி 2"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 91f9ef2..759c6e6 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"పిన్ చాలా చిన్నదిగా ఉంది. తప్పనిసరిగా కనీసం 4 అంకెలు ఉండాలి."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"తర్వాత మళ్లీ ట్రై చేయండి"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ఫుల్-స్క్రీన్లో వీక్షిస్తున్నారు"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"నిష్క్రమించడానికి, పై నుండి క్రిందికి స్వైప్ చేయండి."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"అర్థమైంది"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"మెరుగైన వీక్షణ కోసం తిప్పండి"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"మెరుగైన వీక్షణ కోసం <xliff:g id="NAME">%s</xliff:g>ను ఫుల్ స్క్రీన్లో తెరవండి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index eb102fc..282f66e 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN สั้นเกินไป ต้องมีอย่างน้อย 4 หลัก"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ลองอีกครั้งในภายหลัง"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"กำลังดูแบบเต็มหน้าจอ"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"หากต้องการออก ให้เลื่อนลงจากด้านบน"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"รับทราบ"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"หมุนเพื่อรับมุมมองที่ดียิ่งขึ้น"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"เปิด <xliff:g id="NAME">%s</xliff:g> ในโหมดเต็มหน้าจอเพื่อรับมุมมองที่ดียิ่งขึ้น"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index de499d34..31b81aa 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Masyadong maikli ang PIN. Hindi dapat mas maikli sa 4 na digit."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Subukang muli sa ibang pagkakataon"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Panonood sa full screen"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Upang lumabas, mag-swipe mula sa itaas pababa."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Nakuha ko"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"I-rotate para sa mas magandang view"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Buksan ang <xliff:g id="NAME">%s</xliff:g> sa full screen para sa mas magandang view"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 7dab236..13f7c2f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN çok kısa. En az 4 basamaklı olmalı."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Daha sonra tekrar deneyin"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Tam ekran olarak görüntüleme"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Çıkmak için yukarıdan aşağıya doğru hızlıca kaydırın."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Anladım"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Daha iyi bir görünüm elde etmek için ekranı döndürün"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Daha iyi görünüm için <xliff:g id="NAME">%s</xliff:g> uygulamasını açın"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 22c7272..b8764e7 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1885,7 +1885,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-код закороткий. Має бути принаймні 4 цифри."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Спробуйте пізніше"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Перегляд на весь екран"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Щоб вийти, проведіть пальцем зверху вниз."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Оберніть для кращого огляду"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Для кращого огляду відкрийте додаток <xliff:g id="NAME">%s</xliff:g> на весь екран"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 0d878c9..1ae5e20 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN کافی چھوٹا ہے۔ کم از کم 4 ہندسے ہونا ضروری ہے۔"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"بعد میں دوبارہ کوشش کریں"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"پوری اسکرین میں دیکھ رہے ہیں"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"خارج ہونے کیلئے اوپر سے نیچے سوائپ کریں۔"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"سمجھ آ گئی"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"بہتر منظر کے لیے گھمائیں"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"بہتر منظر کے لیے <xliff:g id="NAME">%s</xliff:g> کو فُل اسکرین میں کھولیں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index fc5d8ee..8d6e169 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN kod juda qisqa, kamida 4 ta raqam kiriting."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Keyinroq urinib ko‘ring"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Butun ekranli rejim"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Chiqish uchun tepadan pastga torting."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Yaxshiroq koʻrish uchun kamerani buring"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Yaxshiroq koʻrish uchun butun ekranda <xliff:g id="NAME">%s</xliff:g> ilovasini oching"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 4619be3..857a095 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Mã PIN quá ngắn. Phải có ít nhất 4 chữ số."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Hãy thử lại sau"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Xem toàn màn hình"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Để thoát, hãy vuốt từ trên cùng xuống dưới."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"OK"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Xoay để xem dễ hơn"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Mở <xliff:g id="NAME">%s</xliff:g> ở chế độ toàn màn hình để xem dễ hơn"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index a6c62dc..6cd89cf 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN码太短,至少应包含4位数字。"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"稍后重试"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"目前处于全屏模式"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"要退出,请从顶部向下滑动。"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"知道了"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"旋转可改善预览效果"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"在全屏模式下打开“<xliff:g id="NAME">%s</xliff:g>”可改善预览效果"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index f9b10a2..5224753 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN 碼太短,至少必須為 4 位數。"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"稍後再試"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"開啟全螢幕"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"由頂部向下滑動即可退出。"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"知道了"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"旋轉以改善預覽效果"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"以全螢幕模式開啟「<xliff:g id="NAME">%s</xliff:g>」,以改善預覽效果"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 4dce59a..fe66eb9 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN 長度太短,至少必須為 4 位數。"</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"稍後再試"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"以全螢幕檢視"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"如要退出,請從畫面頂端向下滑動。"</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"知道了"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"旋轉螢幕以瀏覽完整的檢視畫面"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"如要享有更優質的預覽體驗,可透過全螢幕模式開啟「<xliff:g id="NAME">%s</xliff:g>」"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 60cb31b..8285d3e 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1883,7 +1883,8 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"I-PIN yimfushane kakhulu. Okungenani kumele ibe namadijithi angu-4."</string>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Zama futhi emva kwesikhathi"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Ukubuka isikrini esigcwele"</string>
- <string name="immersive_cling_description" msgid="7092737175345204832">"Ukuze uphume, swayiphela phansi kusuka phezulu."</string>
+ <!-- no translation found for immersive_cling_description (2896205051090870978) -->
+ <skip />
<string name="immersive_cling_positive" msgid="7047498036346489883">"Ngiyitholile"</string>
<string name="display_rotation_camera_compat_toast_after_rotation" msgid="7600891546249829854">"Zungezisa ukuze uthole ukubuka okungcono"</string>
<string name="display_rotation_camera_compat_toast_in_multi_window" msgid="2473122980393502775">"Vula i-<xliff:g id="NAME">%s</xliff:g> kusikrini esigcwele ngokubuka okungcono"</string>
diff --git a/core/res/res/values/config_telephony.xml b/core/res/res/values/config_telephony.xml
index fba95a5..e983427 100644
--- a/core/res/res/values/config_telephony.xml
+++ b/core/res/res/values/config_telephony.xml
@@ -312,6 +312,15 @@
<integer name="config_oem_enabled_satellite_location_fresh_duration">300</integer>
<java-symbol type="integer" name="config_oem_enabled_satellite_location_fresh_duration" />
+ <!-- The time duration in seconds which is used to decide whether satellite is in emergency
+ mode.
+
+ If the duration from the last time when an emergency call is made to the current time is
+ less than or equal to this duration, satellite is considered as in emergency mode.
+ -->
+ <integer name="config_satellite_emergency_mode_duration">300</integer>
+ <java-symbol type="integer" name="config_satellite_emergency_mode_duration" />
+
<!-- Whether enhanced IWLAN handover check is enabled. If enabled, telephony frameworks
will not perform handover if the target transport is out of service, or VoPS not
supported. The network will be torn down on the source transport, and will be
diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/IRadioServiceHidlImplTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/IRadioServiceHidlImplTest.java
index 20bc8d4..5117d10 100644
--- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/IRadioServiceHidlImplTest.java
+++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/IRadioServiceHidlImplTest.java
@@ -24,6 +24,8 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -33,6 +35,7 @@
import android.hardware.radio.ITuner;
import android.hardware.radio.ITunerCallback;
import android.hardware.radio.RadioManager;
+import android.os.IBinder;
import org.junit.Before;
import org.junit.Test;
@@ -132,6 +135,7 @@
@Test
public void addAnnouncementListener_forHidlImpl() {
when(mHal2Mock.hasAnyModules()).thenReturn(true);
+
ICloseHandle closeHandle = mHidlImpl.addAnnouncementListener(ENABLE_TYPES, mListenerMock);
verify(mHal2Mock).addAnnouncementListener(ENABLE_TYPES, mListenerMock);
@@ -139,4 +143,15 @@
.that(closeHandle).isEqualTo(mICloseHandle);
}
+ @Test
+ public void addAnnouncementListener_withoutAnyModules() throws Exception {
+ when(mHal2Mock.hasAnyModules()).thenReturn(false);
+ IBinder binderMock = mock(IBinder.class);
+ when(mListenerMock.asBinder()).thenReturn(binderMock);
+
+ mHidlImpl.addAnnouncementListener(ENABLE_TYPES, mListenerMock);
+
+ verify(mHal2Mock, never()).addAnnouncementListener(ENABLE_TYPES, mListenerMock);
+ verify(binderMock).linkToDeath(any(), anyInt());
+ }
}
diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java
index 4f469bb..f3d4ccf 100644
--- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java
+++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java
@@ -112,13 +112,21 @@
android.hardware.broadcastradio.ProgramSelector hwSel,
ProgramIdentifier logicallyTunedTo, ProgramIdentifier physicallyTunedTo,
int hwSignalQuality) {
+ return makeHalProgramInfo(hwSel, logicallyTunedTo, physicallyTunedTo, hwSignalQuality,
+ new ProgramIdentifier[]{}, new Metadata[]{});
+ }
+
+ static ProgramInfo makeHalProgramInfo(
+ android.hardware.broadcastradio.ProgramSelector hwSel,
+ ProgramIdentifier logicallyTunedTo, ProgramIdentifier physicallyTunedTo,
+ int hwSignalQuality, ProgramIdentifier[] relatedContent, Metadata[] metadata) {
ProgramInfo hwInfo = new ProgramInfo();
hwInfo.selector = hwSel;
hwInfo.logicallyTunedTo = logicallyTunedTo;
hwInfo.physicallyTunedTo = physicallyTunedTo;
hwInfo.signalQuality = hwSignalQuality;
- hwInfo.relatedContent = new ProgramIdentifier[]{};
- hwInfo.metadata = new Metadata[]{};
+ hwInfo.relatedContent = relatedContent;
+ hwInfo.metadata = metadata;
return hwInfo;
}
diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java
index 42501c1..86a6744 100644
--- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java
+++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java
@@ -42,6 +42,7 @@
import android.hardware.radio.UniqueProgramIdentifier;
import android.os.ServiceSpecificException;
import android.platform.test.flag.junit.SetFlagsRule;
+import android.util.ArrayMap;
import android.util.ArraySet;
import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
@@ -54,6 +55,7 @@
import org.junit.Test;
import org.mockito.stubbing.Answer;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -86,6 +88,7 @@
private static final int TEST_SIGNAL_QUALITY = 1;
private static final long TEST_DAB_DMB_SID_EXT_VALUE = 0xA000000111L;
+ private static final long TEST_DAB_SID_EXT_LEGACY_VALUE = 0xA00111L;
private static final long TEST_DAB_ENSEMBLE_VALUE = 0x1001;
private static final long TEST_DAB_FREQUENCY_VALUE = 220_352;
private static final long TEST_FM_FREQUENCY_VALUE = 92_100;
@@ -103,6 +106,9 @@
private static final ProgramSelector.Identifier TEST_DAB_SID_EXT_ID =
new ProgramSelector.Identifier(
ProgramSelector.IDENTIFIER_TYPE_DAB_DMB_SID_EXT, TEST_DAB_DMB_SID_EXT_VALUE);
+ private static final ProgramSelector.Identifier TEST_DAB_SID_EXT_LEGACY_ID =
+ new ProgramSelector.Identifier(
+ ProgramSelector.IDENTIFIER_TYPE_DAB_SID_EXT, TEST_DAB_SID_EXT_LEGACY_VALUE);
private static final ProgramSelector.Identifier TEST_DAB_ENSEMBLE_ID =
new ProgramSelector.Identifier(
ProgramSelector.IDENTIFIER_TYPE_DAB_ENSEMBLE, TEST_DAB_ENSEMBLE_VALUE);
@@ -125,6 +131,10 @@
ProgramSelector.PROGRAM_TYPE_DAB, TEST_DAB_SID_EXT_ID,
new ProgramSelector.Identifier[]{TEST_DAB_FREQUENCY_ID, TEST_DAB_ENSEMBLE_ID},
/* vendorIds= */ null);
+ private static final ProgramSelector TEST_DAB_SELECTOR_LEGACY = new ProgramSelector(
+ ProgramSelector.PROGRAM_TYPE_DAB, TEST_DAB_SID_EXT_LEGACY_ID,
+ new ProgramSelector.Identifier[]{TEST_DAB_FREQUENCY_ID, TEST_DAB_ENSEMBLE_ID},
+ /* vendorIds= */ null);
private static final ProgramSelector TEST_FM_SELECTOR =
AidlTestUtils.makeFmSelector(TEST_FM_FREQUENCY_VALUE);
@@ -132,6 +142,9 @@
new ProgramSelector.Identifier(ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT,
TEST_HD_STATION_ID_EXT_VALUE);
+ private static final ProgramIdentifier TEST_HAL_HD_STATION_EXT_ID =
+ AidlTestUtils.makeHalIdentifier(IdentifierType.HD_STATION_ID_EXT,
+ TEST_HD_STATION_ID_EXT_VALUE);
private static final ProgramIdentifier TEST_HAL_HD_STATION_LOCATION_ID =
AidlTestUtils.makeHalIdentifier(IdentifierType.HD_STATION_LOCATION,
TEST_HD_LOCATION_VALUE);
@@ -221,6 +234,27 @@
}
@Test
+ public void throwOnError_withInvalidArgumentException() {
+ ServiceSpecificException halException = new ServiceSpecificException(
+ Result.INVALID_ARGUMENTS);
+
+ RuntimeException thrown = ConversionUtils.throwOnError(halException, "tune");
+
+ expect.withMessage("Exception thrown for invalid argument error")
+ .that(thrown).hasMessageThat().contains("tune: INVALID_ARGUMENTS");
+ }
+
+ @Test
+ public void throwOnError_withTimeoutException() {
+ ServiceSpecificException halException = new ServiceSpecificException(Result.TIMEOUT);
+
+ RuntimeException thrown = ConversionUtils.throwOnError(halException, "seek");
+
+ expect.withMessage("Exception thrown for timeout error")
+ .that(thrown).hasMessageThat().contains("seek: TIMEOUT");
+ }
+
+ @Test
public void propertiesFromHalProperties_idsMatch() {
expect.withMessage("Properties id")
.that(MODULE_PROPERTIES.getId()).isEqualTo(TEST_ID);
@@ -300,7 +334,7 @@
@Test
public void propertiesFromHalProperties_withoutAmFmAndDabConfigs() {
RadioManager.ModuleProperties properties = createModuleProperties(/* amFmConfig= */ null,
- new DabTableEntry[]{});
+ /* dabTableEntries= */ null);
expect.withMessage("Empty AM/FM config")
.that(properties.getBands()).asList().isEmpty();
@@ -499,6 +533,22 @@
}
@Test
+ public void programInfoFromHalProgramInfo_withRelatedContent() {
+ android.hardware.broadcastradio.ProgramSelector halDabSelector =
+ AidlTestUtils.makeHalSelector(TEST_HAL_DAB_SID_EXT_ID, new ProgramIdentifier[]{
+ TEST_HAL_DAB_ENSEMBLE_ID, TEST_HAL_DAB_FREQUENCY_ID});
+ ProgramInfo halProgramInfo = AidlTestUtils.makeHalProgramInfo(halDabSelector,
+ TEST_HAL_DAB_SID_EXT_ID, TEST_HAL_DAB_FREQUENCY_ID, TEST_SIGNAL_QUALITY,
+ new ProgramIdentifier[]{TEST_HAL_HD_STATION_EXT_ID}, new Metadata[]{});
+
+ RadioManager.ProgramInfo programInfo =
+ ConversionUtils.programInfoFromHalProgramInfo(halProgramInfo);
+
+ expect.withMessage("Related content of converted program info")
+ .that(programInfo.getRelatedContent()).containsExactly(TEST_HD_STATION_EXT_ID);
+ }
+
+ @Test
public void programInfoFromHalProgramInfo_withInvalidDabProgramInfo() {
android.hardware.broadcastradio.ProgramSelector invalidHalDabSelector =
AidlTestUtils.makeHalSelector(TEST_HAL_DAB_SID_EXT_ID,
@@ -558,6 +608,29 @@
}
@Test
+ public void programInfoMeetsSdkVersionRequirement_withLowerVersionIdForLogicallyTunedTo() {
+ RadioManager.ProgramInfo dabProgramInfo = AidlTestUtils.makeProgramInfo(
+ TEST_DAB_SELECTOR_LEGACY, TEST_DAB_SID_EXT_ID, TEST_DAB_FREQUENCY_ID,
+ TEST_SIGNAL_QUALITY);
+
+ expect.withMessage("Program info %s with logically tuned to ID not of required SDK version",
+ dabProgramInfo).that(ConversionUtils.programInfoMeetsSdkVersionRequirement(
+ dabProgramInfo, T_APP_UID)).isFalse();
+ }
+
+ @Test
+ public void programInfoMeetsSdkVersionRequirement_withLowerVersionIdForRelatedContent() {
+ RadioManager.ProgramInfo dabProgramInfo = new RadioManager.ProgramInfo(
+ TEST_DAB_SELECTOR_LEGACY, TEST_DAB_SID_EXT_ID, TEST_DAB_FREQUENCY_ID,
+ List.of(TEST_DAB_SID_EXT_ID), /* infoFlags= */ 0, TEST_SIGNAL_QUALITY,
+ new RadioMetadata.Builder().build(), new ArrayMap<>());
+
+ expect.withMessage("Program info %s with related content not of required SDK version",
+ dabProgramInfo).that(ConversionUtils.programInfoMeetsSdkVersionRequirement(
+ dabProgramInfo, T_APP_UID)).isFalse();
+ }
+
+ @Test
public void programInfoMeetsSdkVersionRequirement_withRequiredVersionId_returnsTrue() {
RadioManager.ProgramInfo fmProgramInfo = AidlTestUtils.makeProgramInfo(TEST_FM_SELECTOR,
TEST_SIGNAL_QUALITY);
@@ -675,20 +748,122 @@
}
@Test
- public void radioMetadataFromHalMetadata_withFlagEnabled() {
- mSetFlagsRule.enableFlags(Flags.FLAG_HD_RADIO_IMPROVED);
-
+ public void radioMetadataFromHalMetadata() {
+ int rdsPtyValue = 3;
+ int rbdsPtyValue = 4;
+ String rdsRtValue = "rdsRtTest";
+ String songAlbumValue = "songAlbumTest";
+ String programNameValue = "programNameTest";
RadioMetadata convertedMetadata = ConversionUtils.radioMetadataFromHalMetadata(
- new Metadata[]{TEST_HAL_SONG_TITLE, TEST_HAL_HD_SUBCHANNELS, TEST_HAL_ALBUM_ART});
+ new Metadata[]{TEST_HAL_SONG_TITLE, TEST_HAL_ALBUM_ART,
+ Metadata.rdsPty(rdsPtyValue), Metadata.rbdsPty(rbdsPtyValue),
+ Metadata.rdsRt(rdsRtValue), Metadata.songAlbum(songAlbumValue),
+ Metadata.programName(programNameValue)});
- expect.withMessage("Metadata with flag enabled").that(convertedMetadata.size())
- .isEqualTo(3);
expect.withMessage("Song title with flag enabled")
.that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_TITLE))
.isEqualTo(TEST_SONG_TITLE);
expect.withMessage("Album art with flag enabled")
.that(convertedMetadata.getInt(RadioMetadata.METADATA_KEY_ART))
.isEqualTo(TEST_ALBUM_ART);
+ expect.withMessage("RDS PTY with flag enabled")
+ .that(convertedMetadata.getInt(RadioMetadata.METADATA_KEY_RDS_PTY))
+ .isEqualTo(rdsPtyValue);
+ expect.withMessage("RBDS PTY with flag enabled")
+ .that(convertedMetadata.getInt(RadioMetadata.METADATA_KEY_RBDS_PTY))
+ .isEqualTo(rbdsPtyValue);
+ expect.withMessage("RDS RT with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_RDS_RT))
+ .isEqualTo(rdsRtValue);
+ expect.withMessage("Album with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_ALBUM))
+ .isEqualTo(songAlbumValue);
+ expect.withMessage("Program name with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_PROGRAM_NAME))
+ .isEqualTo(programNameValue);
+ }
+
+ @Test
+ public void radioMetadataFromHalMetadata_withDabMetadata() {
+ String dabEnsembleNameValue = "dabEnsembleNameTest";
+ String dabEnsembleNameShortValue = "dabEnsembleNameShortTest";
+ String dabServiceNameValue = "dabServiceNameTest";
+ String dabServiceNameShortValue = "dabServiceNameShortTest";
+ String dabComponentNameValue = "dabComponentNameTest";
+ String dabComponentNameShortValue = "dabComponentNameShortTest";
+ RadioMetadata convertedMetadata = ConversionUtils.radioMetadataFromHalMetadata(
+ new Metadata[]{Metadata.dabEnsembleName(dabEnsembleNameValue),
+ Metadata.dabEnsembleNameShort(dabEnsembleNameShortValue),
+ Metadata.dabServiceName(dabServiceNameValue),
+ Metadata.dabServiceNameShort(dabServiceNameShortValue),
+ Metadata.dabComponentName(dabComponentNameValue),
+ Metadata.dabComponentNameShort(dabComponentNameShortValue)});
+
+ expect.withMessage("DAB Ensemble name with flag enabled")
+ .that(convertedMetadata.getString(
+ RadioMetadata.METADATA_KEY_DAB_ENSEMBLE_NAME))
+ .isEqualTo(dabEnsembleNameValue);
+ expect.withMessage("DAB Ensemble short name with flag enabled")
+ .that(convertedMetadata.getString(
+ RadioMetadata.METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT))
+ .isEqualTo(dabEnsembleNameShortValue);
+ expect.withMessage("DAB service service name with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_DAB_SERVICE_NAME))
+ .isEqualTo(dabServiceNameValue);
+ expect.withMessage("DAB service service short name with flag enabled")
+ .that(convertedMetadata.getString(
+ RadioMetadata.METADATA_KEY_DAB_SERVICE_NAME_SHORT))
+ .isEqualTo(dabServiceNameShortValue);
+ expect.withMessage("DAB component name with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_DAB_COMPONENT_NAME))
+ .isEqualTo(dabComponentNameValue);
+ expect.withMessage("DAB component short name with flag enabled")
+ .that(convertedMetadata.getString(
+ RadioMetadata.METADATA_KEY_DAB_COMPONENT_NAME_SHORT))
+ .isEqualTo(dabComponentNameShortValue);
+ }
+
+ @Test
+ public void radioMetadataFromHalMetadata_withHdMedatadataAndFlagEnabled() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_HD_RADIO_IMPROVED);
+ String genreValue = "genreTest";
+ String commentShortDescriptionValue = "commentShortDescriptionTest";
+ String commentActualTextValue = "commentActualTextTest";
+ String commercialValue = "commercialTest";
+ List<String> ufidsValue = List.of("ufids1Test", "ufids2Test");
+ String hdStationNameShortValue = "hdStationNameShortTest";
+ String hdStationNameLongValue = "hdStationNameLongTest";
+ RadioMetadata convertedMetadata = ConversionUtils.radioMetadataFromHalMetadata(
+ new Metadata[]{TEST_HAL_HD_SUBCHANNELS, Metadata.genre(genreValue),
+ Metadata.commentShortDescription(commentShortDescriptionValue),
+ Metadata.commentActualText(commentActualTextValue),
+ Metadata.commercial(commercialValue),
+ Metadata.ufids(ufidsValue.toArray(new String[0])),
+ Metadata.hdStationNameShort(hdStationNameShortValue),
+ Metadata.hdStationNameLong(hdStationNameLongValue)});
+
+ expect.withMessage("Genre with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_GENRE))
+ .isEqualTo(genreValue);
+ expect.withMessage("Short description of comment with flag enabled")
+ .that(convertedMetadata.getString(
+ RadioMetadata.METADATA_KEY_COMMENT_SHORT_DESCRIPTION))
+ .isEqualTo(commentShortDescriptionValue);
+ expect.withMessage("Actual text of comment with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_COMMENT_ACTUAL_TEXT))
+ .isEqualTo(commentActualTextValue);
+ expect.withMessage("Commercial with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_COMMERCIAL))
+ .isEqualTo(commercialValue);
+ expect.withMessage("UFIDs with flag enabled")
+ .that(convertedMetadata.getStringArray(RadioMetadata.METADATA_KEY_UFIDS)).asList()
+ .containsExactlyElementsIn(ufidsValue);
+ expect.withMessage("HD station short name with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_HD_STATION_NAME_SHORT))
+ .isEqualTo(hdStationNameShortValue);
+ expect.withMessage("HD station long name with flag enabled")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_HD_STATION_NAME_LONG))
+ .isEqualTo(hdStationNameLongValue);
expect.withMessage("HD sub-channels with flag enabled")
.that(convertedMetadata.getInt(RadioMetadata
.METADATA_KEY_HD_SUBCHANNELS_AVAILABLE)).isEqualTo(TEST_HD_SUBCHANNELS);
@@ -742,6 +917,35 @@
ConversionUtils.identifierToHalProgramIdentifier(TEST_DAB_SID_EXT_ID));
}
+ @Test
+ public void vendorInfoToHalVendorKeyValues_withNull() {
+ expect.withMessage("Null vendor info converted to HAL")
+ .that(ConversionUtils.vendorInfoToHalVendorKeyValues(/* info= */ null)).asList()
+ .isEmpty();
+ }
+
+ @Test
+ public void vendorInfoToHalVendorKeyValues_withNullValue() {
+ Map<String, String> vendorInfo = new ArrayMap<>();
+ vendorInfo.put(VENDOR_INFO_KEY_1, null);
+
+ expect.withMessage("Vendor info with null value converted to HAL")
+ .that(ConversionUtils.vendorInfoToHalVendorKeyValues(vendorInfo)).asList()
+ .isEmpty();
+ }
+
+ @Test
+ public void vendorInfoFromHalVendorKeyValues_withNullElements() {
+ VendorKeyValue halVendorInfo = new VendorKeyValue();
+ halVendorInfo.key = null;
+ halVendorInfo.value = VENDOR_INFO_VALUE_1;
+ VendorKeyValue[] halVendorInfoArray = new VendorKeyValue[]{halVendorInfo};
+
+ expect.withMessage("Null vendor info converted from HAL")
+ .that(ConversionUtils.vendorInfoFromHalVendorKeyValues(halVendorInfoArray))
+ .isEmpty();
+ }
+
private static RadioManager.ModuleProperties createModuleProperties() {
AmFmRegionConfig amFmConfig = createAmFmRegionConfig();
DabTableEntry[] dabTableEntries = new DabTableEntry[]{
@@ -785,7 +989,8 @@
private static Properties createHalProperties() {
Properties halProperties = new Properties();
halProperties.supportedIdentifierTypes = new int[]{IdentifierType.AMFM_FREQUENCY_KHZ,
- IdentifierType.RDS_PI, IdentifierType.DAB_SID_EXT};
+ IdentifierType.RDS_PI, IdentifierType.DAB_SID_EXT, IdentifierType.HD_STATION_ID_EXT,
+ IdentifierType.DRMO_SERVICE_ID};
halProperties.maker = TEST_MAKER;
halProperties.product = TEST_PRODUCT;
halProperties.version = TEST_VERSION;
diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java
index 4ded91d..e963caf 100644
--- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java
+++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java
@@ -50,6 +50,7 @@
import android.hardware.radio.RadioTuner;
import android.hardware.radio.UniqueProgramIdentifier;
import android.os.Binder;
+import android.os.DeadObjectException;
import android.os.ParcelableException;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
@@ -308,6 +309,20 @@
}
@Test
+ public void close_forMultipleTimes() throws Exception {
+ openAidlClients(/* numClients= */ 1);
+ int errorCode = RadioTuner.ERROR_SERVER_DIED;
+ mTunerSessions[0].close(errorCode);
+ verify(mAidlTunerCallbackMocks[0], CALLBACK_TIMEOUT).onError(errorCode);
+
+ mTunerSessions[0].close(errorCode);
+
+ verify(mAidlTunerCallbackMocks[0], CALLBACK_TIMEOUT).onError(errorCode);
+ expect.withMessage("Close state of broadcast radio service session for multiple times")
+ .that(mTunerSessions[0].isClosed()).isTrue();
+ }
+
+ @Test
public void closeSessions_withMultipleSessions_withError() throws Exception {
int numSessions = 3;
openAidlClients(numSessions);
@@ -366,6 +381,18 @@
}
@Test
+ public void tune_withDeadTunerCallback_removesDeadSession() throws Exception {
+ openAidlClients(/* numClients= */ 1);
+ ProgramSelector sel = AidlTestUtils.makeFmSelector(AM_FM_FREQUENCY_LIST[1]);
+ doThrow(new DeadObjectException()).when(mAidlTunerCallbackMocks[0])
+ .onCurrentProgramInfoChanged(any());
+
+ mTunerSessions[0].tune(sel);
+
+ verify(mBroadcastRadioMock, CALLBACK_TIMEOUT).unsetTunerCallback();
+ }
+
+ @Test
public void tune_withUnsupportedSelector_throwsException() throws Exception {
openAidlClients(/* numClients= */ 1);
diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/ConvertTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/ConvertTest.java
index 4cb012c..98641ef 100644
--- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/ConvertTest.java
+++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/ConvertTest.java
@@ -16,14 +16,23 @@
package com.android.server.broadcastradio.hal2;
+import static org.junit.Assert.assertThrows;
+
import android.hardware.broadcastradio.V2_0.AmFmBandRange;
import android.hardware.broadcastradio.V2_0.AmFmRegionConfig;
import android.hardware.broadcastradio.V2_0.DabTableEntry;
import android.hardware.broadcastradio.V2_0.IdentifierType;
+import android.hardware.broadcastradio.V2_0.Metadata;
+import android.hardware.broadcastradio.V2_0.MetadataKey;
+import android.hardware.broadcastradio.V2_0.ProgramInfo;
import android.hardware.broadcastradio.V2_0.Properties;
+import android.hardware.broadcastradio.V2_0.Result;
+import android.hardware.broadcastradio.V2_0.VendorKeyValue;
import android.hardware.radio.Announcement;
import android.hardware.radio.ProgramSelector;
import android.hardware.radio.RadioManager;
+import android.hardware.radio.RadioMetadata;
+import android.util.ArrayMap;
import com.google.common.truth.Expect;
@@ -71,6 +80,15 @@
public final Expect expect = Expect.create();
@Test
+ public void throwOnError() {
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ Convert.throwOnError("tune", Result.INVALID_ARGUMENTS));
+
+ expect.withMessage("Exception for illegeal argument").that(thrown)
+ .hasMessageThat().contains("INVALID_ARGUMENTS");
+ }
+
+ @Test
public void propertiesFromHalProperties_idsMatch() {
expect.withMessage("Properties id")
.that(MODULE_PROPERTIES.getId()).isEqualTo(TEST_ID);
@@ -198,6 +216,60 @@
.that(Utils.getBand(/* freq= */ 110000)).isEqualTo(FrequencyBand.UNKNOWN);
}
+ @Test
+ public void vendorInfoToHal_withNull() {
+ expect.withMessage("Null vendor info converted to HAL")
+ .that(Convert.vendorInfoToHal(/* info= */ null)).isEmpty();
+ }
+
+ @Test
+ public void vendorInfoToHal_withNullValue() {
+ Map<String, String> vendorInfo = new ArrayMap<>();
+ vendorInfo.put(VENDOR_INFO_KEY_1, null);
+
+ expect.withMessage("Vendor info with null value converted to HAL")
+ .that(Convert.vendorInfoToHal(vendorInfo)).isEmpty();
+ }
+
+ @Test
+ public void vendorInfoFromHalVendorKeyValues_withNullElements() {
+ VendorKeyValue halVendorInfo = new VendorKeyValue();
+ halVendorInfo.key = null;
+ halVendorInfo.value = "VendorValue";
+ List<VendorKeyValue> halVendorInfoArray = List.of(halVendorInfo);
+
+ expect.withMessage("Null vendor info converted from HAL")
+ .that(Convert.vendorInfoFromHal(halVendorInfoArray)).isEmpty();
+ }
+
+ @Test
+ public void programInfoFromHal_withMetadata() {
+ int freq = 97900;
+ int signalQuality = 90;
+ String songTitle = "titleTest";
+ int albumArt = 1;
+ android.hardware.broadcastradio.V2_0.ProgramSelector halSelector =
+ TestUtils.makeHalFmSelector(freq);
+ ArrayList<Metadata> metadata = new ArrayList<>(List.of(
+ createIntMetadata(MetadataKey.ALBUM_ART, albumArt),
+ createStringMetadata(MetadataKey.SONG_TITLE, songTitle),
+ createStringMetadata(/* key= */ 1000, "valueForInvalidMetadataType")));
+ ProgramInfo halInfo = TestUtils.makeHalProgramInfo(halSelector, signalQuality,
+ /* relatedContent= */ new ArrayList<>(), metadata);
+
+ RadioManager.ProgramInfo info = Convert.programInfoFromHal(halInfo);
+
+ RadioMetadata convertedMetadata = info.getMetadata();
+ expect.withMessage("Metadata converted from HAL")
+ .that(convertedMetadata.size()).isEqualTo(2);
+ expect.withMessage("Song title")
+ .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_TITLE))
+ .isEqualTo(songTitle);
+ expect.withMessage("Album art")
+ .that(convertedMetadata.getInt(RadioMetadata.METADATA_KEY_ART))
+ .isEqualTo(albumArt);
+ }
+
private static RadioManager.ModuleProperties convertToModuleProperties() {
AmFmRegionConfig amFmConfig = createAmFmRegionConfig();
List<DabTableEntry> dabTableEntries = Arrays.asList(
@@ -241,7 +313,8 @@
private static Properties createHalProperties() {
Properties halProperties = new Properties();
halProperties.supportedIdentifierTypes = new ArrayList<Integer>(Arrays.asList(
- IdentifierType.AMFM_FREQUENCY, IdentifierType.RDS_PI, IdentifierType.DAB_SID_EXT));
+ IdentifierType.AMFM_FREQUENCY, IdentifierType.RDS_PI, IdentifierType.DAB_SID_EXT,
+ IdentifierType.HD_STATION_ID_EXT, IdentifierType.DRMO_SERVICE_ID));
halProperties.maker = TEST_MAKER;
halProperties.product = TEST_PRODUCT;
halProperties.version = TEST_VERSION;
@@ -251,4 +324,18 @@
TestUtils.makeVendorKeyValue(VENDOR_INFO_KEY_2, VENDOR_INFO_VALUE_2)));
return halProperties;
}
+
+ private Metadata createStringMetadata(int key, String value) {
+ Metadata metadata = new Metadata();
+ metadata.key = key;
+ metadata.stringValue = value;
+ return metadata;
+ }
+
+ private Metadata createIntMetadata(int key, int value) {
+ Metadata metadata = new Metadata();
+ metadata.key = key;
+ metadata.intValue = value;
+ return metadata;
+ }
}
diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/TestUtils.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/TestUtils.java
index 0b16141..94ae42b 100644
--- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/TestUtils.java
+++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/TestUtils.java
@@ -16,6 +16,7 @@
package com.android.server.broadcastradio.hal2;
import android.hardware.broadcastradio.V2_0.IdentifierType;
+import android.hardware.broadcastradio.V2_0.Metadata;
import android.hardware.broadcastradio.V2_0.ProgramIdentifier;
import android.hardware.broadcastradio.V2_0.ProgramInfo;
import android.hardware.broadcastradio.V2_0.VendorKeyValue;
@@ -127,13 +128,21 @@
static ProgramInfo makeHalProgramInfo(
android.hardware.broadcastradio.V2_0.ProgramSelector hwSel, int hwSignalQuality) {
+ return makeHalProgramInfo(hwSel, hwSignalQuality, /* relatedContent= */ new ArrayList<>(),
+ /* metadata= */ new ArrayList<>());
+ }
+
+ @SuppressWarnings("NonApiType")
+ static ProgramInfo makeHalProgramInfo(
+ android.hardware.broadcastradio.V2_0.ProgramSelector hwSel, int hwSignalQuality,
+ ArrayList<ProgramIdentifier> relatedContent, ArrayList<Metadata> metadata) {
ProgramInfo hwInfo = new ProgramInfo();
hwInfo.selector = hwSel;
hwInfo.logicallyTunedTo = hwSel.primaryId;
hwInfo.physicallyTunedTo = hwSel.primaryId;
hwInfo.signalQuality = hwSignalQuality;
- hwInfo.relatedContent = new ArrayList<>();
- hwInfo.metadata = new ArrayList<>();
+ hwInfo.relatedContent = relatedContent;
+ hwInfo.metadata = metadata;
return hwInfo;
}
diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/TunerSessionHidlTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/TunerSessionHidlTest.java
index 898ef57..55aae9d 100644
--- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/TunerSessionHidlTest.java
+++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/TunerSessionHidlTest.java
@@ -45,6 +45,7 @@
import android.hardware.radio.RadioManager;
import android.hardware.radio.RadioTuner;
import android.os.Binder;
+import android.os.DeadObjectException;
import android.os.ParcelableException;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -367,6 +368,18 @@
}
@Test
+ public void tune_withDeadTunerCallback_removesDeadSession() throws Exception {
+ openAidlClients(/* numClients= */ 1);
+ ProgramSelector sel = TestUtils.makeFmSelector(AM_FM_FREQUENCY_LIST[1]);
+ doThrow(new DeadObjectException()).when(mAidlTunerCallbackMocks[0])
+ .onCurrentProgramInfoChanged(any());
+
+ mTunerSessions[0].tune(sel);
+
+ verify(mHalTunerSessionMock, CALLBACK_TIMEOUT).close();
+ }
+
+ @Test
public void tune_withUnsupportedSelector_throwsException() throws Exception {
ProgramSelector.Identifier dabPrimaryId =
new ProgramSelector.Identifier(ProgramSelector.IDENTIFIER_TYPE_DAB_SID_EXT,
diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
index 4a4c693..5a4561d 100644
--- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
@@ -198,7 +198,7 @@
}
@Override
- MainContentCaptureSession getMainCaptureSession() {
+ ContentCaptureSession getMainCaptureSession() {
throw new UnsupportedOperationException("should not have been called");
}
diff --git a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
index 1cdcb37..b42bcee 100644
--- a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
@@ -433,6 +433,72 @@
assertThat(session.mEvents).isEmpty();
}
+ @Test
+ public void notifyViewAppearedBelowMaximumBufferSize() throws RemoteException {
+ ContentCaptureOptions options =
+ createOptions(
+ /* enableContentCaptureReceiver= */ true,
+ /* enableContentProtectionReceiver= */ true);
+ MainContentCaptureSession session = createSession(options);
+ session.mDirectServiceInterface = mMockContentCaptureDirectManager;
+
+ session.onSessionStarted(0x2, null);
+ for (int i = 0; i < BUFFER_SIZE - 1; i++) {
+ View view = prepareView(session);
+ session.notifyViewAppeared(session.newViewStructure(view));
+ }
+ mTestableLooper.processAllMessages();
+
+ verify(mMockContentCaptureDirectManager, times(0))
+ .sendEvents(any(), anyInt(), any());
+ assertThat(session.mEvents).isNull();
+ assertThat(session.mEventProcessQueue).hasSize(BUFFER_SIZE - 1);
+ }
+
+ @Test
+ public void notifyViewAppearedExactAsMaximumBufferSize() throws RemoteException {
+ ContentCaptureOptions options =
+ createOptions(
+ /* enableContentCaptureReceiver= */ true,
+ /* enableContentProtectionReceiver= */ true);
+ MainContentCaptureSession session = createSession(options);
+ session.mDirectServiceInterface = mMockContentCaptureDirectManager;
+
+ session.onSessionStarted(0x2, null);
+ for (int i = 0; i < BUFFER_SIZE; i++) {
+ View view = prepareView(session);
+ session.notifyViewAppeared(session.newViewStructure(view));
+ }
+ mTestableLooper.processAllMessages();
+
+ verify(mMockContentCaptureDirectManager, times(1))
+ .sendEvents(any(), anyInt(), any());
+ assertThat(session.mEvents).isEmpty();
+ assertThat(session.mEventProcessQueue).isEmpty();
+ }
+
+ @Test
+ public void notifyViewAppearedAboveMaximumBufferSize() throws RemoteException {
+ ContentCaptureOptions options =
+ createOptions(
+ /* enableContentCaptureReceiver= */ true,
+ /* enableContentProtectionReceiver= */ true);
+ MainContentCaptureSession session = createSession(options);
+ session.mDirectServiceInterface = mMockContentCaptureDirectManager;
+
+ session.onSessionStarted(0x2, null);
+ for (int i = 0; i < BUFFER_SIZE * 2 + 1; i++) {
+ View view = prepareView(session);
+ session.notifyViewAppeared(session.newViewStructure(view));
+ }
+ mTestableLooper.processAllMessages();
+
+ verify(mMockContentCaptureDirectManager, times(2))
+ .sendEvents(any(), anyInt(), any());
+ assertThat(session.mEvents).isEmpty();
+ assertThat(session.mEventProcessQueue).hasSize(1);
+ }
+
/** Simulates the regular content capture events sequence. */
private void notifyContentCaptureEvents(final MainContentCaptureSession session) {
final ArrayList<Object> events = new ArrayList<>(
@@ -489,11 +555,13 @@
}
private MainContentCaptureSession createSession(ContentCaptureManager manager) {
+ final Handler testHandler = Handler.createAsync(mTestableLooper.getLooper());
MainContentCaptureSession session =
new MainContentCaptureSession(
sStrippedContext,
manager,
- Handler.createAsync(mTestableLooper.getLooper()),
+ testHandler,
+ testHandler,
mMockSystemServerInterface);
session.mComponentName = COMPONENT_NAME;
return session;
diff --git a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionV2Test.java b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionV2Test.java
deleted file mode 100644
index 0075128..0000000
--- a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionV2Test.java
+++ /dev/null
@@ -1,596 +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 android.view.contentcapture;
-
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_STARTED;
-import static android.view.contentcapture.ContentCaptureSession.FLUSH_REASON_VIEW_TREE_APPEARED;
-import static android.view.contentcapture.ContentCaptureSession.FLUSH_REASON_VIEW_TREE_APPEARING;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-
-import android.content.ComponentName;
-import android.content.ContentCaptureOptions;
-import android.content.Context;
-import android.content.pm.ParceledListSlice;
-import android.graphics.Insets;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.util.SparseArray;
-import android.view.View;
-import android.view.autofill.AutofillId;
-import android.view.contentprotection.ContentProtectionEventProcessor;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Test for {@link MainContentCaptureSessionV2}.
- *
- * <p>Run with: {@code atest
- * FrameworksCoreTests:android.view.contentcapture.MainContentCaptureSessionV2Test}
- */
-@RunWith(AndroidTestingRunner.class)
-@SmallTest
-@TestableLooper.RunWithLooper
-public class MainContentCaptureSessionV2Test {
-
- private static final int BUFFER_SIZE = 100;
-
- private static final int REASON = 123;
-
- private static final ContentCaptureEvent EVENT =
- new ContentCaptureEvent(/* sessionId= */ 0, TYPE_SESSION_STARTED);
-
- private static final ComponentName COMPONENT_NAME =
- new ComponentName("com.test.package", "TestClass");
-
- private static final Context sContext = ApplicationProvider.getApplicationContext();
-
- private static final ContentCaptureManager.StrippedContext sStrippedContext =
- new ContentCaptureManager.StrippedContext(sContext);
-
- private TestableLooper mTestableLooper;
-
- @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
-
- @Mock private IContentCaptureManager mMockSystemServerInterface;
-
- @Mock private ContentProtectionEventProcessor mMockContentProtectionEventProcessor;
-
- @Mock private IContentCaptureDirectManager mMockContentCaptureDirectManager;
-
- @Before
- public void setup() {
- mTestableLooper = TestableLooper.get(this);
- }
-
- @Test
- public void onSessionStarted_contentProtectionEnabled_processorCreated() {
- MainContentCaptureSessionV2 session = createSession();
- assertThat(session.mContentProtectionEventProcessor).isNull();
-
- session.onSessionStarted(/* resultCode= */ 0, /* binder= */ null);
- mTestableLooper.processAllMessages();
-
- assertThat(session.mContentProtectionEventProcessor).isNotNull();
- }
-
- @Test
- public void onSessionStarted_contentProtectionDisabled_processorNotCreated() {
- MainContentCaptureSessionV2 session =
- createSession(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ false);
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.onSessionStarted(/* resultCode= */ 0, /* binder= */ null);
- mTestableLooper.processAllMessages();
-
- assertThat(session.mContentProtectionEventProcessor).isNull();
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- }
-
- @Test
- public void onSessionStarted_contentProtectionNoBuffer_processorNotCreated() {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- new ContentCaptureOptions.ContentProtectionOptions(
- /* enableReceiver= */ true,
- -BUFFER_SIZE,
- /* requiredGroups= */ List.of(List.of("a")),
- /* optionalGroups= */ Collections.emptyList(),
- /* optionalGroupsThreshold= */ 0));
- MainContentCaptureSessionV2 session = createSession(options);
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.onSessionStarted(/* resultCode= */ 0, /* binder= */ null);
- mTestableLooper.processAllMessages();
-
- assertThat(session.mContentProtectionEventProcessor).isNull();
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- }
-
- @Test
- public void onSessionStarted_contentProtectionNoGroups_processorNotCreated() {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- new ContentCaptureOptions.ContentProtectionOptions(
- /* enableReceiver= */ true,
- BUFFER_SIZE,
- /* requiredGroups= */ Collections.emptyList(),
- /* optionalGroups= */ Collections.emptyList(),
- /* optionalGroupsThreshold= */ 0));
- MainContentCaptureSessionV2 session = createSession(options);
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.onSessionStarted(/* resultCode= */ 0, /* binder= */ null);
- mTestableLooper.processAllMessages();
-
- assertThat(session.mContentProtectionEventProcessor).isNull();
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- }
-
- @Test
- public void onSessionStarted_noComponentName_processorNotCreated() {
- MainContentCaptureSessionV2 session = createSession();
- session.mComponentName = null;
-
- session.onSessionStarted(/* resultCode= */ 0, /* binder= */ null);
- mTestableLooper.processAllMessages();
-
- assertThat(session.mContentProtectionEventProcessor).isNull();
- }
-
- @Test
- public void sendEvent_contentCaptureDisabled_contentProtectionDisabled() {
- MainContentCaptureSessionV2 session =
- createSession(
- /* enableContentCaptureReceiver= */ false,
- /* enableContentProtectionReceiver= */ false);
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.sendEvent(EVENT);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mEvents).isNull();
- }
-
- @Test
- public void sendEvent_contentCaptureDisabled_contentProtectionEnabled() {
- MainContentCaptureSessionV2 session =
- createSession(
- /* enableContentCaptureReceiver= */ false,
- /* enableContentProtectionReceiver= */ true);
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.sendEvent(EVENT);
- mTestableLooper.processAllMessages();
-
- verify(mMockContentProtectionEventProcessor).processEvent(EVENT);
- assertThat(session.mEvents).isNull();
- }
-
- @Test
- public void sendEvent_contentCaptureEnabled_contentProtectionDisabled() {
- MainContentCaptureSessionV2 session =
- createSession(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ false);
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.sendEvent(EVENT);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mEvents).isNotNull();
- assertThat(session.mEvents).containsExactly(EVENT);
- }
-
- @Test
- public void sendEvent_contentCaptureEnabled_contentProtectionEnabled() {
- MainContentCaptureSessionV2 session = createSession();
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.sendEvent(EVENT);
- mTestableLooper.processAllMessages();
-
- verify(mMockContentProtectionEventProcessor).processEvent(EVENT);
- assertThat(session.mEvents).isNotNull();
- assertThat(session.mEvents).containsExactly(EVENT);
- }
-
- @Test
- public void sendEvent_contentProtectionEnabled_processorNotCreated() {
- MainContentCaptureSessionV2 session =
- createSession(
- /* enableContentCaptureReceiver= */ false,
- /* enableContentProtectionReceiver= */ true);
-
- session.sendEvent(EVENT);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mEvents).isNull();
- }
-
- @Test
- public void flush_contentCaptureDisabled_contentProtectionDisabled() throws Exception {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ false,
- /* enableContentProtectionReceiver= */ false);
- MainContentCaptureSessionV2 session = createSession(options);
- session.mEvents = new ArrayList<>(Arrays.asList(EVENT));
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
-
- session.flush(REASON);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- verifyZeroInteractions(mMockContentCaptureDirectManager);
- assertThat(session.mEvents).containsExactly(EVENT);
- }
-
- @Test
- public void flush_contentCaptureDisabled_contentProtectionEnabled() {
- MainContentCaptureSessionV2 session =
- createSession(
- /* enableContentCaptureReceiver= */ false,
- /* enableContentProtectionReceiver= */ true);
- session.mEvents = new ArrayList<>(Arrays.asList(EVENT));
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
-
- session.flush(REASON);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- verifyZeroInteractions(mMockContentCaptureDirectManager);
- assertThat(session.mEvents).containsExactly(EVENT);
- }
-
- @Test
- public void flush_contentCaptureEnabled_contentProtectionDisabled() throws Exception {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ false);
- MainContentCaptureSessionV2 session = createSession(options);
- session.mEvents = new ArrayList<>(Arrays.asList(EVENT));
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
-
- session.flush(REASON);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mEvents).isEmpty();
- assertEventFlushedContentCapture(options);
- }
-
- @Test
- public void flush_contentCaptureEnabled_contentProtectionEnabled() throws Exception {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ true);
- MainContentCaptureSessionV2 session = createSession(options);
- session.mEvents = new ArrayList<>(Arrays.asList(EVENT));
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
-
- session.flush(REASON);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mEvents).isEmpty();
- assertEventFlushedContentCapture(options);
- }
-
- @Test
- public void destroySession() throws Exception {
- MainContentCaptureSessionV2 session = createSession();
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.destroySession();
- mTestableLooper.processAllMessages();
-
- verify(mMockSystemServerInterface).finishSession(anyInt());
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mDirectServiceInterface).isNull();
- assertThat(session.mContentProtectionEventProcessor).isNull();
- }
-
- @Test
- public void resetSession() {
- MainContentCaptureSessionV2 session = createSession();
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- session.resetSession(/* newState= */ 0);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockSystemServerInterface);
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mDirectServiceInterface).isNull();
- assertThat(session.mContentProtectionEventProcessor).isNull();
- }
-
- @Test
- @SuppressWarnings("GuardedBy")
- public void notifyContentCaptureEvents_notStarted_ContentCaptureDisabled_ProtectionDisabled() {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ false,
- /* enableContentProtectionReceiver= */ false);
- MainContentCaptureSessionV2 session = createSession(options);
-
- notifyContentCaptureEvents(session);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentCaptureDirectManager);
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mEvents).isNull();
- }
-
- @Test
- @SuppressWarnings("GuardedBy")
- public void notifyContentCaptureEvents_started_ContentCaptureDisabled_ProtectionDisabled() {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ false,
- /* enableContentProtectionReceiver= */ false);
- MainContentCaptureSessionV2 session = createSession(options);
-
- session.onSessionStarted(0x2, null);
- notifyContentCaptureEvents(session);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentCaptureDirectManager);
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mEvents).isNull();
- }
-
- @Test
- @SuppressWarnings("GuardedBy")
- public void notifyContentCaptureEvents_notStarted_ContentCaptureEnabled_ProtectionEnabled() {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ true);
- MainContentCaptureSessionV2 session = createSession(options);
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
-
- notifyContentCaptureEvents(session);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mMockContentCaptureDirectManager);
- verifyZeroInteractions(mMockContentProtectionEventProcessor);
- assertThat(session.mEvents).isNull();
- }
-
- @Test
- @SuppressWarnings("GuardedBy")
- public void notifyContentCaptureEvents_started_ContentCaptureEnabled_ProtectionEnabled()
- throws RemoteException {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ true);
- MainContentCaptureSessionV2 session = createSession(options);
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
-
- session.onSessionStarted(0x2, null);
- // Override the processor for interaction verification.
- session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
- notifyContentCaptureEvents(session);
- mTestableLooper.processAllMessages();
-
- // Force flush will happen twice.
- verify(mMockContentCaptureDirectManager, times(1))
- .sendEvents(any(), eq(FLUSH_REASON_VIEW_TREE_APPEARING), any());
- verify(mMockContentCaptureDirectManager, times(1))
- .sendEvents(any(), eq(FLUSH_REASON_VIEW_TREE_APPEARED), any());
- // Other than the five view events, there will be two additional tree appearing events.
- verify(mMockContentProtectionEventProcessor, times(7)).processEvent(any());
- assertThat(session.mEvents).isEmpty();
- }
-
- @Test
- public void notifyViewAppearedBelowMaximumBufferSize() throws RemoteException {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ true);
- MainContentCaptureSessionV2 session = createSession(options);
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
-
- session.onSessionStarted(0x2, null);
- for (int i = 0; i < BUFFER_SIZE - 1; i++) {
- View view = prepareView(session);
- session.notifyViewAppeared(session.newViewStructure(view));
- }
- mTestableLooper.processAllMessages();
-
- verify(mMockContentCaptureDirectManager, times(0))
- .sendEvents(any(), anyInt(), any());
- assertThat(session.mEvents).isNull();
- assertThat(session.mEventProcessQueue).hasSize(BUFFER_SIZE - 1);
- }
-
- @Test
- public void notifyViewAppearedExactAsMaximumBufferSize() throws RemoteException {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ true);
- MainContentCaptureSessionV2 session = createSession(options);
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
-
- session.onSessionStarted(0x2, null);
- for (int i = 0; i < BUFFER_SIZE; i++) {
- View view = prepareView(session);
- session.notifyViewAppeared(session.newViewStructure(view));
- }
- mTestableLooper.processAllMessages();
-
- verify(mMockContentCaptureDirectManager, times(1))
- .sendEvents(any(), anyInt(), any());
- assertThat(session.mEvents).isEmpty();
- assertThat(session.mEventProcessQueue).isEmpty();
- }
-
- @Test
- public void notifyViewAppearedAboveMaximumBufferSize() throws RemoteException {
- ContentCaptureOptions options =
- createOptions(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ true);
- MainContentCaptureSessionV2 session = createSession(options);
- session.mDirectServiceInterface = mMockContentCaptureDirectManager;
-
- session.onSessionStarted(0x2, null);
- for (int i = 0; i < BUFFER_SIZE * 2 + 1; i++) {
- View view = prepareView(session);
- session.notifyViewAppeared(session.newViewStructure(view));
- }
- mTestableLooper.processAllMessages();
-
- verify(mMockContentCaptureDirectManager, times(2))
- .sendEvents(any(), anyInt(), any());
- assertThat(session.mEvents).isEmpty();
- assertThat(session.mEventProcessQueue).hasSize(1);
- }
-
- /** Simulates the regular content capture events sequence. */
- private void notifyContentCaptureEvents(final MainContentCaptureSessionV2 session) {
- final ArrayList<Object> events = new ArrayList<>(
- List.of(
- prepareView(session),
- prepareView(session),
- new AutofillId(0),
- prepareView(session),
- Insets.of(0, 0, 0, 0)
- )
- );
-
- final SparseArray<ArrayList<Object>> contentCaptureEvents = new SparseArray<>();
- contentCaptureEvents.set(session.getId(), events);
-
- session.notifyContentCaptureEvents(contentCaptureEvents);
- }
-
- private View prepareView(final MainContentCaptureSessionV2 session) {
- final View view = new View(sContext);
- view.setContentCaptureSession(session);
- return view;
- }
-
- private static ContentCaptureOptions createOptions(
- boolean enableContentCaptureReceiver,
- ContentCaptureOptions.ContentProtectionOptions contentProtectionOptions) {
- return new ContentCaptureOptions(
- /* loggingLevel= */ 0,
- BUFFER_SIZE,
- /* idleFlushingFrequencyMs= */ 0,
- /* textChangeFlushingFrequencyMs= */ 0,
- /* logHistorySize= */ 0,
- /* disableFlushForViewTreeAppearing= */ false,
- enableContentCaptureReceiver,
- contentProtectionOptions,
- /* whitelistedComponents= */ null);
- }
-
- private static ContentCaptureOptions createOptions(
- boolean enableContentCaptureReceiver, boolean enableContentProtectionReceiver) {
- return createOptions(
- enableContentCaptureReceiver,
- new ContentCaptureOptions.ContentProtectionOptions(
- enableContentProtectionReceiver,
- BUFFER_SIZE,
- /* requiredGroups= */ List.of(List.of("a")),
- /* optionalGroups= */ Collections.emptyList(),
- /* optionalGroupsThreshold= */ 0));
- }
-
- private ContentCaptureManager createManager(ContentCaptureOptions options) {
- return new ContentCaptureManager(sContext, mMockSystemServerInterface, options);
- }
-
- private MainContentCaptureSessionV2 createSession(ContentCaptureManager manager) {
- final Handler testHandler = Handler.createAsync(mTestableLooper.getLooper());
- MainContentCaptureSessionV2 session =
- new MainContentCaptureSessionV2(
- sStrippedContext,
- manager,
- testHandler,
- testHandler,
- mMockSystemServerInterface);
- session.mComponentName = COMPONENT_NAME;
- return session;
- }
-
- private MainContentCaptureSessionV2 createSession(ContentCaptureOptions options) {
- return createSession(createManager(options));
- }
-
- private MainContentCaptureSessionV2 createSession(
- boolean enableContentCaptureReceiver, boolean enableContentProtectionReceiver) {
- return createSession(
- createOptions(enableContentCaptureReceiver, enableContentProtectionReceiver));
- }
-
- private MainContentCaptureSessionV2 createSession() {
- return createSession(
- /* enableContentCaptureReceiver= */ true,
- /* enableContentProtectionReceiver= */ true);
- }
-
- private void assertEventFlushedContentCapture(ContentCaptureOptions options) throws Exception {
- ArgumentCaptor<ParceledListSlice> captor = ArgumentCaptor.forClass(ParceledListSlice.class);
- verify(mMockContentCaptureDirectManager)
- .sendEvents(captor.capture(), eq(REASON), eq(options));
-
- assertThat(captor.getValue()).isNotNull();
- List<ContentCaptureEvent> actual = captor.getValue().getList();
- assertThat(actual).isNotNull();
- assertThat(actual).containsExactly(EVENT);
- }
-}
diff --git a/libs/WindowManager/Shell/AndroidManifest.xml b/libs/WindowManager/Shell/AndroidManifest.xml
index 7a98683..bcb1d29 100644
--- a/libs/WindowManager/Shell/AndroidManifest.xml
+++ b/libs/WindowManager/Shell/AndroidManifest.xml
@@ -30,5 +30,29 @@
android:excludeFromRecents="true"
android:launchMode="singleInstance"
android:theme="@style/DesktopWallpaperTheme" />
+
+ <activity
+ android:name=".bubbles.shortcut.CreateBubbleShortcutActivity"
+ android:exported="true"
+ android:excludeFromRecents="true"
+ android:theme="@android:style/Theme.NoDisplay"
+ android:label="Bubbles"
+ android:icon="@drawable/ic_bubbles_shortcut_widget">
+ <intent-filter>
+ <action android:name="android.intent.action.CREATE_SHORTCUT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name=".bubbles.shortcut.ShowBubblesActivity"
+ android:exported="true"
+ android:excludeFromRecents="true"
+ android:theme="@android:style/Theme.NoDisplay" >
+ <intent-filter>
+ <action android:name="com.android.wm.shell.bubbles.action.SHOW_BUBBLES"/>
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
</application>
</manifest>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
index 04ad572..a30cfb7 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
@@ -20,5 +20,6 @@
android:shape="rectangle">
<corners
android:radius="@dimen/desktop_mode_maximize_menu_buttons_outline_radius"/>
+ <solid android:color="?androidprv:attr/materialColorSurfaceContainerLow"/>
<stroke android:width="1dp" android:color="?androidprv:attr/materialColorOutlineVariant"/>
</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget.xml b/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget.xml
new file mode 100644
index 0000000..b208f2f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget.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.
+ -->
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_bubbles_shortcut_widget_background" />
+ <foreground android:drawable="@drawable/ic_bubbles_shortcut_widget_foreground" />
+</adaptive-icon>
diff --git a/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget_background.xml b/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget_background.xml
new file mode 100644
index 0000000..510221f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget_background.xml
@@ -0,0 +1,24 @@
+<?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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="108"
+ android:viewportHeight="108">
+ <path
+ android:pathData="M0,0h108v108h-108z"
+ android:fillColor="#FFC20C"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget_foreground.xml b/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget_foreground.xml
new file mode 100644
index 0000000..a41b6a9
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/ic_bubbles_shortcut_widget_foreground.xml
@@ -0,0 +1,36 @@
+<?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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="@android:color/white">
+ <group android:scaleX="0.58"
+ android:scaleY="0.58"
+ android:translateX="5.04"
+ android:translateY="5.04">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M7.2,14.4m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M14.8,18m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M15.2,8.8m-4.8,0a4.8,4.8 0,1 1,9.6 0a4.8,4.8 0,1 1,-9.6 0"/>
+ </group>
+</vector>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
index 9599658..7d5f9cd 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
@@ -31,23 +31,15 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <FrameLayout
- android:id="@+id/maximize_menu_maximize_button_layout"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/desktop_mode_maximize_menu_layout_background"
- android:padding="4dp"
+ <Button
+ android:layout_width="94dp"
+ android:layout_height="60dp"
+ android:id="@+id/maximize_menu_maximize_button"
+ style="?android:attr/buttonBarButtonStyle"
+ android:stateListAnimator="@null"
android:layout_marginRight="8dp"
android:layout_marginBottom="4dp"
- android:alpha="0">
- <Button
- android:id="@+id/maximize_menu_maximize_button"
- style="?android:attr/buttonBarButtonStyle"
- android:layout_width="86dp"
- android:layout_height="@dimen/desktop_mode_maximize_menu_button_height"
- android:background="@drawable/desktop_mode_maximize_menu_button_background"
- android:stateListAnimator="@null"/>
- </FrameLayout>
+ android:alpha="0"/>
<TextView
android:id="@+id/maximize_menu_maximize_window_text"
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 89cddc3..595d346 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -482,6 +482,12 @@
<!-- The radius of the layout outline around the maximize menu buttons. -->
<dimen name="desktop_mode_maximize_menu_buttons_outline_radius">6dp</dimen>
+ <!-- The stroke width of the outline around the maximize menu buttons. -->
+ <dimen name="desktop_mode_maximize_menu_buttons_outline_stroke">1dp</dimen>
+ <!-- The radius of the inner fill of the maximize menu buttons. -->
+ <dimen name="desktop_mode_maximize_menu_buttons_fill_radius">4dp</dimen>
+ <!-- The padding between the outline and fill of the maximize menu buttons. -->
+ <dimen name="desktop_mode_maximize_menu_buttons_fill_padding">4dp</dimen>
<!-- The corner radius of the maximize menu. -->
<dimen name="desktop_mode_maximize_menu_corner_radius">8dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index bf654d9..4784674 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -182,6 +182,12 @@
<!-- Content description to tell the user a bubble has been dismissed. -->
<string name="accessibility_bubble_dismissed">Bubble dismissed.</string>
+ <!-- Label used to for bubbles shortcut [CHAR_LIMIT=10] -->
+ <string name="bubble_shortcut_label">Bubbles</string>
+
+ <!-- Longer label used to for bubbles shortcut, shown if there is enough space [CHAR_LIMIT=25] -->
+ <string name="bubble_shortcut_long_label">Show Bubbles</string>
+
<!-- Description of the restart button in the hint of size compatibility mode. [CHAR LIMIT=NONE] -->
<string name="restart_button_description">Tap to restart this app for a better view</string>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
index a426b20..5a42817 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
@@ -31,6 +31,7 @@
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.content.Context;
+import android.graphics.Point;
import android.graphics.Rect;
import android.os.IBinder;
import android.util.ArraySet;
@@ -45,6 +46,7 @@
import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.window.flags.Flags;
import com.android.wm.shell.activityembedding.ActivityEmbeddingAnimationAdapter.SnapshotAdapter;
import com.android.wm.shell.common.ScreenshotUtils;
import com.android.wm.shell.shared.TransitionUtil;
@@ -398,7 +400,15 @@
// This is because the TaskFragment surface/change won't contain the Activity's before its
// reparent.
Animation changeAnimation = null;
- Rect parentBounds = new Rect();
+ final Rect parentBounds = new Rect();
+ // We use a single boolean value to record the backdrop override because the override used
+ // for overlay and we restrict to single overlay animation. We should fix the assumption
+ // if we allow multiple overlay transitions.
+ // The backdrop logic is mainly for animations of split animations. The backdrop should be
+ // disabled if there is any open/close target in the same transition as the change target.
+ // However, the overlay change animation usually contains one change target, and shows
+ // backdrop unexpectedly.
+ Boolean overrideShowBackdrop = null;
for (TransitionInfo.Change change : info.getChanges()) {
if (change.getMode() != TRANSIT_CHANGE
|| change.getStartAbsBounds().equals(change.getEndAbsBounds())) {
@@ -421,17 +431,17 @@
}
}
- // The TaskFragment may be enter/exit split, so we take the union of both as the parent
- // size.
- parentBounds.union(boundsAnimationChange.getStartAbsBounds());
- parentBounds.union(boundsAnimationChange.getEndAbsBounds());
- if (boundsAnimationChange != change) {
- // Union the change starting bounds in case the activity is resized and reparented
- // to a TaskFragment. In that case, the TaskFragment may not cover the activity's
- // starting bounds.
- parentBounds.union(change.getStartAbsBounds());
+ final TransitionInfo.AnimationOptions options = boundsAnimationChange
+ .getAnimationOptions();
+ if (options != null) {
+ final Animation overrideAnimation = mAnimationSpec.loadCustomAnimationFromOptions(
+ options, TRANSIT_CHANGE);
+ if (overrideAnimation != null) {
+ overrideShowBackdrop = overrideAnimation.getShowBackdrop();
+ }
}
+ calculateParentBounds(change, boundsAnimationChange, parentBounds);
// There are two animations in the array. The first one is for the start leash
// (snapshot), and the second one is for the end leash (TaskFragment).
final Animation[] animations = mAnimationSpec.createChangeBoundsChangeAnimations(change,
@@ -466,7 +476,7 @@
// If there is no corresponding open/close window with the change, we should show background
// color to cover the empty part of the screen.
- boolean shouldShouldBackgroundColor = true;
+ boolean shouldShowBackgroundColor = true;
// Handle the other windows that don't have bounds change in the same transition.
for (TransitionInfo.Change change : info.getChanges()) {
if (handledChanges.contains(change)) {
@@ -483,16 +493,18 @@
animation = ActivityEmbeddingAnimationSpec.createNoopAnimation(change);
} else if (TransitionUtil.isClosingType(change.getMode())) {
animation = mAnimationSpec.createChangeBoundsCloseAnimation(change, parentBounds);
- shouldShouldBackgroundColor = false;
+ shouldShowBackgroundColor = false;
} else {
animation = mAnimationSpec.createChangeBoundsOpenAnimation(change, parentBounds);
- shouldShouldBackgroundColor = false;
+ shouldShowBackgroundColor = false;
}
adapters.add(new ActivityEmbeddingAnimationAdapter(animation, change,
TransitionUtil.getRootFor(change, info)));
}
- if (shouldShouldBackgroundColor && changeAnimation != null) {
+ shouldShowBackgroundColor = overrideShowBackdrop != null
+ ? overrideShowBackdrop : shouldShowBackgroundColor;
+ if (shouldShowBackgroundColor && changeAnimation != null) {
// Change animation may leave part of the screen empty. Show background color to cover
// that.
changeAnimation.setShowBackdrop(true);
@@ -502,6 +514,39 @@
}
/**
+ * Calculates parent bounds of the animation target by {@code change}.
+ */
+ @VisibleForTesting
+ static void calculateParentBounds(@NonNull TransitionInfo.Change change,
+ @NonNull TransitionInfo.Change boundsAnimationChange, @NonNull Rect outParentBounds) {
+ if (Flags.activityEmbeddingOverlayPresentationFlag()) {
+ final Point endParentSize = change.getEndParentSize();
+ if (endParentSize.equals(0, 0)) {
+ return;
+ }
+ final Point endRelPosition = change.getEndRelOffset();
+ final Point endAbsPosition = new Point(change.getEndAbsBounds().left,
+ change.getEndAbsBounds().top);
+ final Point parentEndAbsPosition = new Point(endAbsPosition.x - endRelPosition.x,
+ endAbsPosition.y - endRelPosition.y);
+ outParentBounds.set(parentEndAbsPosition.x, parentEndAbsPosition.y,
+ parentEndAbsPosition.x + endParentSize.x,
+ parentEndAbsPosition.y + endParentSize.y);
+ } else {
+ // The TaskFragment may be enter/exit split, so we take the union of both as
+ // the parent size.
+ outParentBounds.union(boundsAnimationChange.getStartAbsBounds());
+ outParentBounds.union(boundsAnimationChange.getEndAbsBounds());
+ if (boundsAnimationChange != change) {
+ // Union the change starting bounds in case the activity is resized and
+ // reparented to a TaskFragment. In that case, the TaskFragment may not cover
+ // the activity's starting bounds.
+ outParentBounds.union(change.getStartAbsBounds());
+ }
+ }
+ }
+
+ /**
* Takes a screenshot of the given {@code screenshotChange} surface if WM Core hasn't taken one.
* The screenshot leash should be attached to the {@code animationChange} surface which we will
* animate later.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationSpec.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationSpec.java
index b986862..8d49614 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationSpec.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationSpec.java
@@ -18,6 +18,8 @@
import static android.app.ActivityOptions.ANIM_CUSTOM;
+import static android.view.WindowManager.TRANSIT_CHANGE;
+import static android.window.TransitionInfo.AnimationOptions.DEFAULT_ANIMATION_RESOURCES_ID;
import static com.android.internal.policy.TransitionAnimation.WALLPAPER_TRANSITION_NONE;
import static com.android.wm.shell.transition.TransitionAnimationHelper.loadAttributeAnimation;
@@ -27,6 +29,8 @@
import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Rect;
+import android.util.Log;
+import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
@@ -203,7 +207,7 @@
Animation loadOpenAnimation(@NonNull TransitionInfo info,
@NonNull TransitionInfo.Change change, @NonNull Rect wholeAnimationBounds) {
final boolean isEnter = TransitionUtil.isOpeningType(change.getMode());
- final Animation customAnimation = loadCustomAnimation(info, change, isEnter);
+ final Animation customAnimation = loadCustomAnimation(info, change);
final Animation animation;
if (customAnimation != null) {
animation = customAnimation;
@@ -230,7 +234,7 @@
Animation loadCloseAnimation(@NonNull TransitionInfo info,
@NonNull TransitionInfo.Change change, @NonNull Rect wholeAnimationBounds) {
final boolean isEnter = TransitionUtil.isOpeningType(change.getMode());
- final Animation customAnimation = loadCustomAnimation(info, change, isEnter);
+ final Animation customAnimation = loadCustomAnimation(info, change);
final Animation animation;
if (customAnimation != null) {
animation = customAnimation;
@@ -263,18 +267,40 @@
@Nullable
private Animation loadCustomAnimation(@NonNull TransitionInfo info,
- @NonNull TransitionInfo.Change change, boolean isEnter) {
+ @NonNull TransitionInfo.Change change) {
final TransitionInfo.AnimationOptions options;
if (Flags.moveAnimationOptionsToChange()) {
options = change.getAnimationOptions();
} else {
options = info.getAnimationOptions();
}
+ return loadCustomAnimationFromOptions(options, change.getMode());
+ }
+
+ @Nullable
+ Animation loadCustomAnimationFromOptions(@Nullable TransitionInfo.AnimationOptions options,
+ @WindowManager.TransitionType int mode) {
if (options == null || options.getType() != ANIM_CUSTOM) {
return null;
}
+ final int resId;
+ if (TransitionUtil.isOpeningType(mode)) {
+ resId = options.getEnterResId();
+ } else if (TransitionUtil.isClosingType(mode)) {
+ resId = options.getExitResId();
+ } else if (mode == TRANSIT_CHANGE) {
+ resId = options.getChangeResId();
+ } else {
+ Log.w(TAG, "Unknown transit type:" + mode);
+ resId = DEFAULT_ANIMATION_RESOURCES_ID;
+ }
+ // Use the default animation if the resources ID is not specified.
+ if (resId == DEFAULT_ANIMATION_RESOURCES_ID) {
+ return null;
+ }
+
final Animation anim = mTransitionAnimation.loadAnimationRes(options.getPackageName(),
- isEnter ? options.getEnterResId() : options.getExitResId());
+ resId);
if (anim != null) {
return anim;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index 6449073..d2c36e6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -86,6 +86,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.common.ProtoLog;
import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.util.CollectionUtils;
import com.android.launcher3.icons.BubbleIconFactory;
import com.android.wm.shell.Flags;
import com.android.wm.shell.R;
@@ -93,6 +94,7 @@
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.bubbles.bar.BubbleBarLayerView;
import com.android.wm.shell.bubbles.properties.BubbleProperties;
+import com.android.wm.shell.bubbles.shortcut.BubbleShortcutHelper;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ExternalInterfaceBinder;
import com.android.wm.shell.common.FloatingContentCoordinator;
@@ -511,6 +513,10 @@
}
mCurrentProfiles = userProfiles;
+ if (Flags.enableRetrievableBubbles()) {
+ registerShortcutBroadcastReceiver();
+ }
+
mShellController.addConfigurationChangeListener(this);
mShellController.addExternalInterface(KEY_EXTRA_SHELL_BUBBLES,
this::createExternalInterface, this);
@@ -987,6 +993,25 @@
}
};
+ private void registerShortcutBroadcastReceiver() {
+ IntentFilter shortcutFilter = new IntentFilter();
+ shortcutFilter.addAction(BubbleShortcutHelper.ACTION_SHOW_BUBBLES);
+ ProtoLog.d(WM_SHELL_BUBBLES, "register broadcast receive for bubbles shortcut");
+ mContext.registerReceiver(mShortcutBroadcastReceiver, shortcutFilter,
+ Context.RECEIVER_NOT_EXPORTED);
+ }
+
+ private final BroadcastReceiver mShortcutBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ ProtoLog.v(WM_SHELL_BUBBLES, "receive broadcast to show bubbles %s",
+ intent.getAction());
+ if (BubbleShortcutHelper.ACTION_SHOW_BUBBLES.equals(intent.getAction())) {
+ mMainExecutor.execute(() -> showBubblesFromShortcut());
+ }
+ }
+ };
+
/**
* Called by the BubbleStackView and whenever all bubbles have animated out, and none have been
* added in the meantime.
@@ -2229,6 +2254,34 @@
}
/**
+ * Show bubbles UI when triggered via shortcut.
+ *
+ * <p>When there are bubbles visible, expands the top-most bubble. When there are no bubbles
+ * visible, opens the bubbles overflow UI.
+ */
+ public void showBubblesFromShortcut() {
+ if (isStackExpanded()) {
+ ProtoLog.v(WM_SHELL_BUBBLES, "showBubblesFromShortcut: stack visible, skip");
+ return;
+ }
+ if (mBubbleData.getSelectedBubble() != null) {
+ ProtoLog.v(WM_SHELL_BUBBLES, "showBubblesFromShortcut: open selected bubble");
+ expandStackWithSelectedBubble();
+ return;
+ }
+ BubbleViewProvider bubbleToSelect = CollectionUtils.firstOrNull(mBubbleData.getBubbles());
+ if (bubbleToSelect == null) {
+ ProtoLog.v(WM_SHELL_BUBBLES, "showBubblesFromShortcut: no bubbles");
+ // make sure overflow bubbles are loaded
+ loadOverflowBubblesFromDisk();
+ bubbleToSelect = mBubbleData.getOverflow();
+ }
+ ProtoLog.v(WM_SHELL_BUBBLES, "showBubblesFromShortcut: select and open %s",
+ bubbleToSelect.getKey());
+ mBubbleData.setSelectedBubbleAndExpandStack(bubbleToSelect);
+ }
+
+ /**
* Description of current bubble state.
*/
private void dump(PrintWriter pw, String prefix) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
index 81e7d1f..761e025 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
@@ -916,6 +916,9 @@
((Bubble) bubble).markAsAccessedAt(mTimeSource.currentTimeMillis());
}
mSelectedBubble = bubble;
+ if (isOverflow) {
+ mShowingOverflow = true;
+ }
mStateChange.selectedBubble = bubble;
mStateChange.selectionChanged = true;
}
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 ed904e2..09bec8c 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
@@ -134,6 +134,8 @@
private static final float EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT = 0.1f;
+ private static final float OPEN_OVERFLOW_ANIMATE_SCALE_AMOUNT = 0.5f;
+
private static final int EXPANDED_VIEW_ALPHA_ANIMATION_DURATION = 150;
/** Minimum alpha value for scrim when alpha is being changed via drag */
@@ -1549,10 +1551,20 @@
}
private void updateOverflowVisibility() {
- mBubbleOverflow.setVisible(mShowingOverflow
- && (mIsExpanded || mBubbleData.isShowingOverflow())
- ? VISIBLE
- : GONE);
+ int visibility = GONE;
+ if (mShowingOverflow) {
+ if (mIsExpanded || mBubbleData.isShowingOverflow()) {
+ visibility = VISIBLE;
+ }
+ }
+ if (Flags.enableRetrievableBubbles()) {
+ if (BubbleOverflow.KEY.equals(mBubbleData.getSelectedBubbleKey())
+ && !mBubbleData.hasBubbles()) {
+ // Hide overflow bubble icon if it is the only bubble
+ visibility = GONE;
+ }
+ }
+ mBubbleOverflow.setVisible(visibility);
}
private void updateOverflowDotVisibility(boolean expanding) {
@@ -2147,6 +2159,13 @@
if (mIsExpanded) {
hideCurrentInputMethod();
+ if (Flags.enableRetrievableBubbles()) {
+ if (mBubbleData.getBubbles().size() == 1) {
+ // First bubble, check if overflow visibility needs to change
+ updateOverflowVisibility();
+ }
+ }
+
// Make the container of the expanded view transparent before removing the expanded view
// from it. Otherwise a punch hole created by {@link android.view.SurfaceView} in the
// expanded view becomes visible on the screen. See b/126856255
@@ -2215,6 +2234,16 @@
}
/**
+ * Check if we only have overflow expanded. Which is the case when we are launching bubbles from
+ * background.
+ */
+ private boolean isOnlyOverflowExpanded() {
+ boolean overflowExpanded = mExpandedBubble != null && BubbleOverflow.KEY.equals(
+ mExpandedBubble.getKey());
+ return overflowExpanded && !mBubbleData.hasBubbles();
+ }
+
+ /**
* Monitor for swipe up gesture that is used to collapse expanded view
*/
void startMonitoringSwipeUpGesture() {
@@ -2433,7 +2462,7 @@
ProtoLog.d(WM_SHELL_BUBBLES, "animateExpansion, expandedBubble=%s",
mExpandedBubble != null ? mExpandedBubble.getKey() : "null");
cancelDelayedExpandCollapseSwitchAnimations();
- final boolean showVertically = mPositioner.showBubblesVertically();
+
mIsExpanded = true;
if (isStackEduVisible()) {
mStackEduView.hide(true /* fromExpansion */);
@@ -2443,8 +2472,17 @@
showScrim(true, null /* runnable */);
updateBubbleShadows(mIsExpanded);
mBubbleContainer.setActiveController(mExpandedAnimationController);
- updateBadges(false /* setBadgeForCollapsedStack */);
updateOverflowVisibility();
+
+ if (Flags.enableRetrievableBubbles() && isOnlyOverflowExpanded()) {
+ animateOverflowExpansion();
+ } else {
+ animateBubbleExpansion();
+ }
+ }
+
+ private void animateBubbleExpansion() {
+ updateBadges(false /* setBadgeForCollapsedStack */);
updatePointerPosition(false /* forIme */);
if (Flags.enableBubbleStashing()) {
mBubbleContainer.animate().translationX(0).start();
@@ -2468,6 +2506,7 @@
mExpandedViewContainer.setTranslationY(translationY);
mExpandedViewContainer.setAlpha(1f);
+ final boolean showVertically = mPositioner.showBubblesVertically();
// How far horizontally the bubble will be animating. We'll wait a bit longer for bubbles
// that are animating farther, so that the expanded view doesn't move as much.
final float relevantStackPosition = showVertically
@@ -2560,6 +2599,47 @@
mMainExecutor.executeDelayed(mDelayedAnimation, startDelay);
}
+ /**
+ * Animate expansion of overflow view when it is shown from the bubble shortcut.
+ * <p>
+ * Animates the view with a scale originating from the center of the view.
+ */
+ private void animateOverflowExpansion() {
+ PointF bubbleXY = mPositioner.getExpandedBubbleXY(0, getState());
+ final float translationY = mPositioner.getExpandedViewY(mExpandedBubble,
+ mPositioner.showBubblesVertically() ? bubbleXY.y : bubbleXY.x);
+ mExpandedViewContainer.setTranslationX(0f);
+ mExpandedViewContainer.setTranslationY(translationY);
+ mExpandedViewContainer.setAlpha(1f);
+
+ boolean stackOnLeft = mPositioner.isStackOnLeft(getStackPosition());
+ float width = mPositioner.getTaskViewContentWidth(stackOnLeft);
+ float height = mPositioner.getExpandedViewHeight(mExpandedBubble);
+ float scale = 1f - OPEN_OVERFLOW_ANIMATE_SCALE_AMOUNT;
+ // Scale from the center of the view
+ mExpandedViewContainerMatrix.setScale(scale, scale, width / 2f, height / 2f);
+ mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);
+ mExpandedViewAlphaAnimator.start();
+ PhysicsAnimator.getInstance(mExpandedViewContainerMatrix).cancel();
+ PhysicsAnimator.getInstance(mExpandedViewContainerMatrix)
+ .spring(AnimatableScaleMatrix.SCALE_X,
+ AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f),
+ mScaleInSpringConfig)
+ .spring(AnimatableScaleMatrix.SCALE_Y,
+ AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f),
+ mScaleInSpringConfig)
+ .addUpdateListener((target, values) -> {
+ mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);
+ }).withEndActions(() -> {
+ mExpandedViewContainer.setAnimationMatrix(null);
+ afterExpandedViewAnimation();
+ BubbleExpandedView expandedView = getExpandedView();
+ if (expandedView != null) {
+ expandedView.setSurfaceZOrderedOnTop(false);
+ }
+ }).start();
+ }
+
private void animateCollapse() {
cancelDelayedExpandCollapseSwitchAnimations();
ProtoLog.d(WM_SHELL_BUBBLES, "animateCollapse");
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/BubbleShortcutHelper.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/BubbleShortcutHelper.kt
new file mode 100644
index 0000000..efa1238
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/BubbleShortcutHelper.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.wm.shell.bubbles.shortcut
+
+import android.content.Context
+import android.content.pm.ShortcutInfo
+import android.graphics.drawable.Icon
+import com.android.wm.shell.R
+
+/** Helper class for creating a shortcut to open bubbles */
+object BubbleShortcutHelper {
+ const val SHORTCUT_ID = "bubbles_shortcut_id"
+ const val ACTION_SHOW_BUBBLES = "com.android.wm.shell.bubbles.action.SHOW_BUBBLES"
+
+ /** Create a shortcut that launches [ShowBubblesActivity] */
+ fun createShortcut(context: Context, icon: Icon): ShortcutInfo {
+ return ShortcutInfo.Builder(context, SHORTCUT_ID)
+ .setIntent(ShowBubblesActivity.createIntent(context))
+ .setActivity(ShowBubblesActivity.createComponent(context))
+ .setShortLabel(context.getString(R.string.bubble_shortcut_label))
+ .setLongLabel(context.getString(R.string.bubble_shortcut_long_label))
+ .setLongLived(true)
+ .setIcon(icon)
+ .build()
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/CreateBubbleShortcutActivity.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/CreateBubbleShortcutActivity.kt
new file mode 100644
index 0000000..a124f95
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/CreateBubbleShortcutActivity.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.bubbles.shortcut
+
+import android.app.Activity
+import android.content.pm.ShortcutManager
+import android.graphics.drawable.Icon
+import android.os.Bundle
+import com.android.wm.shell.Flags
+import com.android.wm.shell.R
+import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BUBBLES
+import com.android.wm.shell.util.KtProtoLog
+
+/** Activity to create a shortcut to open bubbles */
+class CreateBubbleShortcutActivity : Activity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ if (Flags.enableRetrievableBubbles()) {
+ KtProtoLog.d(WM_SHELL_BUBBLES, "Creating a shortcut for bubbles")
+ createShortcut()
+ }
+ finish()
+ }
+
+ private fun createShortcut() {
+ val icon = Icon.createWithResource(this, R.drawable.ic_bubbles_shortcut_widget)
+ // TODO(b/340337839): shortcut shows the sysui icon
+ val shortcutInfo = BubbleShortcutHelper.createShortcut(this, icon)
+ val shortcutManager = getSystemService(ShortcutManager::class.java)
+ val shortcutIntent = shortcutManager?.createShortcutResultIntent(shortcutInfo)
+ if (shortcutIntent != null) {
+ setResult(RESULT_OK, shortcutIntent)
+ } else {
+ setResult(RESULT_CANCELED)
+ }
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/ShowBubblesActivity.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/ShowBubblesActivity.kt
new file mode 100644
index 0000000..ae7940c
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/shortcut/ShowBubblesActivity.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.bubbles.shortcut
+
+import android.app.Activity
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import com.android.wm.shell.Flags
+import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BUBBLES
+import com.android.wm.shell.util.KtProtoLog
+
+/** Activity that sends a broadcast to open bubbles */
+class ShowBubblesActivity : Activity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ if (Flags.enableRetrievableBubbles()) {
+ val intent =
+ Intent().apply {
+ action = BubbleShortcutHelper.ACTION_SHOW_BUBBLES
+ // Set the package as the receiver is not exported
+ `package` = packageName
+ }
+ KtProtoLog.v(WM_SHELL_BUBBLES, "Sending broadcast to show bubbles")
+ sendBroadcast(intent)
+ }
+ finish()
+ }
+
+ companion object {
+ /** Create intent to launch this activity */
+ fun createIntent(context: Context): Intent {
+ return Intent(context, ShowBubblesActivity::class.java).apply {
+ action = BubbleShortcutHelper.ACTION_SHOW_BUBBLES
+ }
+ }
+
+ /** Create component for this activity */
+ fun createComponent(context: Context): ComponentName {
+ return ComponentName(context, ShowBubblesActivity::class.java)
+ }
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
index 0807f75..c5111d6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
@@ -155,6 +155,8 @@
visualIndicator = null
}
}
+ private val sysUIPackageName = context.resources.getString(
+ com.android.internal.R.string.config_systemUi)
private val transitionAreaHeight
get() =
@@ -214,6 +216,11 @@
return visualIndicator
}
+ // TODO(b/347289970): Consider replacing with API
+ private fun isSystemUIApplication(taskInfo: RunningTaskInfo): Boolean {
+ return taskInfo.baseActivity?.packageName == sysUIPackageName
+ }
+
fun setOnTaskResizeAnimationListener(listener: OnTaskResizeAnimationListener) {
toggleResizeDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener)
enterDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener)
@@ -349,6 +356,14 @@
)
return
}
+ if (isSystemUIApplication(task)) {
+ KtProtoLog.w(
+ WM_SHELL_DESKTOP_MODE,
+ "DesktopTasksController: Cannot enter desktop, " +
+ "systemUI top activity found."
+ )
+ return
+ }
KtProtoLog.v(
WM_SHELL_DESKTOP_MODE,
"DesktopTasksController: moveToDesktop taskId=%d",
@@ -896,7 +911,9 @@
when {
request.type == TRANSIT_TO_BACK -> handleBackNavigation(task)
// Check if the task has a top transparent activity
- shouldLaunchAsModal(task) -> handleTransparentTaskLaunch(task)
+ shouldLaunchAsModal(task) -> handleIncompatibleTaskLaunch(task)
+ // Check if the task has a top systemUI activity
+ isSystemUIApplication(task) -> handleIncompatibleTaskLaunch(task)
// Check if fullscreen task should be updated
task.isFullscreen -> handleFullscreenTaskLaunch(task, transition)
// Check if freeform task should be updated
@@ -930,6 +947,7 @@
.forEach { finishTransaction.setCornerRadius(it.leash, cornerRadius) }
}
+ // TODO(b/347289970): Consider replacing with API
private fun shouldLaunchAsModal(task: TaskInfo) =
Flags.enableDesktopWindowingModalsPolicy() && isSingleTopActivityTranslucent(task)
@@ -996,8 +1014,11 @@
return null
}
- // Always launch transparent tasks in fullscreen.
- private fun handleTransparentTaskLaunch(task: RunningTaskInfo): WindowContainerTransaction? {
+ /**
+ * If a task is not compatible with desktop mode freeform, it should always be launched in
+ * fullscreen.
+ */
+ private fun handleIncompatibleTaskLaunch(task: RunningTaskInfo): WindowContainerTransaction? {
// Already fullscreen, no-op.
if (task.isFullscreen) return null
return WindowContainerTransaction().also { wct -> addMoveToFullscreenChanges(wct, task) }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
index 299da13..9b27e41 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
@@ -133,7 +133,9 @@
*/
public void invalidate(Transitions transitions) {
transitions.unregisterObserver(this);
- // Unregister the listener to ensure any registered binder death recipients are unlinked
- mListener.unregister();
+ if (mListener != null) {
+ // Unregister the listener to ensure any registered binder death recipients are unlinked
+ mListener.unregister();
+ }
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
index eeb3662..21b6db2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
@@ -103,6 +103,7 @@
import com.android.wm.shell.windowdecor.extension.TaskInfoKt;
import java.io.PrintWriter;
+import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;
@@ -152,6 +153,7 @@
private final DisplayInsetsController mDisplayInsetsController;
private final Region mExclusionRegion = Region.obtain();
private boolean mInImmersiveMode;
+ private final String mSysUIPackageName;
private final ISystemGestureExclusionListener mGestureExclusionListener =
new ISystemGestureExclusionListener.Stub() {
@@ -247,6 +249,8 @@
mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer;
mInputManager = mContext.getSystemService(InputManager.class);
mWindowDecorByTaskId = windowDecorByTaskId;
+ mSysUIPackageName = mContext.getResources().getString(
+ com.android.internal.R.string.config_systemUi);
shellInit.addInitCallback(this::onInit, this);
}
@@ -1035,10 +1039,14 @@
&& taskInfo.isFocused) {
return false;
}
+ // TODO(b/347289970): Consider replacing with API
if (Flags.enableDesktopWindowingModalsPolicy()
&& isSingleTopActivityTranslucent(taskInfo)) {
return false;
}
+ if (isSystemUIApplication(taskInfo)) {
+ return false;
+ }
return DesktopModeStatus.canEnterDesktopMode(mContext)
&& !DesktopWallpaperActivity.isWallpaperTask(taskInfo)
&& taskInfo.getWindowingMode() != WINDOWING_MODE_PINNED
@@ -1109,6 +1117,14 @@
&& mSplitScreenController.isTaskInSplitScreen(taskId);
}
+ // TODO(b/347289970): Consider replacing with API
+ private boolean isSystemUIApplication(RunningTaskInfo taskInfo) {
+ if (taskInfo.baseActivity != null) {
+ return (Objects.equals(taskInfo.baseActivity.getPackageName(), mSysUIPackageName));
+ }
+ return false;
+ }
+
private void dump(PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " ";
pw.println(prefix + "DesktopModeWindowDecorViewModel");
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
index c903d3b..0470367 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
@@ -19,17 +19,28 @@
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
+import android.annotation.ColorInt
import android.annotation.IdRes
import android.app.ActivityManager.RunningTaskInfo
import android.content.Context
+import android.content.res.ColorStateList
import android.content.res.Resources
+import android.graphics.Paint
import android.graphics.PixelFormat
import android.graphics.PointF
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.GradientDrawable
+import android.graphics.drawable.LayerDrawable
+import android.graphics.drawable.ShapeDrawable
+import android.graphics.drawable.StateListDrawable
+import android.graphics.drawable.shapes.RoundRectShape
+import android.util.StateSet
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.SurfaceControl
import android.view.SurfaceControl.Transaction
import android.view.SurfaceControlViewHost
+import android.view.View
import android.view.View.OnClickListener
import android.view.View.OnGenericMotionListener
import android.view.View.OnTouchListener
@@ -39,18 +50,21 @@
import android.view.WindowManager
import android.view.WindowlessWindowManager
import android.widget.Button
-import android.widget.FrameLayout
-import android.widget.LinearLayout
import android.widget.TextView
import android.window.TaskConstants
-import androidx.core.content.withStyledAttributes
-import com.android.internal.R.attr.colorAccentPrimary
+import androidx.compose.material3.ColorScheme
+import androidx.compose.ui.graphics.toArgb
+import androidx.core.animation.addListener
import com.android.wm.shell.R
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.animation.Interpolators.EMPHASIZED_DECELERATE
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.SyncTransactionQueue
import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer
+import com.android.wm.shell.windowdecor.common.DecorThemeUtil
+import com.android.wm.shell.windowdecor.common.OPACITY_12
+import com.android.wm.shell.windowdecor.common.OPACITY_40
+import com.android.wm.shell.windowdecor.common.withAlpha
import java.util.function.Supplier
@@ -71,9 +85,9 @@
private val transactionSupplier: Supplier<Transaction> = Supplier { Transaction() }
) {
private var maximizeMenu: AdditionalViewHostViewContainer? = null
+ private var maximizeMenuView: MaximizeMenuView? = null
private lateinit var viewHost: SurfaceControlViewHost
private lateinit var leash: SurfaceControl
- private val openMenuAnimatorSet = AnimatorSet()
private val cornerRadius = loadDimensionPixelSize(
R.dimen.desktop_mode_maximize_menu_corner_radius
).toFloat()
@@ -81,12 +95,6 @@
private val menuHeight = loadDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_height)
private val menuPadding = loadDimensionPixelSize(R.dimen.desktop_mode_menu_padding)
- private lateinit var snapRightButton: Button
- private lateinit var snapLeftButton: Button
- private lateinit var maximizeButton: Button
- private lateinit var maximizeButtonLayout: FrameLayout
- private lateinit var snapButtonsLayout: LinearLayout
-
/** Position the menu relative to the caption's position. */
fun positionMenu(position: PointF, t: Transaction) {
menuPosition.set(position)
@@ -97,24 +105,20 @@
fun show() {
if (maximizeMenu != null) return
createMaximizeMenu()
- setupMaximizeMenu()
- animateOpenMenu()
+ maximizeMenuView?.animateOpenMenu()
}
/** Closes the maximize window and releases its view. */
fun close() {
- openMenuAnimatorSet.cancel()
+ maximizeMenuView?.cancelAnimation()
maximizeMenu?.releaseView()
maximizeMenu = null
+ maximizeMenuView = null
}
/** Create a maximize menu that is attached to the display area. */
private fun createMaximizeMenu() {
val t = transactionSupplier.get()
- val v = LayoutInflater.from(decorWindowContext).inflate(
- R.layout.desktop_mode_window_decor_maximize_menu,
- null // Root
- )
val builder = SurfaceControl.Builder()
rootTdaOrganizer.attachToDisplayArea(taskInfo.displayId, builder)
leash = builder
@@ -138,7 +142,17 @@
viewHost = SurfaceControlViewHost(decorWindowContext,
displayController.getDisplay(taskInfo.displayId), windowManager,
"MaximizeMenu")
- viewHost.setView(v, lp)
+ maximizeMenuView = MaximizeMenuView(
+ context = decorWindowContext,
+ menuHeight = menuHeight,
+ menuPadding = menuPadding,
+ onClickListener = onClickListener,
+ onTouchListener = onTouchListener,
+ onGenericMotionListener = onGenericMotionListener,
+ ).also { menuView ->
+ menuView.bind(taskInfo)
+ viewHost.setView(menuView.rootView, lp)
+ }
// Bring menu to front when open
t.setLayer(leash, TaskConstants.TASK_CHILD_LAYER_FLOATING_MENU)
@@ -154,76 +168,6 @@
}
}
- private fun animateOpenMenu() {
- val maximizeMenuView = maximizeMenu?.view ?: return
- val maximizeWindowText = maximizeMenuView.requireViewById<TextView>(
- R.id.maximize_menu_maximize_window_text)
- val snapWindowText = maximizeMenuView.requireViewById<TextView>(
- R.id.maximize_menu_snap_window_text)
-
- openMenuAnimatorSet.playTogether(
- ObjectAnimator.ofFloat(maximizeMenuView, SCALE_Y, STARTING_MENU_HEIGHT_SCALE, 1f)
- .apply {
- duration = MENU_HEIGHT_ANIMATION_DURATION_MS
- interpolator = EMPHASIZED_DECELERATE
- },
- ValueAnimator.ofFloat(STARTING_MENU_HEIGHT_SCALE, 1f)
- .apply {
- duration = MENU_HEIGHT_ANIMATION_DURATION_MS
- interpolator = EMPHASIZED_DECELERATE
- addUpdateListener {
- // Animate padding so that controls stay pinned to the bottom of
- // the menu.
- val value = animatedValue as Float
- val topPadding = menuPadding -
- ((1 - value) * menuHeight).toInt()
- maximizeMenuView.setPadding(menuPadding, topPadding,
- menuPadding, menuPadding)
- }
- },
- ValueAnimator.ofFloat(1 / STARTING_MENU_HEIGHT_SCALE, 1f).apply {
- duration = MENU_HEIGHT_ANIMATION_DURATION_MS
- interpolator = EMPHASIZED_DECELERATE
- addUpdateListener {
- // Scale up the children of the maximize menu so that the menu
- // scale is cancelled out and only the background is scaled.
- val value = animatedValue as Float
- maximizeButtonLayout.scaleY = value
- snapButtonsLayout.scaleY = value
- maximizeWindowText.scaleY = value
- snapWindowText.scaleY = value
- }
- },
- ObjectAnimator.ofFloat(maximizeMenuView, TRANSLATION_Y,
- (STARTING_MENU_HEIGHT_SCALE - 1) * menuHeight, 0f).apply {
- duration = MENU_HEIGHT_ANIMATION_DURATION_MS
- interpolator = EMPHASIZED_DECELERATE
- },
- ObjectAnimator.ofInt(maximizeMenuView.background, "alpha",
- MAX_DRAWABLE_ALPHA_VALUE).apply {
- duration = ALPHA_ANIMATION_DURATION_MS
- },
- ValueAnimator.ofFloat(0f, 1f)
- .apply {
- duration = ALPHA_ANIMATION_DURATION_MS
- startDelay = CONTROLS_ALPHA_ANIMATION_DELAY_MS
- addUpdateListener {
- val value = animatedValue as Float
- maximizeButtonLayout.alpha = value
- snapButtonsLayout.alpha = value
- maximizeWindowText.alpha = value
- snapWindowText.alpha = value
- }
- },
- ObjectAnimator.ofFloat(maximizeMenuView, TRANSLATION_Z, MENU_Z_TRANSLATION)
- .apply {
- duration = ELEVATION_ANIMATION_DURATION_MS
- startDelay = CONTROLS_ALPHA_ANIMATION_DELAY_MS
- }
- )
- openMenuAnimatorSet.start()
- }
-
private fun loadDimensionPixelSize(resourceId: Int): Int {
return if (resourceId == Resources.ID_NULL) {
0
@@ -232,31 +176,6 @@
}
}
- private fun setupMaximizeMenu() {
- val maximizeMenuView = maximizeMenu?.view ?: return
-
- maximizeMenuView.setOnGenericMotionListener(onGenericMotionListener)
- maximizeMenuView.setOnTouchListener(onTouchListener)
-
- maximizeButtonLayout = maximizeMenuView.requireViewById(
- R.id.maximize_menu_maximize_button_layout)
-
- maximizeButton = maximizeMenuView.requireViewById(R.id.maximize_menu_maximize_button)
- maximizeButton.setOnClickListener(onClickListener)
- maximizeButton.setOnGenericMotionListener(onGenericMotionListener)
-
- snapRightButton = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_right_button)
- snapRightButton.setOnClickListener(onClickListener)
- snapRightButton.setOnGenericMotionListener(onGenericMotionListener)
-
- snapLeftButton = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_left_button)
- snapLeftButton.setOnClickListener(onClickListener)
- snapLeftButton.setOnGenericMotionListener(onGenericMotionListener)
-
- snapButtonsLayout = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_menu_layout)
- snapButtonsLayout.setOnGenericMotionListener(onGenericMotionListener)
- }
-
/**
* A valid menu input is one of the following:
* An input that happens in the menu views.
@@ -278,65 +197,435 @@
return maximizeMenu?.view?.isLaidOut ?: false
}
+ /**
+ * Called when a [MotionEvent.ACTION_HOVER_ENTER] is triggered on any of the menu's views.
+ *
+ * TODO(b/346440693): this is only needed for the left/right snap options that don't support
+ * selector states to manage its hover state. Look into whether that can be added to avoid
+ * manually tracking hover enter/exit motion events. Also because those button colors/states
+ * aren't updating correctly for pressed, focused and selected states.
+ * See also [onMaximizeMenuHoverMove] and [onMaximizeMenuHoverExit].
+ */
fun onMaximizeMenuHoverEnter(viewId: Int, ev: MotionEvent) {
setSnapButtonsColorOnHover(viewId, ev)
}
+ /** Called when a [MotionEvent.ACTION_HOVER_MOVE] is triggered on any of the menu's views. */
fun onMaximizeMenuHoverMove(viewId: Int, ev: MotionEvent) {
setSnapButtonsColorOnHover(viewId, ev)
}
+ /** Called when a [MotionEvent.ACTION_HOVER_EXIT] is triggered on any of the menu's views. */
fun onMaximizeMenuHoverExit(id: Int, ev: MotionEvent) {
- val inSnapMenuBounds = ev.x >= 0 && ev.x <= snapButtonsLayout.width &&
- ev.y >= 0 && ev.y <= snapButtonsLayout.height
- val colorList = decorWindowContext.getColorStateList(
- R.color.desktop_mode_maximize_menu_button_color_selector)
+ val snapOptionsWidth = maximizeMenuView?.snapOptionsWidth ?: return
+ val snapOptionsHeight = maximizeMenuView?.snapOptionsHeight ?: return
+ val inSnapMenuBounds = ev.x >= 0 && ev.x <= snapOptionsWidth &&
+ ev.y >= 0 && ev.y <= snapOptionsHeight
- if (id == R.id.maximize_menu_maximize_button) {
- maximizeButton.background?.setTintList(colorList)
- maximizeButtonLayout.setBackgroundResource(
- R.drawable.desktop_mode_maximize_menu_layout_background)
- } else if (id == R.id.maximize_menu_snap_menu_layout && !inSnapMenuBounds) {
+ if (id == R.id.maximize_menu_snap_menu_layout && !inSnapMenuBounds) {
// After exiting the snap menu layout area, checks to see that user is not still
// hovering within the snap menu layout bounds which would indicate that the user is
// hovering over a snap button within the snap menu layout rather than having exited.
- snapLeftButton.background?.setTintList(colorList)
- snapLeftButton.background?.alpha = 255
- snapRightButton.background?.setTintList(colorList)
- snapRightButton.background?.alpha = 255
- snapButtonsLayout.setBackgroundResource(
- R.drawable.desktop_mode_maximize_menu_layout_background)
+ maximizeMenuView?.updateSplitSnapSelection(MaximizeMenuView.SnapToHalfSelection.NONE)
}
}
private fun setSnapButtonsColorOnHover(viewId: Int, ev: MotionEvent) {
- decorWindowContext.withStyledAttributes(null, intArrayOf(colorAccentPrimary), 0, 0) {
- val materialColor = getColor(0, 0)
- val snapMenuCenter = snapButtonsLayout.width / 2
- if (viewId == R.id.maximize_menu_maximize_button) {
- // Highlight snap maximize window button
- maximizeButton.background?.setTint(materialColor)
- maximizeButtonLayout.setBackgroundResource(
- R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
- } else if (viewId == R.id.maximize_menu_snap_left_button ||
- (viewId == R.id.maximize_menu_snap_menu_layout && ev.x <= snapMenuCenter)) {
- // Highlight snap left button
- snapRightButton.background?.setTint(materialColor)
- snapLeftButton.background?.setTint(materialColor)
- snapButtonsLayout.setBackgroundResource(
- R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
- snapRightButton.background?.alpha = 102
- snapLeftButton.background?.alpha = 255
- } else if (viewId == R.id.maximize_menu_snap_right_button ||
- (viewId == R.id.maximize_menu_snap_menu_layout && ev.x > snapMenuCenter)) {
- // Highlight snap right button
- snapRightButton.background?.setTint(materialColor)
- snapLeftButton.background?.setTint(materialColor)
- snapButtonsLayout.setBackgroundResource(
- R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
- snapRightButton.background?.alpha = 255
- snapLeftButton.background?.alpha = 102
+ val snapOptionsWidth = maximizeMenuView?.snapOptionsWidth ?: return
+ val snapMenuCenter = snapOptionsWidth / 2
+ when {
+ viewId == R.id.maximize_menu_snap_left_button ||
+ (viewId == R.id.maximize_menu_snap_menu_layout && ev.x <= snapMenuCenter) -> {
+ maximizeMenuView
+ ?.updateSplitSnapSelection(MaximizeMenuView.SnapToHalfSelection.LEFT)
}
+ viewId == R.id.maximize_menu_snap_right_button ||
+ (viewId == R.id.maximize_menu_snap_menu_layout && ev.x > snapMenuCenter) -> {
+ maximizeMenuView
+ ?.updateSplitSnapSelection(MaximizeMenuView.SnapToHalfSelection.RIGHT)
+ }
+ }
+ }
+
+ /**
+ * The view within the Maximize Menu, presents maximize, restore and snap-to-side options for
+ * resizing a Task.
+ */
+ class MaximizeMenuView(
+ context: Context,
+ private val menuHeight: Int,
+ private val menuPadding: Int,
+ onClickListener: OnClickListener,
+ onTouchListener: OnTouchListener,
+ onGenericMotionListener: OnGenericMotionListener,
+ ) {
+ val rootView: View = LayoutInflater.from(context)
+ .inflate(R.layout.desktop_mode_window_decor_maximize_menu, null /* root */)
+ private val maximizeText =
+ requireViewById(R.id.maximize_menu_maximize_window_text) as TextView
+ private val maximizeButton =
+ requireViewById(R.id.maximize_menu_maximize_button) as Button
+ private val snapWindowText =
+ requireViewById(R.id.maximize_menu_snap_window_text) as TextView
+ private val snapRightButton =
+ requireViewById(R.id.maximize_menu_snap_right_button) as Button
+ private val snapLeftButton =
+ requireViewById(R.id.maximize_menu_snap_left_button) as Button
+ private val snapButtonsLayout =
+ requireViewById(R.id.maximize_menu_snap_menu_layout)
+
+ private val decorThemeUtil = DecorThemeUtil(context)
+
+ private val outlineRadius = context.resources
+ .getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_outline_radius)
+ private val outlineStroke = context.resources
+ .getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_outline_stroke)
+ private val fillPadding = context.resources
+ .getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_fill_padding)
+ private val fillRadius = context.resources
+ .getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_fill_radius)
+
+ private val openMenuAnimatorSet = AnimatorSet()
+ private lateinit var taskInfo: RunningTaskInfo
+ private lateinit var style: MenuStyle
+
+ /** The width of the snap menu option view, including both left and right snaps. */
+ val snapOptionsWidth: Int
+ get() = snapButtonsLayout.width
+ /** The height of the snap menu option view, including both left and right snaps .*/
+ val snapOptionsHeight: Int
+ get() = snapButtonsLayout.height
+
+ init {
+ // TODO(b/346441962): encapsulate menu hover enter/exit logic inside this class and
+ // expose only what is actually relevant to outside classes so that specific checks
+ // against resource IDs aren't needed outside this class.
+ rootView.setOnGenericMotionListener(onGenericMotionListener)
+ rootView.setOnTouchListener(onTouchListener)
+ maximizeButton.setOnClickListener(onClickListener)
+ maximizeButton.setOnGenericMotionListener(onGenericMotionListener)
+ snapRightButton.setOnClickListener(onClickListener)
+ snapRightButton.setOnGenericMotionListener(onGenericMotionListener)
+ snapLeftButton.setOnClickListener(onClickListener)
+ snapLeftButton.setOnGenericMotionListener(onGenericMotionListener)
+ snapButtonsLayout.setOnGenericMotionListener(onGenericMotionListener)
+
+ // To prevent aliasing.
+ maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ }
+
+ /** Bind the menu views to the new [RunningTaskInfo] data. */
+ fun bind(taskInfo: RunningTaskInfo) {
+ this.taskInfo = taskInfo
+ this.style = calculateMenuStyle(taskInfo)
+
+ rootView.background.setTint(style.backgroundColor)
+
+ // Maximize option.
+ maximizeButton.background = style.maximizeOption.drawable
+ maximizeText.setTextColor(style.textColor)
+
+ // Snap options.
+ snapWindowText.setTextColor(style.textColor)
+ updateSplitSnapSelection(SnapToHalfSelection.NONE)
+ }
+
+ /** Animate the opening of the menu */
+ fun animateOpenMenu() {
+ maximizeButton.setLayerType(View.LAYER_TYPE_HARDWARE, null)
+ maximizeText.setLayerType(View.LAYER_TYPE_HARDWARE, null)
+ openMenuAnimatorSet.playTogether(
+ ObjectAnimator.ofFloat(rootView, SCALE_Y, STARTING_MENU_HEIGHT_SCALE, 1f)
+ .apply {
+ duration = MENU_HEIGHT_ANIMATION_DURATION_MS
+ interpolator = EMPHASIZED_DECELERATE
+ },
+ ValueAnimator.ofFloat(STARTING_MENU_HEIGHT_SCALE, 1f)
+ .apply {
+ duration = MENU_HEIGHT_ANIMATION_DURATION_MS
+ interpolator = EMPHASIZED_DECELERATE
+ addUpdateListener {
+ // Animate padding so that controls stay pinned to the bottom of
+ // the menu.
+ val value = animatedValue as Float
+ val topPadding = menuPadding -
+ ((1 - value) * menuHeight).toInt()
+ rootView.setPadding(menuPadding, topPadding,
+ menuPadding, menuPadding)
+ }
+ },
+ ValueAnimator.ofFloat(1 / STARTING_MENU_HEIGHT_SCALE, 1f).apply {
+ duration = MENU_HEIGHT_ANIMATION_DURATION_MS
+ interpolator = EMPHASIZED_DECELERATE
+ addUpdateListener {
+ // Scale up the children of the maximize menu so that the menu
+ // scale is cancelled out and only the background is scaled.
+ val value = animatedValue as Float
+ maximizeButton.scaleY = value
+ snapButtonsLayout.scaleY = value
+ maximizeText.scaleY = value
+ snapWindowText.scaleY = value
+ }
+ },
+ ObjectAnimator.ofFloat(rootView, TRANSLATION_Y,
+ (STARTING_MENU_HEIGHT_SCALE - 1) * menuHeight, 0f).apply {
+ duration = MENU_HEIGHT_ANIMATION_DURATION_MS
+ interpolator = EMPHASIZED_DECELERATE
+ },
+ ObjectAnimator.ofInt(rootView.background, "alpha",
+ MAX_DRAWABLE_ALPHA_VALUE).apply {
+ duration = ALPHA_ANIMATION_DURATION_MS
+ },
+ ValueAnimator.ofFloat(0f, 1f)
+ .apply {
+ duration = ALPHA_ANIMATION_DURATION_MS
+ startDelay = CONTROLS_ALPHA_ANIMATION_DELAY_MS
+ addUpdateListener {
+ val value = animatedValue as Float
+ maximizeButton.alpha = value
+ snapButtonsLayout.alpha = value
+ maximizeText.alpha = value
+ snapWindowText.alpha = value
+ }
+ },
+ ObjectAnimator.ofFloat(rootView, TRANSLATION_Z, MENU_Z_TRANSLATION)
+ .apply {
+ duration = ELEVATION_ANIMATION_DURATION_MS
+ startDelay = CONTROLS_ALPHA_ANIMATION_DELAY_MS
+ }
+ )
+ openMenuAnimatorSet.addListener(
+ onEnd = {
+ maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ }
+ )
+ openMenuAnimatorSet.start()
+ }
+
+ /** Cancel the open menu animation. */
+ fun cancelAnimation() {
+ openMenuAnimatorSet.cancel()
+ }
+
+ /** Update the view state to a new snap to half selection. */
+ fun updateSplitSnapSelection(selection: SnapToHalfSelection) {
+ when (selection) {
+ SnapToHalfSelection.NONE -> deactivateSnapOptions()
+ SnapToHalfSelection.LEFT -> activateSnapOption(activateLeft = true)
+ SnapToHalfSelection.RIGHT -> activateSnapOption(activateLeft = false)
+ }
+ }
+
+ private fun calculateMenuStyle(taskInfo: RunningTaskInfo): MenuStyle {
+ val colorScheme = decorThemeUtil.getColorScheme(taskInfo)
+ val menuBackgroundColor = colorScheme.surfaceContainerLow.toArgb()
+ return MenuStyle(
+ backgroundColor = menuBackgroundColor,
+ textColor = colorScheme.onSurface.toArgb(),
+ maximizeOption = MenuStyle.MaximizeOption(
+ drawable = createMaximizeDrawable(menuBackgroundColor, colorScheme)
+ ),
+ snapOptions = MenuStyle.SnapOptions(
+ inactiveSnapSideColor = colorScheme.outlineVariant.toArgb(),
+ semiActiveSnapSideColor = colorScheme.primary.toArgb().withAlpha(OPACITY_40),
+ activeSnapSideColor = colorScheme.primary.toArgb(),
+ inactiveStrokeColor = colorScheme.outlineVariant.toArgb(),
+ activeStrokeColor = colorScheme.primary.toArgb(),
+ inactiveBackgroundColor = menuBackgroundColor,
+ activeBackgroundColor = colorScheme.primary.toArgb().withAlpha(OPACITY_12)
+ ),
+ )
+ }
+
+ private fun deactivateSnapOptions() {
+ // TODO(b/346440693): the background/colorStateList set on these buttons is overridden
+ // to a static resource & color on manually tracked hover events, which defeats the
+ // point of state lists and selector states. Look into whether changing that is
+ // possible, similar to the maximize option. Also to include support for the
+ // semi-active state (when the "other" snap option is selected).
+ val snapSideColorList = ColorStateList(
+ arrayOf(
+ intArrayOf(android.R.attr.state_pressed),
+ intArrayOf(android.R.attr.state_focused),
+ intArrayOf(android.R.attr.state_selected),
+ intArrayOf(),
+ ),
+ intArrayOf(
+ style.snapOptions.activeSnapSideColor,
+ style.snapOptions.activeSnapSideColor,
+ style.snapOptions.activeSnapSideColor,
+ style.snapOptions.inactiveSnapSideColor
+ )
+ )
+ snapLeftButton.background?.setTintList(snapSideColorList)
+ snapRightButton.background?.setTintList(snapSideColorList)
+ with (snapButtonsLayout) {
+ setBackgroundResource(R.drawable.desktop_mode_maximize_menu_layout_background)
+ (background as GradientDrawable).apply {
+ setColor(style.snapOptions.inactiveBackgroundColor)
+ setStroke(outlineStroke, style.snapOptions.inactiveStrokeColor)
+ }
+ }
+ }
+
+ private fun activateSnapOption(activateLeft: Boolean) {
+ // Regardless of which side is active, the background of the snap options layout (that
+ // includes both sides) is considered "active".
+ with (snapButtonsLayout) {
+ setBackgroundResource(
+ R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
+ (background as GradientDrawable).apply {
+ setColor(style.snapOptions.activeBackgroundColor)
+ setStroke(outlineStroke, style.snapOptions.activeStrokeColor)
+ }
+ }
+ if (activateLeft) {
+ // Highlight snap left button, partially highlight the other side.
+ snapLeftButton.background.setTint(style.snapOptions.activeSnapSideColor)
+ snapRightButton.background.setTint(style.snapOptions.semiActiveSnapSideColor)
+ } else {
+ // Highlight snap right button, partially highlight the other side.
+ snapRightButton.background.setTint(style.snapOptions.activeSnapSideColor)
+ snapLeftButton.background.setTint(style.snapOptions.semiActiveSnapSideColor)
+ }
+ }
+
+ private fun createMaximizeDrawable(
+ @ColorInt menuBackgroundColor: Int,
+ colorScheme: ColorScheme
+ ): StateListDrawable {
+ val activeStrokeAndFill = colorScheme.primary.toArgb()
+ val activeBackground = colorScheme.primary.toArgb().withAlpha(OPACITY_12)
+ val activeDrawable = createMaximizeButtonDrawable(
+ strokeAndFillColor = activeStrokeAndFill,
+ backgroundColor = activeBackground,
+ // Add a mask with the menu background's color because the active background color is
+ // semi transparent, otherwise the transparency will reveal the stroke/fill color
+ // behind it.
+ backgroundMask = menuBackgroundColor
+ )
+ return StateListDrawable().apply {
+ addState(intArrayOf(android.R.attr.state_pressed), activeDrawable)
+ addState(intArrayOf(android.R.attr.state_focused), activeDrawable)
+ addState(intArrayOf(android.R.attr.state_selected), activeDrawable)
+ addState(intArrayOf(android.R.attr.state_hovered), activeDrawable)
+ // Inactive drawable.
+ addState(
+ StateSet.WILD_CARD,
+ createMaximizeButtonDrawable(
+ strokeAndFillColor = colorScheme.outlineVariant.toArgb(),
+ backgroundColor = colorScheme.surfaceContainerLow.toArgb(),
+ backgroundMask = null // not needed because the bg color is fully opaque
+ )
+ )
+ }
+ }
+
+ private fun createMaximizeButtonDrawable(
+ @ColorInt strokeAndFillColor: Int,
+ @ColorInt backgroundColor: Int,
+ @ColorInt backgroundMask: Int?
+ ): LayerDrawable {
+ val layers = mutableListOf<Drawable>()
+ // First (bottom) layer, effectively the button's border ring once its inner shape is
+ // covered by the next layers.
+ layers.add(ShapeDrawable().apply {
+ shape = RoundRectShape(
+ FloatArray(8) { outlineRadius.toFloat() },
+ null /* inset */,
+ null /* innerRadii */
+ )
+ paint.color = strokeAndFillColor
+ paint.style = Paint.Style.FILL
+ })
+ // Second layer, a mask for the next (background) layer if needed because of
+ // transparency.
+ backgroundMask?.let { color ->
+ layers.add(
+ ShapeDrawable().apply {
+ shape = RoundRectShape(
+ FloatArray(8) { outlineRadius.toFloat() },
+ null /* inset */,
+ null /* innerRadii */
+ )
+ paint.color = color
+ paint.style = Paint.Style.FILL
+ }
+ )
+ }
+ // Third layer, the "background" padding between the border and the fill.
+ layers.add(ShapeDrawable().apply {
+ shape = RoundRectShape(
+ FloatArray(8) { outlineRadius.toFloat() },
+ null /* inset */,
+ null /* innerRadii */
+ )
+ paint.color = backgroundColor
+ paint.style = Paint.Style.FILL
+ })
+ // Final layer, the inner most rounded-rect "fill".
+ layers.add(ShapeDrawable().apply {
+ shape = RoundRectShape(
+ FloatArray(8) { fillRadius.toFloat() },
+ null /* inset */,
+ null /* innerRadii */
+ )
+ paint.color = strokeAndFillColor
+ paint.style = Paint.Style.FILL
+ })
+ return LayerDrawable(layers.toTypedArray()).apply {
+ when (numberOfLayers) {
+ 3 -> {
+ setLayerInset(1, outlineStroke)
+ setLayerInset(2, fillPadding)
+ }
+ 4 -> {
+ setLayerInset(intArrayOf(1, 2), outlineStroke)
+ setLayerInset(3, fillPadding)
+ }
+ else -> error("Unexpected number of layers: $numberOfLayers")
+ }
+ }
+ }
+
+ private fun LayerDrawable.setLayerInset(index: IntArray, inset: Int) {
+ for (i in index) {
+ setLayerInset(i, inset, inset, inset, inset)
+ }
+ }
+
+ private fun LayerDrawable.setLayerInset(index: Int, inset: Int) {
+ setLayerInset(index, inset, inset, inset, inset)
+ }
+
+ private fun requireViewById(id: Int) = rootView.requireViewById<View>(id)
+
+ /** The style to apply to the menu. */
+ data class MenuStyle(
+ @ColorInt val backgroundColor: Int,
+ @ColorInt val textColor: Int,
+ val maximizeOption: MaximizeOption,
+ val snapOptions: SnapOptions,
+ ) {
+ data class MaximizeOption(
+ val drawable: StateListDrawable,
+ )
+ data class SnapOptions(
+ @ColorInt val inactiveSnapSideColor: Int,
+ @ColorInt val semiActiveSnapSideColor: Int,
+ @ColorInt val activeSnapSideColor: Int,
+ @ColorInt val inactiveStrokeColor: Int,
+ @ColorInt val activeStrokeColor: Int,
+ @ColorInt val inactiveBackgroundColor: Int,
+ @ColorInt val activeBackgroundColor: Int,
+ )
+ }
+
+ /** The possible selection states of the half-snap menu option. */
+ enum class SnapToHalfSelection {
+ NONE, LEFT, RIGHT
}
}
@@ -352,7 +641,6 @@
fun isMaximizeMenuView(@IdRes viewId: Int): Boolean {
return viewId == R.id.maximize_menu ||
viewId == R.id.maximize_menu_maximize_button ||
- viewId == R.id.maximize_menu_maximize_button_layout ||
viewId == R.id.maximize_menu_snap_left_button ||
viewId == R.id.maximize_menu_snap_right_button ||
viewId == R.id.maximize_menu_snap_menu_layout ||
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/ThemeUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/ThemeUtils.kt
index 8e6d1ee9..f7cfbfa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/ThemeUtils.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/ThemeUtils.kt
@@ -15,11 +15,16 @@
*/
package com.android.wm.shell.windowdecor.common
+import android.annotation.ColorInt
+import android.annotation.IntRange
import android.app.ActivityManager.RunningTaskInfo
import android.content.Context
import android.content.res.Configuration
import android.content.res.Configuration.UI_MODE_NIGHT_MASK
import android.graphics.Color
+import androidx.compose.material3.ColorScheme
+import androidx.compose.material3.dynamicDarkColorScheme
+import androidx.compose.material3.dynamicLightColorScheme
/** The theme of a window decoration. */
internal enum class Theme { LIGHT, DARK }
@@ -30,10 +35,31 @@
/** Whether a [Theme] is dark. */
internal fun Theme.isDark(): Boolean = this == Theme.DARK
+/** Returns a copy of the color with its [alpha] component replaced with the given value. */
+@ColorInt
+internal fun @receiver:ColorInt Int.withAlpha(@IntRange(from = 0, to = 255) alpha: Int): Int =
+ Color.argb(
+ alpha,
+ Color.red(this),
+ Color.green(this),
+ Color.blue(this)
+ )
+
+/** Common opacity values used in window decoration views. */
+const val OPACITY_100 = 255
+const val OPACITY_11 = 28
+const val OPACITY_12 = 31
+const val OPACITY_15 = 38
+const val OPACITY_40 = 102
+const val OPACITY_55 = 140
+const val OPACITY_65 = 166
+
/**
* Utility class for determining themes based on system settings and app's [RunningTaskInfo].
*/
internal class DecorThemeUtil(private val context: Context) {
+ private val lightColors = dynamicLightColorScheme(context)
+ private val darkColors = dynamicDarkColorScheme(context)
private val systemTheme: Theme
get() = if ((context.resources.configuration.uiMode and UI_MODE_NIGHT_MASK) ==
@@ -56,4 +82,13 @@
Theme.LIGHT
}
}
+
+ /**
+ * Returns the [ColorScheme] to use to style window decorations based on the given
+ * [RunningTaskInfo].
+ */
+ fun getColorScheme(task: RunningTaskInfo): ColorScheme = when (getAppTheme(task)) {
+ Theme.LIGHT -> lightColors
+ Theme.DARK -> darkColors
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
index 0650154..46127b1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
@@ -45,6 +45,11 @@
import com.android.wm.shell.R
import com.android.wm.shell.windowdecor.MaximizeButtonView
import com.android.wm.shell.windowdecor.common.DecorThemeUtil
+import com.android.wm.shell.windowdecor.common.OPACITY_100
+import com.android.wm.shell.windowdecor.common.OPACITY_11
+import com.android.wm.shell.windowdecor.common.OPACITY_15
+import com.android.wm.shell.windowdecor.common.OPACITY_55
+import com.android.wm.shell.windowdecor.common.OPACITY_65
import com.android.wm.shell.windowdecor.common.Theme
import com.android.wm.shell.windowdecor.extension.isLightCaptionBarAppearance
import com.android.wm.shell.windowdecor.extension.isTransparentCaptionBarAppearance
@@ -491,11 +496,5 @@
private const val DARK_THEME_UNFOCUSED_OPACITY = 140 // 55%
private const val LIGHT_THEME_UNFOCUSED_OPACITY = 166 // 65%
private const val FOCUSED_OPACITY = 255
-
- private const val OPACITY_100 = 255
- private const val OPACITY_11 = 28
- private const val OPACITY_15 = 38
- private const val OPACITY_55 = 140
- private const val OPACITY_65 = 166
}
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java
index bd20c11..731f75bf 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java
@@ -20,9 +20,11 @@
import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY;
import static android.window.TransitionInfo.FLAG_IS_BEHIND_STARTING_WINDOW;
+import static com.android.wm.shell.activityembedding.ActivityEmbeddingAnimationRunner.calculateParentBounds;
import static com.android.wm.shell.transition.Transitions.TRANSIT_TASK_FRAGMENT_DRAG_RESIZE;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
@@ -32,6 +34,9 @@
import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.animation.Animator;
+import android.annotation.NonNull;
+import android.graphics.Point;
+import android.graphics.Rect;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
@@ -130,7 +135,7 @@
@Test
public void testInvalidCustomAnimation_disableAnimationOptionsPerChange() {
final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
- .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY))
+ .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY, TRANSIT_OPEN))
.build();
info.setAnimationOptions(TransitionInfo.AnimationOptions
.makeCustomAnimOptions("packageName", 0 /* enterResId */, 0 /* exitResId */,
@@ -148,7 +153,7 @@
@Test
public void testInvalidCustomAnimation_enableAnimationOptionsPerChange() {
final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
- .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY))
+ .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY, TRANSIT_OPEN))
.build();
info.getChanges().getFirst().setAnimationOptions(TransitionInfo.AnimationOptions
.makeCustomAnimOptions("packageName", 0 /* enterResId */, 0 /* exitResId */,
@@ -161,4 +166,128 @@
// An invalid custom animation is equivalent to jump-cut.
assertEquals(0, animator.getDuration());
}
+
+ @DisableFlags(Flags.FLAG_ACTIVITY_EMBEDDING_OVERLAY_PRESENTATION_FLAG)
+ @Test
+ public void testCalculateParentBounds_flagDisabled() {
+ final Rect parentBounds = new Rect(0, 0, 2000, 2000);
+ final Rect primaryBounds = new Rect();
+ final Rect secondaryBounds = new Rect();
+ parentBounds.splitVertically(primaryBounds, secondaryBounds);
+
+ final TransitionInfo.Change change = createChange(0 /* flags */);
+ change.setStartAbsBounds(secondaryBounds);
+
+ final TransitionInfo.Change boundsAnimationChange = createChange(0 /* flags */);
+ boundsAnimationChange.setStartAbsBounds(primaryBounds);
+ boundsAnimationChange.setEndAbsBounds(primaryBounds);
+ final Rect actualParentBounds = new Rect();
+
+ calculateParentBounds(change, boundsAnimationChange, actualParentBounds);
+
+ assertEquals(parentBounds, actualParentBounds);
+
+ actualParentBounds.setEmpty();
+
+ boundsAnimationChange.setStartAbsBounds(secondaryBounds);
+ boundsAnimationChange.setEndAbsBounds(primaryBounds);
+
+ calculateParentBounds(boundsAnimationChange, boundsAnimationChange, actualParentBounds);
+
+ assertEquals(parentBounds, actualParentBounds);
+ }
+
+ // TODO(b/243518738): Rewrite with TestParameter
+ @EnableFlags(Flags.FLAG_ACTIVITY_EMBEDDING_OVERLAY_PRESENTATION_FLAG)
+ @Test
+ public void testCalculateParentBounds_flagEnabled() {
+ TransitionInfo.Change change;
+ final TransitionInfo.Change stubChange = createChange(0 /* flags */);
+ final Rect actualParentBounds = new Rect();
+ Rect parentBounds = new Rect(0, 0, 2000, 2000);
+ Rect endAbsBounds = new Rect(0, 0, 2000, 2000);
+ change = prepareChangeForParentBoundsCalculationTest(
+ new Point(0, 0) /* endRelOffset */,
+ endAbsBounds,
+ new Point() /* endParentSize */
+ );
+
+ calculateParentBounds(change, stubChange, actualParentBounds);
+
+ assertTrue("Parent bounds must be empty because end parent size is not set.",
+ actualParentBounds.isEmpty());
+
+ String testString = "Parent start with (0, 0)";
+ change = prepareChangeForParentBoundsCalculationTest(
+ new Point(endAbsBounds.left - parentBounds.left,
+ endAbsBounds.top - parentBounds.top),
+ endAbsBounds, new Point(parentBounds.width(), parentBounds.height()));
+
+ calculateParentBounds(change, stubChange, actualParentBounds);
+
+ assertEquals(testString + ": Parent bounds must be " + parentBounds, parentBounds,
+ actualParentBounds);
+
+ testString = "Container not start with (0, 0)";
+ parentBounds = new Rect(0, 0, 2000, 2000);
+ endAbsBounds = new Rect(1000, 500, 2000, 1500);
+ change = prepareChangeForParentBoundsCalculationTest(
+ new Point(endAbsBounds.left - parentBounds.left,
+ endAbsBounds.top - parentBounds.top),
+ endAbsBounds, new Point(parentBounds.width(), parentBounds.height()));
+
+ calculateParentBounds(change, stubChange, actualParentBounds);
+
+ assertEquals(testString + ": Parent bounds must be " + parentBounds, parentBounds,
+ actualParentBounds);
+
+ testString = "Parent container on the right";
+ parentBounds = new Rect(1000, 0, 2000, 2000);
+ endAbsBounds = new Rect(1000, 500, 1500, 1500);
+ change = prepareChangeForParentBoundsCalculationTest(
+ new Point(endAbsBounds.left - parentBounds.left,
+ endAbsBounds.top - parentBounds.top),
+ endAbsBounds, new Point(parentBounds.width(), parentBounds.height()));
+
+ calculateParentBounds(change, stubChange, actualParentBounds);
+
+ assertEquals(testString + ": Parent bounds must be " + parentBounds, parentBounds,
+ actualParentBounds);
+
+ testString = "Parent container on the bottom";
+ parentBounds = new Rect(0, 1000, 2000, 2000);
+ endAbsBounds = new Rect(500, 1500, 1500, 2000);
+ change = prepareChangeForParentBoundsCalculationTest(
+ new Point(endAbsBounds.left - parentBounds.left,
+ endAbsBounds.top - parentBounds.top),
+ endAbsBounds, new Point(parentBounds.width(), parentBounds.height()));
+
+ calculateParentBounds(change, stubChange, actualParentBounds);
+
+ assertEquals(testString + ": Parent bounds must be " + parentBounds, parentBounds,
+ actualParentBounds);
+
+ testString = "Parent container in the middle";
+ parentBounds = new Rect(500, 500, 1500, 1500);
+ endAbsBounds = new Rect(1000, 500, 1500, 1000);
+ change = prepareChangeForParentBoundsCalculationTest(
+ new Point(endAbsBounds.left - parentBounds.left,
+ endAbsBounds.top - parentBounds.top),
+ endAbsBounds, new Point(parentBounds.width(), parentBounds.height()));
+
+ calculateParentBounds(change, stubChange, actualParentBounds);
+
+ assertEquals(testString + ": Parent bounds must be " + parentBounds, parentBounds,
+ actualParentBounds);
+ }
+
+ @NonNull
+ private static TransitionInfo.Change prepareChangeForParentBoundsCalculationTest(
+ @NonNull Point endRelOffset, @NonNull Rect endAbsBounds, @NonNull Point endParentSize) {
+ final TransitionInfo.Change change = createChange(0 /* flags */);
+ change.setEndRelOffset(endRelOffset.x, endRelOffset.y);
+ change.setEndAbsBounds(endAbsBounds);
+ change.setEndParentSize(endParentSize.x, endParentSize.y);
+ return change;
+ }
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationTestBase.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationTestBase.java
index 0b2265d..c18d7ec 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationTestBase.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationTestBase.java
@@ -16,6 +16,7 @@
package com.android.wm.shell.activityembedding;
+import static android.view.WindowManager.TRANSIT_NONE;
import static android.window.TransitionInfo.FLAG_FILLS_TASK;
import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY;
@@ -31,6 +32,7 @@
import android.graphics.Rect;
import android.os.IBinder;
import android.view.SurfaceControl;
+import android.view.WindowManager;
import android.window.TransitionInfo;
import android.window.WindowContainerToken;
@@ -82,11 +84,27 @@
spyOn(mFinishCallback);
}
- /** Creates a mock {@link TransitionInfo.Change}. */
+ /**
+ * Creates a mock {@link TransitionInfo.Change}.
+ *
+ * @param flags the {@link TransitionInfo.ChangeFlags} of the change
+ */
static TransitionInfo.Change createChange(@TransitionInfo.ChangeFlags int flags) {
+ return createChange(flags, TRANSIT_NONE);
+ }
+
+ /**
+ * Creates a mock {@link TransitionInfo.Change}.
+ *
+ * @param flags the {@link TransitionInfo.ChangeFlags} of the change
+ * @param mode the transition mode of the change
+ */
+ static TransitionInfo.Change createChange(@TransitionInfo.ChangeFlags int flags,
+ @WindowManager.TransitionType int mode) {
TransitionInfo.Change c = new TransitionInfo.Change(mock(WindowContainerToken.class),
mock(SurfaceControl.class));
c.setFlags(flags);
+ c.setMode(mode);
return c;
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
index 35808d9..e17f7f2 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
@@ -24,6 +24,7 @@
import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW
import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED
+import android.content.ComponentName
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.pm.ActivityInfo.CONFIG_DENSITY
@@ -668,6 +669,20 @@
}
@Test
+ fun moveToDesktop_systemUIActivity_doesNothing() {
+ val task = setUpFullscreenTask()
+
+ // Set task as systemUI package
+ val systemUIPackageName = context.resources.getString(
+ com.android.internal.R.string.config_systemUi)
+ val baseComponent = ComponentName(systemUIPackageName, /* class */ "")
+ task.baseActivity = baseComponent
+
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ verifyEnterDesktopWCTNotExecuted()
+ }
+
+ @Test
fun moveToDesktop_deviceSupported_taskIsMovedToDesktop() {
val task = setUpFullscreenTask()
@@ -1170,6 +1185,21 @@
}
@Test
+ fun handleRequest_systemUIActivity_returnSwitchToFullscreenWCT() {
+ val task = setUpFreeformTask()
+
+ // Set task as systemUI package
+ val systemUIPackageName = context.resources.getString(
+ com.android.internal.R.string.config_systemUi)
+ val baseComponent = ComponentName(systemUIPackageName, /* class */ "")
+ task.baseActivity = baseComponent
+
+ val result = controller.handleRequest(Binder(), createTransition(task))
+ assertThat(result?.changes?.get(task.token.asBinder())?.windowingMode)
+ .isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN
+ }
+
+ @Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
fun handleRequest_backTransition_singleActiveTask_noToken() {
val task = setUpFreeformTask()
@@ -1581,6 +1611,8 @@
bounds: Rect? = null
): RunningTaskInfo {
val task = createFreeformTask(displayId, bounds)
+ val activityInfo = ActivityInfo()
+ task.topActivityInfo = activityInfo
whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task)
desktopModeTaskRepository.addActiveTask(displayId, task.taskId)
desktopModeTaskRepository.addOrMoveFreeformTaskToTop(displayId, task.taskId)
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
index 9c1dc22..ca1e3f1 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
@@ -22,7 +22,9 @@
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED
+import android.content.ComponentName
import android.content.Context
+import android.content.pm.ActivityInfo
import android.graphics.Rect
import android.hardware.display.DisplayManager
import android.hardware.display.VirtualDisplay
@@ -341,7 +343,7 @@
}
@Test
- fun testDescorationIsNotCreatedForTopTranslucentActivities() {
+ fun testDecorationIsNotCreatedForTopTranslucentActivities() {
setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true).apply {
isTopActivityTransparent = true
@@ -354,6 +356,22 @@
}
@Test
+ fun testDecorationIsNotCreatedForSystemUIActivities() {
+ val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true)
+
+ // Set task as systemUI package
+ val systemUIPackageName = context.resources.getString(
+ com.android.internal.R.string.config_systemUi)
+ val baseComponent = ComponentName(systemUIPackageName, /* class */ "")
+ task.baseActivity = baseComponent
+
+ onTaskOpening(task)
+
+ verify(mockDesktopModeWindowDecorFactory, never())
+ .create(any(), any(), any(), eq(task), any(), any(), any(), any(), any())
+ }
+
+ @Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_IMMERSIVE_HANDLE_HIDING)
fun testRelayoutRunsWhenStatusBarsInsetsSourceVisibilityChanges() {
val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM, focused = true)
@@ -522,7 +540,8 @@
displayId: Int = DEFAULT_DISPLAY,
@WindowConfiguration.WindowingMode windowingMode: Int,
activityType: Int = ACTIVITY_TYPE_STANDARD,
- focused: Boolean = true
+ focused: Boolean = true,
+ activityInfo: ActivityInfo = ActivityInfo()
): RunningTaskInfo {
return TestRunningTaskInfoBuilder()
.setDisplayId(displayId)
@@ -530,6 +549,7 @@
.setVisible(true)
.setActivityType(activityType)
.build().apply {
+ topActivityInfo = activityInfo
isFocused = focused
}
}
diff --git a/libs/androidfw/LocaleDataTables.cpp b/libs/androidfw/LocaleDataTables.cpp
index b68143d..9435118 100644
--- a/libs/androidfw/LocaleDataTables.cpp
+++ b/libs/androidfw/LocaleDataTables.cpp
@@ -2451,10 +2451,10 @@
const char script[4];
const std::unordered_map<uint32_t, uint32_t>* map;
} SCRIPT_PARENTS[] = {
+ {{'L', 'a', 't', 'n'}, &LATN_PARENTS},
{{'A', 'r', 'a', 'b'}, &ARAB_PARENTS},
{{'D', 'e', 'v', 'a'}, &DEVA_PARENTS},
{{'H', 'a', 'n', 't'}, &HANT_PARENTS},
- {{'L', 'a', 't', 'n'}, &LATN_PARENTS},
{{'~', '~', '~', 'B'}, &___B_PARENTS},
};
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index a3dd983..de9991a 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -2650,8 +2650,9 @@
return (mnc);
}
}
-
- if (isLocaleBetterThan(o, requested)) {
+ // Cheaper to check for the empty locales here before calling the function
+ // as we often can skip it completely.
+ if (requested->locale && (locale || o.locale) && isLocaleBetterThan(o, requested)) {
return true;
}
@@ -7237,27 +7238,11 @@
status_t DynamicRefTable::lookupResourceId(uint32_t* resId) const {
uint32_t res = *resId;
- size_t packageId = Res_GETPACKAGE(res) + 1;
-
if (!Res_VALIDID(res)) {
// Cannot look up a null or invalid id, so no lookup needs to be done.
return NO_ERROR;
}
-
- const auto alias_it = std::lower_bound(mAliasId.begin(), mAliasId.end(), res,
- [](const AliasMap::value_type& pair, uint32_t val) { return pair.first < val; });
- if (alias_it != mAliasId.end() && alias_it->first == res) {
- // Rewrite the resource id to its alias resource id. Since the alias resource id is a
- // compile-time id, it still needs to be resolved further.
- res = alias_it->second;
- }
-
- if (packageId == SYS_PACKAGE_ID || (packageId == APP_PACKAGE_ID && !mAppAsLib)) {
- // No lookup needs to be done, app and framework package IDs are absolute.
- *resId = res;
- return NO_ERROR;
- }
-
+ const size_t packageId = Res_GETPACKAGE(res) + 1;
if (packageId == 0 || (packageId == APP_PACKAGE_ID && mAppAsLib)) {
// The package ID is 0x00. That means that a shared library is accessing
// its own local resource.
@@ -7267,6 +7252,24 @@
*resId = (0xFFFFFF & (*resId)) | (((uint32_t) mAssignedPackageId) << 24);
return NO_ERROR;
}
+ // All aliases are coming from the framework, and usually have their own separate ID range,
+ // skipping the whole binary search is much more efficient than not finding anything.
+ if (packageId == SYS_PACKAGE_ID && !mAliasId.empty() &&
+ res >= mAliasId.front().first && res <= mAliasId.back().first) {
+ const auto alias_it = std::lower_bound(mAliasId.begin(), mAliasId.end(), res,
+ [](const AliasMap::value_type& pair,
+ uint32_t val) { return pair.first < val; });
+ if (alias_it != mAliasId.end() && alias_it->first == res) {
+ // Rewrite the resource id to its alias resource id. Since the alias resource id is a
+ // compile-time id, it still needs to be resolved further.
+ res = alias_it->second;
+ }
+ }
+ if (packageId == SYS_PACKAGE_ID || (packageId == APP_PACKAGE_ID && !mAppAsLib)) {
+ // No lookup needs to be done, app and framework package IDs are absolute.
+ *resId = res;
+ return NO_ERROR;
+ }
// Do a proper lookup.
uint8_t translatedId = mLookupTable[packageId];
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 8874ff5..e619e1c 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -127,6 +127,9 @@
"-Wunused",
"-Wunreachable-code",
],
+
+ // TODO(b/330503129) Workaround build breakage.
+ lto_O0: true,
}
cc_library_shared {
diff --git a/media/jni/audioeffect/Android.bp b/media/jni/audioeffect/Android.bp
index cf5059c..7caa9e4 100644
--- a/media/jni/audioeffect/Android.bp
+++ b/media/jni/audioeffect/Android.bp
@@ -44,4 +44,7 @@
"-Wunreachable-code",
"-DANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION",
],
+
+ // TODO(b/330503129) Workaround LTO build breakage.
+ lto_O0: true,
}
diff --git a/packages/InputDevices/res/values-af/strings.xml b/packages/InputDevices/res/values-af/strings.xml
index f7dc457..eafe042 100644
--- a/packages/InputDevices/res/values-af/strings.xml
+++ b/packages/InputDevices/res/values-af/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thais (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serwies (Latyns)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegryns (Latyns)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-am/strings.xml b/packages/InputDevices/res/values-am/strings.xml
index 712ca00..fd50761 100644
--- a/packages/InputDevices/res/values-am/strings.xml
+++ b/packages/InputDevices/res/values-am/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ታይላንድኛ (ፓታሾት)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"ሰርቢያኛ (ላቲን)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"ሞንቴኔግሮኛ (ላቲን)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ar/strings.xml b/packages/InputDevices/res/values-ar/strings.xml
index fe8f59c..ac73038 100644
--- a/packages/InputDevices/res/values-ar/strings.xml
+++ b/packages/InputDevices/res/values-ar/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"التايلاندية (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"الصربية (اللاتينية)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"لغة الجبل الأسود (اللاتينية)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-as/strings.xml b/packages/InputDevices/res/values-as/strings.xml
index c2ea39e..1162c72 100644
--- a/packages/InputDevices/res/values-as/strings.xml
+++ b/packages/InputDevices/res/values-as/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"থাই (পাটাচ’টে)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"ছাৰ্বিয়ান (লেটিন)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"মণ্টেনেগ্ৰিণ (লেটিন)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-az/strings.xml b/packages/InputDevices/res/values-az/strings.xml
index d90c3c8..6a6a99d 100644
--- a/packages/InputDevices/res/values-az/strings.xml
+++ b/packages/InputDevices/res/values-az/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tay (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serb dili (Latın)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Monteneqro dili (Latın)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-b+sr+Latn/strings.xml b/packages/InputDevices/res/values-b+sr+Latn/strings.xml
index 0d9a211..96ac10cb 100644
--- a/packages/InputDevices/res/values-b+sr+Latn/strings.xml
+++ b/packages/InputDevices/res/values-b+sr+Latn/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"tajski (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"srpski (latinica)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"crnogorski (latinica)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-be/strings.xml b/packages/InputDevices/res/values-be/strings.xml
index 697ab63..e8341a1 100644
--- a/packages/InputDevices/res/values-be/strings.xml
+++ b/packages/InputDevices/res/values-be/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Тайская (Патачотэ)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Сербская (лацініца)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Чарнагорская (лацініца)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-bg/strings.xml b/packages/InputDevices/res/values-bg/strings.xml
index e02fd0c..b6a5b00 100644
--- a/packages/InputDevices/res/values-bg/strings.xml
+++ b/packages/InputDevices/res/values-bg/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"тайландски (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"сръбски (латиница)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"черногорски (латиница)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-bn/strings.xml b/packages/InputDevices/res/values-bn/strings.xml
index 3fdbcc1..353b6dc 100644
--- a/packages/InputDevices/res/values-bn/strings.xml
+++ b/packages/InputDevices/res/values-bn/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"থাই (পাট্টাচোটে)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"সার্বিয়ান (ল্যাটিন)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"মন্টেনেগ্রিন (ল্যাটিন)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-bs/strings.xml b/packages/InputDevices/res/values-bs/strings.xml
index 934da2c..0145b0a 100644
--- a/packages/InputDevices/res/values-bs/strings.xml
+++ b/packages/InputDevices/res/values-bs/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"tajlandski (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"srpski (latinica)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"crnogorski (latinica)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ca/strings.xml b/packages/InputDevices/res/values-ca/strings.xml
index 2082c05..d729c91 100644
--- a/packages/InputDevices/res/values-ca/strings.xml
+++ b/packages/InputDevices/res/values-ca/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbi (llatí)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrí (llatí)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-cs/strings.xml b/packages/InputDevices/res/values-cs/strings.xml
index cd211c9..170fa58 100644
--- a/packages/InputDevices/res/values-cs/strings.xml
+++ b/packages/InputDevices/res/values-cs/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"thajština (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"srbština (latinka)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"černohorština (latinka)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-da/strings.xml b/packages/InputDevices/res/values-da/strings.xml
index 9635810..47fcfb1 100644
--- a/packages/InputDevices/res/values-da/strings.xml
+++ b/packages/InputDevices/res/values-da/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbisk (latinsk)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrinsk (latinsk)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-de/strings.xml b/packages/InputDevices/res/values-de/strings.xml
index 35db12e..1f6b65d 100644
--- a/packages/InputDevices/res/values-de/strings.xml
+++ b/packages/InputDevices/res/values-de/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thailändisch (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbisch (lat. Alphabet)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrinisch (lat. Alphabet)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-el/strings.xml b/packages/InputDevices/res/values-el/strings.xml
index fb34edd..2a9dd8c 100644
--- a/packages/InputDevices/res/values-el/strings.xml
+++ b/packages/InputDevices/res/values-el/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Ταϊλανδικά (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Σερβικά (Λατινικά)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Μαυροβουνιακά (Λατινικά)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-en-rAU/strings.xml b/packages/InputDevices/res/values-en-rAU/strings.xml
index 0296067..e27fb64 100644
--- a/packages/InputDevices/res/values-en-rAU/strings.xml
+++ b/packages/InputDevices/res/values-en-rAU/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbian (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrin (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-en-rCA/strings.xml b/packages/InputDevices/res/values-en-rCA/strings.xml
index 1d7ba3d..74fd7c5 100644
--- a/packages/InputDevices/res/values-en-rCA/strings.xml
+++ b/packages/InputDevices/res/values-en-rCA/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbian (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrin (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-en-rGB/strings.xml b/packages/InputDevices/res/values-en-rGB/strings.xml
index 0296067..e27fb64 100644
--- a/packages/InputDevices/res/values-en-rGB/strings.xml
+++ b/packages/InputDevices/res/values-en-rGB/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbian (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrin (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-en-rIN/strings.xml b/packages/InputDevices/res/values-en-rIN/strings.xml
index 0296067..e27fb64 100644
--- a/packages/InputDevices/res/values-en-rIN/strings.xml
+++ b/packages/InputDevices/res/values-en-rIN/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbian (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrin (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-en-rXC/strings.xml b/packages/InputDevices/res/values-en-rXC/strings.xml
index a231d4c..777d939 100644
--- a/packages/InputDevices/res/values-en-rXC/strings.xml
+++ b/packages/InputDevices/res/values-en-rXC/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbian (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrin (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-es-rUS/strings.xml b/packages/InputDevices/res/values-es-rUS/strings.xml
index 4d32333..049edf4 100644
--- a/packages/InputDevices/res/values-es-rUS/strings.xml
+++ b/packages/InputDevices/res/values-es-rUS/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tailandés (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbio (latino)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrino (latino)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-es/strings.xml b/packages/InputDevices/res/values-es/strings.xml
index 39905de..b6e27c5 100644
--- a/packages/InputDevices/res/values-es/strings.xml
+++ b/packages/InputDevices/res/values-es/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tailandés (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbio (latino)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrino (latino)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-et/strings.xml b/packages/InputDevices/res/values-et/strings.xml
index f2d4340..cecf304d 100644
--- a/packages/InputDevices/res/values-et/strings.xml
+++ b/packages/InputDevices/res/values-et/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbia (ladina)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegro (ladina)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml
index 08d96a9b..481b315 100644
--- a/packages/InputDevices/res/values-eu/strings.xml
+++ b/packages/InputDevices/res/values-eu/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thailandiarra (pattachote-a)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbiarra (latindarra)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegroarra (latindarra)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-fa/strings.xml b/packages/InputDevices/res/values-fa/strings.xml
index 8dcae86b..9614fef 100644
--- a/packages/InputDevices/res/values-fa/strings.xml
+++ b/packages/InputDevices/res/values-fa/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"تایلندی (پاتاچوته)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"صربی (لاتین)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"مونتهنگرویی (لاتین)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-fi/strings.xml b/packages/InputDevices/res/values-fi/strings.xml
index 8748854..afae51b 100644
--- a/packages/InputDevices/res/values-fi/strings.xml
+++ b/packages/InputDevices/res/values-fi/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"thai (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"serbia (latinalainen)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"montenegro (latinalainen)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-fr-rCA/strings.xml b/packages/InputDevices/res/values-fr-rCA/strings.xml
index ee498aa..f2d79df 100644
--- a/packages/InputDevices/res/values-fr-rCA/strings.xml
+++ b/packages/InputDevices/res/values-fr-rCA/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thaï (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbe (latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Monténégrin (latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-fr/strings.xml b/packages/InputDevices/res/values-fr/strings.xml
index f12e1db..61891c3 100644
--- a/packages/InputDevices/res/values-fr/strings.xml
+++ b/packages/InputDevices/res/values-fr/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thaï (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbe (latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Monténégrin (latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-gl/strings.xml b/packages/InputDevices/res/values-gl/strings.xml
index 2d96c89..4616168 100644
--- a/packages/InputDevices/res/values-gl/strings.xml
+++ b/packages/InputDevices/res/values-gl/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tailandés (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbio (alfabeto latino)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrino (alfabeto latino)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-gu/strings.xml b/packages/InputDevices/res/values-gu/strings.xml
index 3c02208..f04b2d2 100644
--- a/packages/InputDevices/res/values-gu/strings.xml
+++ b/packages/InputDevices/res/values-gu/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"થાઇ (પટ્ટાશોટે)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"સર્બિયન (લેટિન)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"મોંટેનેગ્રીન (લેટિન)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml
index 88729ea1..1017ef1 100644
--- a/packages/InputDevices/res/values-hi/strings.xml
+++ b/packages/InputDevices/res/values-hi/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"थाई (पटैचोटे)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"सर्बियन (लैटिन)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"मॉन्टेनीग्रिन (लैटिन)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-hr/strings.xml b/packages/InputDevices/res/values-hr/strings.xml
index 39da355..bc630bc 100644
--- a/packages/InputDevices/res/values-hr/strings.xml
+++ b/packages/InputDevices/res/values-hr/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"tajski (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"srpski (latinica)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"crnogorski (latinica)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-hu/strings.xml b/packages/InputDevices/res/values-hu/strings.xml
index edceda2..5155543 100644
--- a/packages/InputDevices/res/values-hu/strings.xml
+++ b/packages/InputDevices/res/values-hu/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"thai (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"szerb (latin betűs)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"montenegrói (latin betűs)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-hy/strings.xml b/packages/InputDevices/res/values-hy/strings.xml
index 8f3652a..8097438 100644
--- a/packages/InputDevices/res/values-hy/strings.xml
+++ b/packages/InputDevices/res/values-hy/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"թայերեն (պատաչոտ)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"սերբերեն (լատինատառ)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"չեռնոգորերեն (լատինատառ)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-in/strings.xml b/packages/InputDevices/res/values-in/strings.xml
index d4f024a..1c52e9c 100644
--- a/packages/InputDevices/res/values-in/strings.xml
+++ b/packages/InputDevices/res/values-in/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbia (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegro (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-is/strings.xml b/packages/InputDevices/res/values-is/strings.xml
index 680c4e3..bf428ba 100644
--- a/packages/InputDevices/res/values-is/strings.xml
+++ b/packages/InputDevices/res/values-is/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Taílenskt (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbneska (latneskt)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Svartfellska (latneskt)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-it/strings.xml b/packages/InputDevices/res/values-it/strings.xml
index b6b9e8d..bb3b12c 100644
--- a/packages/InputDevices/res/values-it/strings.xml
+++ b/packages/InputDevices/res/values-it/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbo (latino)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrino (latino)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-iw/strings.xml b/packages/InputDevices/res/values-iw/strings.xml
index 93f7426..f44235a 100644
--- a/packages/InputDevices/res/values-iw/strings.xml
+++ b/packages/InputDevices/res/values-iw/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"תאית (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"סרבית (לטינית)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"מונטנגרית (לטינית)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ja/strings.xml b/packages/InputDevices/res/values-ja/strings.xml
index bb9fc8c..55b9642 100644
--- a/packages/InputDevices/res/values-ja/strings.xml
+++ b/packages/InputDevices/res/values-ja/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"タイ語(Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"セルビア語(ラテン文字)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"モンテネグロ語(ラテン)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ka/strings.xml b/packages/InputDevices/res/values-ka/strings.xml
index e09d65b..8696fb2 100644
--- a/packages/InputDevices/res/values-ka/strings.xml
+++ b/packages/InputDevices/res/values-ka/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ტაილანდური (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"სერბული (ლათინური)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"მონტენეგრული (ლათინური)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-kk/strings.xml b/packages/InputDevices/res/values-kk/strings.xml
index 176aa24..2e7236c 100644
--- a/packages/InputDevices/res/values-kk/strings.xml
+++ b/packages/InputDevices/res/values-kk/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Тай (паттачот)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Серб (латын жазуы)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Черногор (латын жазуы)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-km/strings.xml b/packages/InputDevices/res/values-km/strings.xml
index b8571ec..2689258 100644
--- a/packages/InputDevices/res/values-km/strings.xml
+++ b/packages/InputDevices/res/values-km/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ថៃ (ប៉ាតាឈោត)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"ស៊ែប៊ី (ឡាតាំង)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"ម៉ុងតេណេហ្គ្រោ (ឡាតាំង)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-kn/strings.xml b/packages/InputDevices/res/values-kn/strings.xml
index 3b0def4..34d9053 100644
--- a/packages/InputDevices/res/values-kn/strings.xml
+++ b/packages/InputDevices/res/values-kn/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ಥಾಯ್ (ಪಟ್ಟಚೋಟ್)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"ಸೆರ್ಬಿಯನ್ (ಲ್ಯಾಟಿನ್)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"ಮೊಂಟೆನೆಗ್ರಿನ್ (ಲ್ಯಾಟಿನ್)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ko/strings.xml b/packages/InputDevices/res/values-ko/strings.xml
index 689d3fff..ad99961 100644
--- a/packages/InputDevices/res/values-ko/strings.xml
+++ b/packages/InputDevices/res/values-ko/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"태국어(Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"세르비아어(로마자)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"몬테네그로어(로마자)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ky/strings.xml b/packages/InputDevices/res/values-ky/strings.xml
index 97dbc2a..79ff71e 100644
--- a/packages/InputDevices/res/values-ky/strings.xml
+++ b/packages/InputDevices/res/values-ky/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Тайча (Pattachote баскычтобу)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Сербче (Латын)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Монтенегрочо (Латын)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-lo/strings.xml b/packages/InputDevices/res/values-lo/strings.xml
index da2b868..2427d1c 100644
--- a/packages/InputDevices/res/values-lo/strings.xml
+++ b/packages/InputDevices/res/values-lo/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ໄທ (ປັດຕະໂຊຕິ)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"ເຊີບຽນ (ລາຕິນ)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"ມອນເທເນກຣິນ (ລາຕິນ)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-lt/strings.xml b/packages/InputDevices/res/values-lt/strings.xml
index b9a3e20..48010bc 100644
--- a/packages/InputDevices/res/values-lt/strings.xml
+++ b/packages/InputDevices/res/values-lt/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tajų („Pattachote“)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbų (lotynų rašmenys)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Juodkalniečių (lotynų rašmenys)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-lv/strings.xml b/packages/InputDevices/res/values-lv/strings.xml
index 827480c..a2e8f8f 100644
--- a/packages/InputDevices/res/values-lv/strings.xml
+++ b/packages/InputDevices/res/values-lv/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Taju (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbu (latīņu)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Melnkalniešu (latīņu)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-mk/strings.xml b/packages/InputDevices/res/values-mk/strings.xml
index 0aef324..13cc8e1 100644
--- a/packages/InputDevices/res/values-mk/strings.xml
+++ b/packages/InputDevices/res/values-mk/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"тајландски (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"српски (латиница)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"црногорски (латиница)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ml/strings.xml b/packages/InputDevices/res/values-ml/strings.xml
index b8f4d32..fda477b 100644
--- a/packages/InputDevices/res/values-ml/strings.xml
+++ b/packages/InputDevices/res/values-ml/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"തായ് (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"സെർബിയൻ (ലാറ്റിൻ)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"മോണ്ടിനെഗ്രിൻ (ലാറ്റിൻ)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-mn/strings.xml b/packages/InputDevices/res/values-mn/strings.xml
index 2490d81..a6d3320 100644
--- a/packages/InputDevices/res/values-mn/strings.xml
+++ b/packages/InputDevices/res/values-mn/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Тай (паттачоте)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Серби (латин)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Монтенегро (латин)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-mr/strings.xml b/packages/InputDevices/res/values-mr/strings.xml
index 63c4c90..faae021 100644
--- a/packages/InputDevices/res/values-mr/strings.xml
+++ b/packages/InputDevices/res/values-mr/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"थाई (पट्टाचोटे)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"सर्बियन (लॅटिन)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"मॉन्टेनेग्रिन (लॅटिन)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ms/strings.xml b/packages/InputDevices/res/values-ms/strings.xml
index 6444ae0..9f14260 100644
--- a/packages/InputDevices/res/values-ms/strings.xml
+++ b/packages/InputDevices/res/values-ms/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbia (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrin (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-my/strings.xml b/packages/InputDevices/res/values-my/strings.xml
index 0510240..bb26027 100644
--- a/packages/InputDevices/res/values-my/strings.xml
+++ b/packages/InputDevices/res/values-my/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ထိုင်း (ပတ်တာချုတ်)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"ဆားဘီးယား (လက်တင်)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"မွန်တီနီဂရင်း (လက်တင်)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-nb/strings.xml b/packages/InputDevices/res/values-nb/strings.xml
index 43a172f..402d7ee 100644
--- a/packages/InputDevices/res/values-nb/strings.xml
+++ b/packages/InputDevices/res/values-nb/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbisk (latinsk)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrisk (latinsk)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ne/strings.xml b/packages/InputDevices/res/values-ne/strings.xml
index ab1ec1d..a60cf36 100644
--- a/packages/InputDevices/res/values-ne/strings.xml
+++ b/packages/InputDevices/res/values-ne/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"थाई (पत्ताचोते)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"सर्बियाली (ल्याटिन)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"मोन्टेनिग्रिन (ल्याटिन)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-nl/strings.xml b/packages/InputDevices/res/values-nl/strings.xml
index 1893704..bb0c945 100644
--- a/packages/InputDevices/res/values-nl/strings.xml
+++ b/packages/InputDevices/res/values-nl/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Servisch (Latijns)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrijns (Latijns)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-or/strings.xml b/packages/InputDevices/res/values-or/strings.xml
index 94fc9b3..2bf862b 100644
--- a/packages/InputDevices/res/values-or/strings.xml
+++ b/packages/InputDevices/res/values-or/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ଥାଇ (ପାଟ୍ଟାଚୋଟେ)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"ସର୍ବିଆନ (ଲାଟିନ)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"ମଣ୍ଟେନେଗ୍ରିନ (ଲାଟିନ)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-pa/strings.xml b/packages/InputDevices/res/values-pa/strings.xml
index 970343f..c1fee5f 100644
--- a/packages/InputDevices/res/values-pa/strings.xml
+++ b/packages/InputDevices/res/values-pa/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ਥਾਈ (ਪੈਟਾਸ਼ੋਟੇ)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"ਸਰਬੀਆਈ (ਲਾਤੀਨੀ)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"ਮਾਂਟੇਨੀਗਰਿਨ (ਲਾਤੀਨੀ)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-pl/strings.xml b/packages/InputDevices/res/values-pl/strings.xml
index b76c0fe..d3e4a3a 100644
--- a/packages/InputDevices/res/values-pl/strings.xml
+++ b/packages/InputDevices/res/values-pl/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"tajski (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"serbski (alfabet łaciński)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"czarnogórski (alfabet łaciński)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-pt-rBR/strings.xml b/packages/InputDevices/res/values-pt-rBR/strings.xml
index 18c334f..94a10c5 100644
--- a/packages/InputDevices/res/values-pt-rBR/strings.xml
+++ b/packages/InputDevices/res/values-pt-rBR/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tailandês (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Sérvio (latim)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrino (latim)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-pt-rPT/strings.xml b/packages/InputDevices/res/values-pt-rPT/strings.xml
index ea1d9c1..8c22776 100644
--- a/packages/InputDevices/res/values-pt-rPT/strings.xml
+++ b/packages/InputDevices/res/values-pt-rPT/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tailandês (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Sérvio (latim)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrino (latim)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-pt/strings.xml b/packages/InputDevices/res/values-pt/strings.xml
index 18c334f..94a10c5 100644
--- a/packages/InputDevices/res/values-pt/strings.xml
+++ b/packages/InputDevices/res/values-pt/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tailandês (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Sérvio (latim)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrino (latim)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ro/strings.xml b/packages/InputDevices/res/values-ro/strings.xml
index 9fa3017..654f168 100644
--- a/packages/InputDevices/res/values-ro/strings.xml
+++ b/packages/InputDevices/res/values-ro/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thailandeză (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Sârbă (caractere latine)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Muntenegreană (caractere latine)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ru/strings.xml b/packages/InputDevices/res/values-ru/strings.xml
index 90b2461..05b1b25 100644
--- a/packages/InputDevices/res/values-ru/strings.xml
+++ b/packages/InputDevices/res/values-ru/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Тайский (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Сербский (латиница)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Черногорский (латиница)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-si/strings.xml b/packages/InputDevices/res/values-si/strings.xml
index 8d42385..8d36553 100644
--- a/packages/InputDevices/res/values-si/strings.xml
+++ b/packages/InputDevices/res/values-si/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"තායි (පට්ටචෝටේ)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"සර්බියානු (ලතින්)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"මොන්ටෙනේග්රීන් (ලතින්)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-sk/strings.xml b/packages/InputDevices/res/values-sk/strings.xml
index 64b4ef2..33e1651 100644
--- a/packages/InputDevices/res/values-sk/strings.xml
+++ b/packages/InputDevices/res/values-sk/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"thajčina (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"srbčina (latinka)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"čiernohorčina (latinka)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-sl/strings.xml b/packages/InputDevices/res/values-sl/strings.xml
index fdbbca7..e40cca7 100644
--- a/packages/InputDevices/res/values-sl/strings.xml
+++ b/packages/InputDevices/res/values-sl/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"tajščina (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"srbščina (latinica)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"črnogorščina (latinica)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-sq/strings.xml b/packages/InputDevices/res/values-sq/strings.xml
index 06a598c..46405ba 100644
--- a/packages/InputDevices/res/values-sq/strings.xml
+++ b/packages/InputDevices/res/values-sq/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tajlandisht (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbisht (latine)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Malazisht (latine)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-sr/strings.xml b/packages/InputDevices/res/values-sr/strings.xml
index d8beac6..5642040 100644
--- a/packages/InputDevices/res/values-sr/strings.xml
+++ b/packages/InputDevices/res/values-sr/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"тајски (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"српски (латиница)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"црногорски (латиница)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-sv/strings.xml b/packages/InputDevices/res/values-sv/strings.xml
index f1046bd..9ba1227 100644
--- a/packages/InputDevices/res/values-sv/strings.xml
+++ b/packages/InputDevices/res/values-sv/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"thailändska (pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"serbiska (latinskt)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"montenegrinska (latinskt)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-sw/strings.xml b/packages/InputDevices/res/values-sw/strings.xml
index 52efd2f..5da8542 100644
--- a/packages/InputDevices/res/values-sw/strings.xml
+++ b/packages/InputDevices/res/values-sw/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Kitai (Kipatachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Kiserbia (Kilatini)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Kimontenegri (Kilatini)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ta/strings.xml b/packages/InputDevices/res/values-ta/strings.xml
index 14fd630..becffd3 100644
--- a/packages/InputDevices/res/values-ta/strings.xml
+++ b/packages/InputDevices/res/values-ta/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"தாய் (பட்டாசொட்டே)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"செர்பியன் (லத்தீன்)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"மாண்டினெக்ரன் (லத்தீன்)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-te/strings.xml b/packages/InputDevices/res/values-te/strings.xml
index 891fd6c..1d2fcb4 100644
--- a/packages/InputDevices/res/values-te/strings.xml
+++ b/packages/InputDevices/res/values-te/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"థాయ్ (పత్తచోత్)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"సెర్బియన్ (లాటిన్)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"మాంటెనెగ్రిన్ (లాటిన్)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-th/strings.xml b/packages/InputDevices/res/values-th/strings.xml
index b58cc29..318a3bb 100644
--- a/packages/InputDevices/res/values-th/strings.xml
+++ b/packages/InputDevices/res/values-th/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"ไทย (ปัตตะโชติ)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"เซอร์เบีย (ละติน)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"มอนเตเนโกร (ละติน)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-tl/strings.xml b/packages/InputDevices/res/values-tl/strings.xml
index 3278899..062dff0 100644
--- a/packages/InputDevices/res/values-tl/strings.xml
+++ b/packages/InputDevices/res/values-tl/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serbian (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Montenegrin (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-tr/strings.xml b/packages/InputDevices/res/values-tr/strings.xml
index 6582aaf2..c6d38f4 100644
--- a/packages/InputDevices/res/values-tr/strings.xml
+++ b/packages/InputDevices/res/values-tr/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tayca (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Sırpça (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Karadağca (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-uk/strings.xml b/packages/InputDevices/res/values-uk/strings.xml
index 3a544e0..357747b 100644
--- a/packages/InputDevices/res/values-uk/strings.xml
+++ b/packages/InputDevices/res/values-uk/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Тайська (паттачоте)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Сербська (латиниця)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Чорногорська (латиниця)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-ur/strings.xml b/packages/InputDevices/res/values-ur/strings.xml
index 4b29326..7b4c104 100644
--- a/packages/InputDevices/res/values-ur/strings.xml
+++ b/packages/InputDevices/res/values-ur/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"تھائی (پٹاچوٹے)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"سربیائی (لاطینی)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"مونٹے نیگریائی (لاطینی)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-uz/strings.xml b/packages/InputDevices/res/values-uz/strings.xml
index 0e80d71..60e7405 100644
--- a/packages/InputDevices/res/values-uz/strings.xml
+++ b/packages/InputDevices/res/values-uz/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tay (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Serb (lotin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Chernogor (lotin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-vi/strings.xml b/packages/InputDevices/res/values-vi/strings.xml
index 5094a29..6fe39d2 100644
--- a/packages/InputDevices/res/values-vi/strings.xml
+++ b/packages/InputDevices/res/values-vi/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Tiếng Thái (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"Tiếng Serbia (Latinh)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Tiếng Montenegro (Latinh)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-zh-rCN/strings.xml b/packages/InputDevices/res/values-zh-rCN/strings.xml
index 6a5dd74..6e96e5d 100644
--- a/packages/InputDevices/res/values-zh-rCN/strings.xml
+++ b/packages/InputDevices/res/values-zh-rCN/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"泰语 (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"塞尔维亚语(拉丁字母)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"黑山语(拉丁字母)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-zh-rHK/strings.xml b/packages/InputDevices/res/values-zh-rHK/strings.xml
index a5a934a..3d1a895 100644
--- a/packages/InputDevices/res/values-zh-rHK/strings.xml
+++ b/packages/InputDevices/res/values-zh-rHK/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"泰文 (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"塞爾維亞文 (拉丁)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"蒙特內哥羅文 (拉丁)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-zh-rTW/strings.xml b/packages/InputDevices/res/values-zh-rTW/strings.xml
index 54c8b23..26be41b 100644
--- a/packages/InputDevices/res/values-zh-rTW/strings.xml
+++ b/packages/InputDevices/res/values-zh-rTW/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"泰文 (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"塞爾維亞文 (拉丁字母)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"蒙特內哥羅文 (拉丁字母)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/InputDevices/res/values-zu/strings.xml b/packages/InputDevices/res/values-zu/strings.xml
index 78dfa3b5..f6f6a77 100644
--- a/packages/InputDevices/res/values-zu/strings.xml
+++ b/packages/InputDevices/res/values-zu/strings.xml
@@ -54,4 +54,8 @@
<string name="keyboard_layout_thai_pattachote" msgid="2547992342794252205">"Isi-Thai (Pattachote)"</string>
<string name="keyboard_layout_serbian_latin" msgid="3128791759390046571">"IsiSerbian (Latin)"</string>
<string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"IsiMontenegrin (Latin)"</string>
+ <!-- no translation found for keyboard_layout_serbian_cyrillic (7013541044323542196) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_montenegrin_cyrillic (2391253952894077421) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
index e7e33d7..766e719 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
@@ -19,5 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"தனிப்பட்டவை"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"பணி"</string>
- <string name="settingslib_category_private" msgid="5039276873477591386">"தனிப்பட்டவை"</string>
+ <string name="settingslib_category_private" msgid="5039276873477591386">"இரகசியமானவை"</string>
</resources>
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt
index dd7c036..a59a724 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt
@@ -23,8 +23,8 @@
import android.os.UserHandle
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.testing.TestLifecycleOwner
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Rule
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
index c60ce41..b1baa86 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
@@ -31,6 +31,8 @@
import android.os.BadParcelableException
import android.os.DeadObjectException
import android.os.UserManager
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -76,9 +78,7 @@
}
private val mockUserManager = mock<UserManager> {
- on { getUserInfo(ADMIN_USER_ID) } doReturn UserInfo().apply {
- flags = UserInfo.FLAG_ADMIN
- }
+ on { getUserInfo(ADMIN_USER_ID) } doReturn UserInfo(0, "admin", UserInfo.FLAG_ADMIN)
on { getProfileIdsWithDisabled(ADMIN_USER_ID) } doReturn
intArrayOf(ADMIN_USER_ID, MANAGED_PROFILE_USER_ID)
}
@@ -281,9 +281,9 @@
)
}
+ @EnableFlags(Flags.FLAG_PROVIDE_INFO_OF_APK_IN_APEX)
@Test
fun loadApps_hasApkInApexInfo_shouldNotIncludeAllHiddenApps() = runTest {
- mSetFlagsRule.enableFlags(Flags.FLAG_PROVIDE_INFO_OF_APK_IN_APEX)
packageManager.stub {
on { getInstalledModules(any()) } doReturn listOf(HIDDEN_MODULE)
}
@@ -297,9 +297,9 @@
assertThat(appList).containsExactly(NORMAL_APP)
}
+ @DisableFlags(Flags.FLAG_PROVIDE_INFO_OF_APK_IN_APEX)
@Test
fun loadApps_noApkInApexInfo_shouldNotIncludeHiddenSystemModule() = runTest {
- mSetFlagsRule.disableFlags(Flags.FLAG_PROVIDE_INFO_OF_APK_IN_APEX)
packageManager.stub {
on { getInstalledModules(any()) } doReturn listOf(HIDDEN_MODULE)
}
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 3c034c2..4b11a76 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -96,7 +96,7 @@
<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="2685517576209066008">"البلوتوث نشِط. مستوى شحن البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"البلوتوث نشِط. مستوى الشحن في سماعة الرأس اليسرى: <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_active_battery_level_untethered_left" msgid="2895644748625343977">"البلوتوث نشِط. مستوى الشحن في سماعة الرأس اليسرى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"نشِط. شحن سماعة الرأس اليسرى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"البلوتوث نشِط. مستوى الشحن في سماعة الرأس اليمنى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"مستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"مستوى شحن البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 874a153..3a08d2f 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -95,9 +95,9 @@
<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="2685517576209066008">"Activo. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string>
- <string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"Activo. Esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería. Dereito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería."</string>
- <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"Activo. Esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string>
- <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Activo. Dereito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string>
+ <string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"Activo. 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_active_battery_level_untethered_left" msgid="2895644748625343977">"Activo. E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string>
+ <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Activo. D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="1616774716076301755">"Esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería. Dereito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería."</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index f7d1ce2..f30a125 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -96,8 +96,8 @@
<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="2685517576209066008">"Используется, заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"Используется, заряд: <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_active_battery_level_untethered_left" msgid="2895644748625343977">"Используется, заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (Л)"</string>
- <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Используется, заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (П)"</string>
+ <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"Активно, заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (Л)"</string>
+ <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Активно, заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (П)"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Уровень заряда: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Батарея <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="1616774716076301755">"Заряд: <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>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index c33e425..3db7146 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -96,8 +96,8 @@
<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="2685517576209066008">"Aktiv. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri."</string>
<string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"Aktiv. Majtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateri, djathtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateri."</string>
- <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"Aktive. Majtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (niveli i baterisë)."</string>
- <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Aktive. Djathtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> (niveli i baterisë)."</string>
+ <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"Aktive. Majtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri."</string>
+ <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Aktive. Djathtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri."</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri"</string>
<string name="bluetooth_battery_level_untethered" msgid="1616774716076301755">"Majtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateri, djathtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateri."</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 00f4349..01b786d 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -96,7 +96,7 @@
<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="2685517576209066008">"Inatumika. Chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
<string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"Inatumika. 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_active_battery_level_untethered_left" msgid="2895644748625343977">"Inatumika. Kushoto: chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
+ <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"Inatumika. Kushoto: chaji <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
<string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Inatumika. Kulia: chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index e8acd6e..8aaeb5d 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -237,7 +237,7 @@
<string name="choose_profile" msgid="343803890897657450">"சுயவிவரத்தைத் தேர்வு செய்க"</string>
<string name="category_personal" msgid="6236798763159385225">"தனிப்பட்டவை"</string>
<string name="category_work" msgid="4014193632325996115">"பணியிடம்"</string>
- <string name="category_private" msgid="4244892185452788977">"தனிப்பட்டவை"</string>
+ <string name="category_private" msgid="4244892185452788977">"இரகசியமானவை"</string>
<string name="category_clone" msgid="1554511758987195974">"குளோன்"</string>
<string name="development_settings_title" msgid="140296922921597393">"டெவெலப்பர் விருப்பங்கள்"</string>
<string name="development_settings_enable" msgid="4285094651288242183">"டெவெலப்பர் விருப்பங்களை இயக்கு"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index d7cc91e..9bb4ef5 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -96,8 +96,8 @@
<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="2685517576209066008">"Đang hoạt động. Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin."</string>
<string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"Đang hoạt động. Bên trái: Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pin. Bên phải: Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pin."</string>
- <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"Đang hoạt động. Tai trái: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin."</string>
- <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Đang hoạt động. Tai phải: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin."</string>
+ <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"Đang hoạt động. Trái: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin."</string>
+ <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"Đang hoạt động. Phải: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin."</string>
<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="1616774716076301755">"Bên trái: Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pin. Bên phải: Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pin."</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index e16e46a..c1d5481 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -96,8 +96,8 @@
<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="2685517576209066008">"使用中。电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string>
<string name="bluetooth_active_battery_level_untethered" msgid="4961338936672922617">"使用中。左侧电池电量为 <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_active_battery_level_untethered_left" msgid="2895644748625343977">"使用中。左侧剩余电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string>
- <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"使用中。右侧剩余电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string>
+ <string name="bluetooth_active_battery_level_untethered_left" msgid="2895644748625343977">"使用中。左侧电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string>
+ <string name="bluetooth_active_battery_level_untethered_right" msgid="7407517998880370179">"使用中。右侧电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string>
<string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 的电量"</string>
<string name="tv_bluetooth_battery_level" msgid="8786353985605532846">"电池电量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_battery_level_untethered" msgid="1616774716076301755">"左侧电池电量为 <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>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 363045e..d373201 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -953,6 +953,18 @@
<string name="enable_verbose_vendor_logging">Enable verbose vendor logging</string>
<!-- UI debug setting: enable verbose vendor logging summary [CHAR LIMIT=NONE] -->
<string name="enable_verbose_vendor_logging_summary">Include additional device-specific vendor logs in bug reports, which may contain private information, use more battery, and/or use more storage.</string>
+ <!-- UI debug setting: checkbox text to disable verbose vendor logging after one day [CHAR LIMIT=50] -->
+ <string name="enable_verbose_vendor_logging_checkbox">Disable after one day</string>
+ <!-- UI debug setting: verbose vendor logging notification title [CHAR LIMIT=60] -->
+ <string name="verbose_vendor_logging_notification_title">Verbose vendor logging has ended</string>
+ <!-- UI debug setting: verbose vendor logging notification summary [CHAR LIMIT=60] -->
+ <string name="verbose_vendor_logging_notification_summary">Enabled for one day</string>
+ <!-- UI debug setting: verbose vendor logging notification action text [CHAR LIMIT=60] -->
+ <string name="verbose_vendor_logging_notification_action">Enable for one more day</string>
+ <!-- UI debug setting: verbose vendor logging preference summary for disabling after one day [CHAR LIMIT=60] -->
+ <string name="verbose_vendor_logging_preference_summary_will_disable">Disables after one day</string>
+ <!-- UI debug setting: verbose vendor logging preference summary for leaving setting enabled indefinitely [CHAR LIMIT=60] -->
+ <string name="verbose_vendor_logging_preference_summary_on">Enabled indefinitely</string>
<!-- UI debug setting: scaling factor for window animations [CHAR LIMIT=25] -->
<string name="window_animation_scale_title">Window animation scale</string>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index c8992c3..05eb044 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -18,6 +18,7 @@
import static android.os.Process.FIRST_APPLICATION_UID;
+import android.aconfig.Aconfig.flag_permission;
import android.aconfig.Aconfig.flag_state;
import android.aconfig.Aconfig.parsed_flag;
import android.aconfig.Aconfig.parsed_flags;
@@ -370,7 +371,6 @@
mAconfigDefaultFlags = new HashMap<>();
ProtoOutputStream requests = null;
- Map<String, AconfigdFlagInfo> aconfigFlagMap = new HashMap<>();
synchronized (mLock) {
readStateSyncLocked();
@@ -390,12 +390,12 @@
if (enableAconfigStorageDaemon()) {
if (isConfigSettingsKey(mKey)) {
- aconfigFlagMap = getAllAconfigFlagsFromSettings();
+ getAllAconfigFlagsFromSettings(mAconfigDefaultFlags);
}
}
if (isConfigSettingsKey(mKey)) {
- requests = handleBulkSyncToNewStorage(aconfigFlagMap);
+ requests = handleBulkSyncToNewStorage(mAconfigDefaultFlags);
}
}
@@ -414,7 +414,6 @@
Map<String, AconfigdFlagInfo> aconfigdFlagMap =
AconfigdJavaUtils.listFlagsValueInNewStorage(localSocket);
compareFlagValueInNewStorage(
- aconfigFlagMap,
mAconfigDefaultFlags,
aconfigdFlagMap);
}
@@ -424,7 +423,6 @@
// TOBO(b/312444587): remove the comparison logic after Test Mission 2.
public int compareFlagValueInNewStorage(
- Map<String, AconfigdFlagInfo> settingFlagMap,
Map<String, AconfigdFlagInfo> defaultFlagMap,
Map<String, AconfigdFlagInfo> aconfigdFlagMap) {
@@ -434,9 +432,6 @@
for (Map.Entry<String, AconfigdFlagInfo> entry : defaultFlagMap.entrySet()) {
String key = entry.getKey();
AconfigdFlagInfo flag = entry.getValue();
- if (settingFlagMap.containsKey(key)) {
- flag.merge(settingFlagMap.get(key));
- }
AconfigdFlagInfo aconfigdFlag = aconfigdFlagMap.get(key);
if (aconfigdFlag == null) {
@@ -460,14 +455,31 @@
diffNum++;
}
+ String compareMarkerName = "aconfigd_marker/compare_diff_num";
+ synchronized (mLock) {
+ Setting markerSetting = mSettings.get(compareMarkerName);
+ if (markerSetting == null) {
+ markerSetting =
+ new Setting(
+ compareMarkerName,
+ String.valueOf(diffNum),
+ false,
+ "aconfig",
+ "aconfig");
+ mSettings.put(compareMarkerName, markerSetting);
+ }
+ markerSetting.value = String.valueOf(diffNum);
+ }
+
if (diffNum == 0) {
- Slog.i(LOG_TAG, "Settings and new storage have same flags.");
+ Slog.w(LOG_TAG, "Settings and new storage have same flags.");
}
return diffNum;
}
@GuardedBy("mLock")
- public Map<String, AconfigdFlagInfo> getAllAconfigFlagsFromSettings() {
+ public int getAllAconfigFlagsFromSettings(
+ @NonNull Map<String, AconfigdFlagInfo> flagInfoDefault) {
Map<String, AconfigdFlagInfo> ret = new HashMap<>();
int numSettings = mSettings.size();
int num_requests = 0;
@@ -475,25 +487,24 @@
String name = mSettings.keyAt(i);
Setting setting = mSettings.valueAt(i);
AconfigdFlagInfo flag =
- getFlagOverrideToSync(name, setting.getValue());
+ getFlagOverrideToSync(name, setting.getValue(), flagInfoDefault);
if (flag == null) {
continue;
}
- String fullFlagName = flag.getFullFlagName();
- AconfigdFlagInfo prev = ret.putIfAbsent(fullFlagName,flag);
- if (prev != null) {
- prev.merge(flag);
+ if (flag.getIsReadWrite()) {
+ ++num_requests;
}
- ++num_requests;
}
Slog.i(LOG_TAG, num_requests + " flag override requests created");
- return ret;
+ return num_requests;
}
// TODO(b/341764371): migrate aconfig flag push to GMS core
@VisibleForTesting
@GuardedBy("mLock")
- public AconfigdFlagInfo getFlagOverrideToSync(String name, String value) {
+ @Nullable
+ public AconfigdFlagInfo getFlagOverrideToSync(
+ String name, String value, @NonNull Map<String, AconfigdFlagInfo> flagInfoDefault) {
int slashIdx = name.indexOf("/");
if (slashIdx <= 0 || slashIdx >= name.length() - 1) {
Slog.e(LOG_TAG, "invalid flag name " + name);
@@ -516,33 +527,23 @@
fullFlagName = fullFlagName.substring(colonIdx + 1);
isLocal = true;
}
-
- String aconfigName = namespace + "/" + fullFlagName;
- boolean isAconfig =
- mNamespaceDefaults.containsKey(namespace)
- && mNamespaceDefaults.get(namespace).containsKey(aconfigName);
- if (!isAconfig) {
- return null;
- }
-
// get package name and flag name
int dotIdx = fullFlagName.lastIndexOf(".");
if (dotIdx == -1) {
Slog.e(LOG_TAG, "invalid override flag name " + name);
return null;
}
-
- AconfigdFlagInfo.Builder builder = AconfigdFlagInfo.newBuilder()
- .setPackageName(fullFlagName.substring(0, dotIdx))
- .setFlagName(fullFlagName.substring(dotIdx + 1))
- .setDefaultFlagValue(mNamespaceDefaults.get(namespace).get(aconfigName));
+ AconfigdFlagInfo flag = flagInfoDefault.get(fullFlagName);
+ if (flag == null) {
+ return null;
+ }
if (isLocal) {
- builder.setHasLocalOverride(isLocal).setBootFlagValue(value).setLocalFlagValue(value);
+ flag.setLocalFlagValue(value);
} else {
- builder.setHasServerOverride(true).setServerFlagValue(value).setBootFlagValue(value);
+ flag.setServerFlagValue(value);
}
- return builder.build();
+ return flag;
}
@@ -574,16 +575,28 @@
// loop over all settings and add flag override requests
for (AconfigdFlagInfo flag : aconfigFlagMap.values()) {
- String value =
- flag.getHasLocalOverride()
- ? flag.getLocalFlagValue()
- : flag.getServerFlagValue();
- AconfigdJavaUtils.writeFlagOverrideRequest(
- requests,
- flag.getPackageName(),
- flag.getFlagName(),
- value,
- flag.getHasLocalOverride());
+ // don't sync read_only flags
+ if (!flag.getIsReadWrite()) {
+ continue;
+ }
+
+ if (flag.getHasServerOverride()) {
+ AconfigdJavaUtils.writeFlagOverrideRequest(
+ requests,
+ flag.getPackageName(),
+ flag.getFlagName(),
+ flag.getServerFlagValue(),
+ false);
+ }
+
+ if (flag.getHasLocalOverride()) {
+ AconfigdJavaUtils.writeFlagOverrideRequest(
+ requests,
+ flag.getPackageName(),
+ flag.getFlagName(),
+ flag.getLocalFlagValue(),
+ true);
+ }
}
// mark sync has been done
@@ -669,6 +682,7 @@
String fullFlagName = flag.getPackage() + "." + flag.getName();
String flagName = flag.getNamespace() + "/" + fullFlagName;
String flagValue = flag.getState() == flag_state.ENABLED ? "true" : "false";
+ boolean isReadWrite = flag.getPermission() == flag_permission.READ_WRITE;
defaultMap.get(flag.getNamespace()).put(flagName, flagValue);
if (!flagInfoDefault.containsKey(fullFlagName)) {
flagInfoDefault.put(
@@ -677,6 +691,7 @@
.setPackageName(flag.getPackage())
.setFlagName(flag.getName())
.setDefaultFlagValue(flagValue)
+ .setIsReadWrite(isReadWrite)
.build());
}
}
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
index 256b999..94aeb9b 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
@@ -143,18 +143,20 @@
.setDescription("another test flag")
.addBug("12345678")
.setState(Aconfig.flag_state.ENABLED)
- .setPermission(Aconfig.flag_permission.READ_WRITE))
+ .setPermission(Aconfig.flag_permission.READ_ONLY))
.build();
-
+
AconfigdFlagInfo flag1 = AconfigdFlagInfo.newBuilder()
.setPackageName("com.android.flags")
.setFlagName("flag1")
.setDefaultFlagValue("false")
+ .setIsReadWrite(true)
.build();
AconfigdFlagInfo flag2 = AconfigdFlagInfo.newBuilder()
.setPackageName("com.android.flags")
.setFlagName("flag2")
.setDefaultFlagValue("true")
+ .setIsReadWrite(false)
.build();
Map<String, AconfigdFlagInfo> flagInfoDefault = new HashMap<>();
@@ -984,66 +986,62 @@
}
@Test
- public void testGetFlagOverrideToSync() {
+ public void testGetFlagOverrideToSync() {
int configKey = SettingsState.makeKey(SettingsState.SETTINGS_TYPE_CONFIG, 0);
Object lock = new Object();
- SettingsState settingsState = new SettingsState(
- InstrumentationRegistry.getContext(), lock, mSettingsFile, configKey,
- SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());
- parsed_flags flags = parsed_flags
- .newBuilder()
- .addParsedFlag(parsed_flag
- .newBuilder()
- .setPackage("com.android.flags")
- .setName("flag1")
- .setNamespace("test_namespace")
- .setDescription("test flag")
- .addBug("12345678")
- .setState(Aconfig.flag_state.DISABLED)
- .setPermission(Aconfig.flag_permission.READ_WRITE))
- .build();
+ SettingsState settingsState =
+ new SettingsState(
+ InstrumentationRegistry.getContext(),
+ lock,
+ mSettingsFile,
+ configKey,
+ SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED,
+ Looper.getMainLooper());
Map<String, AconfigdFlagInfo> flagInfoDefault = new HashMap<>();
- synchronized (lock) {
- Map<String, Map<String, String>> defaults = new HashMap<>();
- settingsState.loadAconfigDefaultValues(
- flags.toByteArray(), defaults, flagInfoDefault);
- Map<String, String> namespaceDefaults = defaults.get("test_namespace");
- assertEquals(1, namespaceDefaults.keySet().size());
- settingsState.addAconfigDefaultValuesFromMap(defaults);
- }
-
// invalid flag name
- assertTrue(settingsState.getFlagOverrideToSync(
- "invalid_flag", "false") == null);
+ assertNull(settingsState.getFlagOverrideToSync("invalid_flag", "false", flagInfoDefault));
- // non aconfig flag
- assertTrue(settingsState.getFlagOverrideToSync(
- "some_namespace/some_flag", "false") == null);
+ // invalid local override flag name
+ assertNull(
+ settingsState.getFlagOverrideToSync(
+ "some_namespace/some_flag", "false", flagInfoDefault));
+
+ // not a aconfig flag
+ assertNull(
+ settingsState.getFlagOverrideToSync(
+ "some_namespace/some_flag.com", "false", flagInfoDefault));
+
+ AconfigdFlagInfo flag1 =
+ AconfigdFlagInfo.newBuilder()
+ .setPackageName("com.android.flags")
+ .setFlagName("flag1")
+ .setDefaultFlagValue("false")
+ .setIsReadWrite(true)
+ .build();
+
+ flagInfoDefault.put(flag1.getFullFlagName(), flag1);
// server override
- AconfigdFlagInfo flag = settingsState.getFlagOverrideToSync(
- "test_namespace/com.android.flags.flag1", "false");
- assertTrue(flag != null);
- assertEquals(flag.getPackageName(), "com.android.flags");
- assertEquals(flag.getFlagName(), "flag1");
- assertEquals("false", flag.getBootFlagValue());
- assertEquals("false", flag.getServerFlagValue());
- assertFalse(flag.getHasLocalOverride());
- assertNull(flag.getLocalFlagValue());
- assertEquals("false", flag.getDefaultFlagValue());
+
+ settingsState.getFlagOverrideToSync(
+ "test_namespace/com.android.flags.flag1", "true", flagInfoDefault);
+ assertEquals("com.android.flags", flag1.getPackageName());
+ assertEquals("flag1", flag1.getFlagName());
+ assertEquals("true", flag1.getBootFlagValue());
+ assertEquals("true", flag1.getServerFlagValue());
+ assertEquals("false", flag1.getDefaultFlagValue());
+ assertTrue(flag1.getHasServerOverride());
+ assertNull(flag1.getLocalFlagValue());
// local override
- flag = settingsState.getFlagOverrideToSync(
- "device_config_overrides/test_namespace:com.android.flags.flag1", "false");
- assertTrue(flag != null);
- assertEquals(flag.getPackageName(), "com.android.flags");
- assertEquals(flag.getFlagName(), "flag1");
- assertEquals("false", flag.getLocalFlagValue());
- assertEquals("false", flag.getBootFlagValue());
- assertTrue(flag.getHasLocalOverride());
- assertNull(flag.getServerFlagValue());
- assertEquals("false", flag.getDefaultFlagValue());
+ settingsState.getFlagOverrideToSync(
+ "device_config_overrides/test_namespace:com.android.flags.flag1",
+ "false",
+ flagInfoDefault);
+ assertEquals("false", flag1.getBootFlagValue());
+ assertEquals("false", flag1.getLocalFlagValue());
+ assertTrue(flag1.getHasLocalOverride());
}
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@@ -1053,20 +1051,37 @@
public void testHandleBulkSyncWithAconfigdEnabled() {
int configKey = SettingsState.makeKey(SettingsState.SETTINGS_TYPE_CONFIG, 0);
Object lock = new Object();
- SettingsState settingsState = new SettingsState(
- InstrumentationRegistry.getContext(), lock, mSettingsFile, configKey,
- SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());
+ SettingsState settingsState =
+ new SettingsState(
+ InstrumentationRegistry.getContext(),
+ lock,
+ mSettingsFile,
+ configKey,
+ SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED,
+ Looper.getMainLooper());
Map<String, AconfigdFlagInfo> flags = new HashMap<>();
- AconfigdFlagInfo flag = AconfigdFlagInfo.newBuilder()
- .setPackageName("com.android.flags")
- .setFlagName("flag1")
- .setBootFlagValue("true").build();
- flags.put("com.android.flags/flag1", flag);
+ flags.put(
+ "com.android.flags/flag1",
+ AconfigdFlagInfo.newBuilder()
+ .setPackageName("com.android.flags")
+ .setFlagName("flag1")
+ .setBootFlagValue("true")
+ .setIsReadWrite(true)
+ .build());
+
+ flags.put(
+ "com.android.flags/flag2",
+ AconfigdFlagInfo.newBuilder()
+ .setPackageName("com.android.flags")
+ .setFlagName("flag2")
+ .setBootFlagValue("true")
+ .setIsReadWrite(false)
+ .build());
synchronized (lock) {
- settingsState.insertSettingLocked("aconfigd_marker/bulk_synced",
- "false", null, false, "aconfig");
+ settingsState.insertSettingLocked(
+ "aconfigd_marker/bulk_synced", "false", null, false, "aconfig");
// first bulk sync
ProtoOutputStream requests = settingsState.handleBulkSyncToNewStorage(flags);
@@ -1125,6 +1140,8 @@
+ "value=\"true\" package=\"com.android.flags\" />"
+ " <setting id=\"3\" name=\"test_namespace/com.android.flags.flag3\" "
+ "value=\"true\" package=\"com.android.flags\" />"
+ + " <setting id=\"3\" name=\"device_config_overrides/test_namespace:com.android.flags.flag3\" "
+ + "value=\"true\" package=\"com.android.flags\" />"
+ "</settings>");
os.close();
@@ -1134,97 +1151,76 @@
InstrumentationRegistry.getContext(), lock, mSettingsFile, configKey,
SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());
- Map<String, AconfigdFlagInfo> ret;
- synchronized (lock) {
- ret = settingsState.getAllAconfigFlagsFromSettings();
- }
-
- assertTrue(ret.isEmpty());
-
- parsed_flags flags =
- parsed_flags
- .newBuilder()
- .addParsedFlag(
- parsed_flag
- .newBuilder()
- .setPackage("com.android.flags")
- .setName("flag1")
- .setNamespace("test_namespace")
- .setDescription("test flag")
- .addBug("12345678")
- .setState(Aconfig.flag_state.DISABLED)
- .setPermission(Aconfig.flag_permission.READ_WRITE))
- .addParsedFlag(
- parsed_flag
- .newBuilder()
- .setPackage("com.android.flags")
- .setName("flag2")
- .setNamespace("test_namespace")
- .setDescription("test flag")
- .addBug("12345678")
- .setState(Aconfig.flag_state.DISABLED)
- .setPermission(Aconfig.flag_permission.READ_WRITE))
- .addParsedFlag(
- parsed_flag
- .newBuilder()
- .setPackage("com.android.flags")
- .setName("flag3")
- .setNamespace("test_namespace")
- .setDescription("test flag")
- .addBug("12345678")
- .setState(Aconfig.flag_state.DISABLED)
- .setPermission(Aconfig.flag_permission.READ_WRITE))
- .build();
-
- Map<String, Map<String, String>> defaults = new HashMap<>();
+ int ret;
Map<String, AconfigdFlagInfo> flagInfoDefault = new HashMap<>();
synchronized (lock) {
- settingsState.loadAconfigDefaultValues(
- flags.toByteArray(), defaults, flagInfoDefault);
- settingsState.addAconfigDefaultValuesFromMap(defaults);
- ret = settingsState.getAllAconfigFlagsFromSettings();
+ ret = settingsState.getAllAconfigFlagsFromSettings(flagInfoDefault);
}
+ assertEquals(0, ret);
- AconfigdFlagInfo expectedFlag1 =
+ AconfigdFlagInfo flag1 =
AconfigdFlagInfo.newBuilder()
.setPackageName("com.android.flags")
.setFlagName("flag1")
- .setServerFlagValue("false")
- .setLocalFlagValue("true")
.setDefaultFlagValue("false")
- .setBootFlagValue("true")
- .setHasServerOverride(true)
- .setHasLocalOverride(true)
- .setIsReadWrite(false)
+ .setIsReadWrite(true)
.build();
+ flagInfoDefault.put(flag1.getFullFlagName(), flag1);
- AconfigdFlagInfo expectedFlag2 =
+ synchronized (lock) {
+ ret = settingsState.getAllAconfigFlagsFromSettings(flagInfoDefault);
+ }
+ assertEquals(2, ret);
+ assertEquals("com.android.flags", flag1.getPackageName());
+ assertEquals("flag1", flag1.getFlagName());
+ assertEquals("true", flag1.getBootFlagValue());
+ assertEquals("true", flag1.getLocalFlagValue());
+ assertEquals("false", flag1.getServerFlagValue());
+ assertEquals("false", flag1.getDefaultFlagValue());
+ assertTrue(flag1.getHasServerOverride());
+ assertTrue(flag1.getHasLocalOverride());
+
+ AconfigdFlagInfo flag2 =
AconfigdFlagInfo.newBuilder()
.setPackageName("com.android.flags")
.setFlagName("flag2")
- .setLocalFlagValue("true")
.setDefaultFlagValue("false")
- .setBootFlagValue("true")
- .setHasLocalOverride(true)
- .setHasServerOverride(false)
- .setIsReadWrite(false)
+ .setIsReadWrite(true)
.build();
+ flagInfoDefault.put(flag2.getFullFlagName(), flag2);
+ synchronized (lock) {
+ ret = settingsState.getAllAconfigFlagsFromSettings(flagInfoDefault);
+ }
+ assertEquals(3, ret);
+ assertEquals("com.android.flags", flag2.getPackageName());
+ assertEquals("flag2", flag2.getFlagName());
+ assertEquals("true", flag2.getBootFlagValue());
+ assertEquals("true", flag2.getLocalFlagValue());
+ assertEquals("false", flag2.getDefaultFlagValue());
+ assertNull(flag2.getServerFlagValue());
+ assertFalse(flag2.getHasServerOverride());
+ assertTrue(flag2.getHasLocalOverride());
-
- AconfigdFlagInfo expectedFlag3 =
+ AconfigdFlagInfo flag3 =
AconfigdFlagInfo.newBuilder()
.setPackageName("com.android.flags")
.setFlagName("flag3")
- .setServerFlagValue("true")
- .setBootFlagValue("true")
.setDefaultFlagValue("false")
- .setHasServerOverride(true)
.setIsReadWrite(false)
.build();
-
- assertEquals(expectedFlag1, ret.get("com.android.flags.flag1"));
- assertEquals(expectedFlag2, ret.get("com.android.flags.flag2"));
- assertEquals(expectedFlag3, ret.get("com.android.flags.flag3"));
+ flagInfoDefault.put(flag3.getFullFlagName(), flag3);
+ synchronized (lock) {
+ ret = settingsState.getAllAconfigFlagsFromSettings(flagInfoDefault);
+ }
+ assertEquals(3, ret);
+ assertEquals("com.android.flags", flag3.getPackageName());
+ assertEquals("flag3", flag3.getFlagName());
+ assertEquals("false", flag3.getBootFlagValue());
+ assertEquals("false", flag3.getDefaultFlagValue());
+ assertNull(flag3.getLocalFlagValue());
+ assertNull(flag3.getServerFlagValue());
+ assertFalse(flag3.getHasServerOverride());
+ assertFalse(flag3.getHasLocalOverride());
}
@Test
@@ -1245,37 +1241,34 @@
.setPackageName("com.android.flags")
.setFlagName("flag1")
.setDefaultFlagValue("false")
- .build();
-
- AconfigdFlagInfo settingFlag1 =
- AconfigdFlagInfo.newBuilder()
- .setPackageName("com.android.flags")
- .setFlagName("flag1")
.setServerFlagValue("true")
.setHasServerOverride(true)
+ .setIsReadWrite(true)
.build();
AconfigdFlagInfo expectedFlag1 =
AconfigdFlagInfo.newBuilder()
.setPackageName("com.android.flags")
.setFlagName("flag1")
- .setBootFlagValue("true")
.setServerFlagValue("true")
.setDefaultFlagValue("false")
.setHasServerOverride(true)
+ .setIsReadWrite(true)
.build();
- Map<String, AconfigdFlagInfo> settingMap = new HashMap<>();
Map<String, AconfigdFlagInfo> aconfigdMap = new HashMap<>();
Map<String, AconfigdFlagInfo> defaultMap = new HashMap<>();
defaultMap.put("com.android.flags.flag1", defaultFlag1);
- settingMap.put("com.android.flags.flag1", settingFlag1);
aconfigdMap.put("com.android.flags.flag1", expectedFlag1);
- int ret = settingsState.compareFlagValueInNewStorage(settingMap, defaultMap, aconfigdMap);
+ int ret = settingsState.compareFlagValueInNewStorage(defaultMap, aconfigdMap);
assertEquals(0, ret);
+ String value =
+ settingsState.getSettingLocked("aconfigd_marker/compare_diff_num").getValue();
+ assertEquals("0", value);
+
AconfigdFlagInfo defaultFlag2 =
AconfigdFlagInfo.newBuilder()
.setPackageName("com.android.flags")
@@ -1284,7 +1277,29 @@
.build();
defaultMap.put("com.android.flags.flag2", defaultFlag2);
- ret = settingsState.compareFlagValueInNewStorage(settingMap, defaultMap, aconfigdMap);
+ ret = settingsState.compareFlagValueInNewStorage(defaultMap, aconfigdMap);
+ // missing from new storage
assertEquals(1, ret);
+ value =
+ settingsState.getSettingLocked("aconfigd_marker/compare_diff_num").getValue();
+ assertEquals("1", value);
+
+ AconfigdFlagInfo expectedFlag2 =
+ AconfigdFlagInfo.newBuilder()
+ .setPackageName("com.android.flags")
+ .setFlagName("flag2")
+ .setServerFlagValue("true")
+ .setLocalFlagValue("true")
+ .setDefaultFlagValue("false")
+ .setHasServerOverride(true)
+ .setHasLocalOverride(true)
+ .build();
+ aconfigdMap.put("com.android.flags.flag2", expectedFlag2);
+ ret = settingsState.compareFlagValueInNewStorage(defaultMap, aconfigdMap);
+ // skip the server and local value comparison when the flag is read_only
+ assertEquals(0, ret);
+ value =
+ settingsState.getSettingLocked("aconfigd_marker/compare_diff_num").getValue();
+ assertEquals("0", value);
}
}
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml
index 5c3c99c..36fcfdc 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml
@@ -21,7 +21,7 @@
<string name="previous_button_content_description" msgid="840869171117765966">"Idi na prethodni zaslon"</string>
<string name="next_button_content_description" msgid="6810058269847364406">"Idi na sljedeći zaslon"</string>
<string name="accessibility_menu_description" msgid="4458354794093858297">"Izbornik pristupačnosti veliki je zaslonski izbornik koji vam omogućuje upravljanje uređajem. Putem njega možete zaključati uređaj, upravljati glasnoćom i svjetlinom, izrađivati snimke zaslona i drugo."</string>
- <string name="accessibility_menu_summary" msgid="340071398148208130">"Upravljanje uređajem pomoću velikog izbornika"</string>
+ <string name="accessibility_menu_summary" msgid="340071398148208130">"Upravljajte uređajem pomoću velikog izbornika"</string>
<string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Postavke izbornika pristupačnosti"</string>
<string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Veliki gumbi"</string>
<string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povećanje veličine gumba izbornika Pristupačnosti"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
index f5baae2..dd149ba 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
@@ -91,25 +91,29 @@
private final DisplayManager.DisplayListener mDisplayListener =
new DisplayManager.DisplayListener() {
- int mRotation;
+ int mRotation;
- @Override
- public void onDisplayAdded(int displayId) {}
+ @Override
+ public void onDisplayAdded(int displayId) {
+ }
- @Override
- public void onDisplayRemoved(int displayId) {
- // TODO(b/136716947): Need to reset A11yMenuOverlayLayout by display id.
- }
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ // TODO(b/136716947): Need to reset A11yMenuOverlayLayout by display id.
+ }
- @Override
- public void onDisplayChanged(int displayId) {
- Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
- if (mRotation != display.getRotation()) {
- mRotation = display.getRotation();
- mA11yMenuLayout.updateViewLayout();
- }
- }
- };
+ @Override
+ public void onDisplayChanged(int displayId) {
+ if (mA11yMenuLayout == null) {
+ return;
+ }
+ Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ if (mRotation != display.getRotation()) {
+ mRotation = display.getRotation();
+ mA11yMenuLayout.updateViewLayout();
+ }
+ }
+ };
private final BroadcastReceiver mHideMenuReceiver = new BroadcastReceiver() {
@Override
@@ -373,6 +377,7 @@
public boolean onUnbind(Intent intent) {
unregisterReceiver(mHideMenuReceiver);
unregisterReceiver(mToggleMenuReceiver);
+ mDisplayManager.unregisterDisplayListener(mDisplayListener);
mPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener);
sInitialized = false;
if (mA11yMenuLayout != null) {
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index 1cbf67e..0fdcc7a 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -884,16 +884,6 @@
}
flag {
- name: "shade_collapse_activity_launch_fix"
- namespace: "systemui"
- description: "Avoid collapsing the shade on activity launch if it is already collapsed, as this causes a flicker."
- bug: "331591373"
- metadata {
- purpose: PURPOSE_BUGFIX
- }
-}
-
-flag {
name: "slice_broadcast_relay_in_background"
namespace: "systemui"
description: "Move handling of slice broadcast relay broadcasts to background threads"
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
index c4659cf..87bac83 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
@@ -226,10 +226,14 @@
scene(
CommunalScenes.Communal,
- userActions =
- mapOf(Swipe(SwipeDirection.Right, fromSource = Edge.Left) to CommunalScenes.Blank)
+ userActions = mapOf(Swipe(SwipeDirection.Right) to CommunalScenes.Blank)
) {
- CommunalScene(backgroundType, colors, content)
+ CommunalScene(
+ backgroundType = backgroundType,
+ colors = colors,
+ content = content,
+ modifier = Modifier.horizontalNestedScrollToScene(),
+ )
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
index 927890e..fbfe050 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
@@ -378,16 +378,6 @@
onCancel = viewModel::onEnableWorkProfileDialogCancel
)
}
-
- // This spacer covers the edge of the LazyHorizontalGrid and prevents it from receiving
- // touches, so that the SceneTransitionLayout can intercept the touches and allow an edge
- // swipe back to the blank scene.
- Spacer(
- Modifier.height(Dimensions.GridHeight)
- .align(Alignment.CenterStart)
- .width(Dimensions.Spacing)
- .pointerInput(Unit) {}
- )
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
index 45a8393..a2426a6 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
@@ -28,6 +28,7 @@
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBars
@@ -65,6 +66,7 @@
import androidx.compose.ui.util.lerp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.ElementKey
+import com.android.compose.animation.scene.LowestZIndexScenePicker
import com.android.compose.animation.scene.NestedScrollBehavior
import com.android.compose.animation.scene.SceneScope
import com.android.compose.modifiers.thenIf
@@ -89,7 +91,8 @@
object Elements {
val NotificationScrim = ElementKey("NotificationScrim")
val NotificationStackPlaceholder = ElementKey("NotificationStackPlaceholder")
- val HeadsUpNotificationPlaceholder = ElementKey("HeadsUpNotificationPlaceholder")
+ val HeadsUpNotificationPlaceholder =
+ ElementKey("HeadsUpNotificationPlaceholder", scenePicker = LowestZIndexScenePicker)
val ShelfSpace = ElementKey("ShelfSpace")
}
@@ -112,10 +115,10 @@
modifier: Modifier = Modifier,
isPeekFromBottom: Boolean = false,
) {
- Element(
- Notifications.Elements.HeadsUpNotificationPlaceholder,
+ Box(
modifier =
modifier
+ .element(Notifications.Elements.HeadsUpNotificationPlaceholder)
.fillMaxWidth()
.notificationHeadsUpHeight(stackScrollView)
.debugBackground(viewModel, DEBUG_HUN_COLOR)
@@ -129,9 +132,7 @@
// Note: boundsInWindow doesn't scroll off the screen
stackScrollView.setHeadsUpTop(boundsInWindow.top)
}
- ) {
- content {}
- }
+ )
}
/** Adds the space where notification stack should appear in the scene. */
@@ -155,6 +156,11 @@
viewModel = viewModel,
modifier = Modifier.align(Alignment.TopCenter),
)
+ NotificationStackCutoffGuideline(
+ stackScrollView = stackScrollView,
+ viewModel = viewModel,
+ modifier = Modifier.align(Alignment.BottomCenter),
+ )
}
}
@@ -171,6 +177,7 @@
shouldPunchHoleBehindScrim: Boolean,
shouldFillMaxSize: Boolean = true,
shouldReserveSpaceForNavBar: Boolean = true,
+ shouldIncludeHeadsUpSpace: Boolean = true,
shadeMode: ShadeMode,
modifier: Modifier = Modifier,
) {
@@ -187,8 +194,12 @@
viewModel.isCurrentGestureOverscroll.collectAsStateWithLifecycle(false)
val expansionFraction by viewModel.expandFraction.collectAsStateWithLifecycle(0f)
- val navBarHeight =
- with(density) { WindowInsets.systemBars.asPaddingValues().calculateBottomPadding().toPx() }
+ val navBarHeightPx =
+ with(density) {
+ WindowInsets.systemBars.asPaddingValues().calculateBottomPadding().toPx().toInt()
+ }
+ val bottomPaddingPx = if (shouldReserveSpaceForNavBar) navBarHeightPx else 0
+
val screenHeight = LocalRawScreenHeight.current
/**
@@ -352,14 +363,13 @@
}
.verticalScroll(scrollState)
.fillMaxWidth()
- .notificationStackHeight(
- view = stackScrollView,
- padding = if (shouldReserveSpaceForNavBar) navBarHeight.toInt() else 0
- )
+ .notificationStackHeight(view = stackScrollView, padding = bottomPaddingPx)
.onSizeChanged { size -> stackHeight.intValue = size.height },
)
}
- HeadsUpNotificationSpace(stackScrollView = stackScrollView, viewModel = viewModel)
+ if (shouldIncludeHeadsUpSpace) {
+ HeadsUpNotificationSpace(stackScrollView = stackScrollView, viewModel = viewModel)
+ }
}
}
@@ -395,6 +405,29 @@
)
}
+/**
+ * A 0 height horizontal spacer to be placed at the bottom-most position in the current scene, where
+ * the notification contents (stack, footer, shelf) should be drawn.
+ */
+@Composable
+fun NotificationStackCutoffGuideline(
+ stackScrollView: NotificationScrollView,
+ viewModel: NotificationsPlaceholderViewModel,
+ modifier: Modifier = Modifier,
+) {
+ Spacer(
+ modifier =
+ modifier
+ .fillMaxWidth()
+ .height(0.dp)
+ .onGloballyPositioned { coordinates ->
+ val positionY = coordinates.positionInWindow().y
+ debugLog(viewModel) { "STACK cutoff onGloballyPositioned: y=$positionY" }
+ stackScrollView.setStackCutoff(positionY)
+ }
+ )
+}
+
@Composable
private fun SceneScope.NotificationPlaceholder(
stackScrollView: NotificationScrollView,
@@ -417,7 +450,6 @@
}
// NOTE: positionInWindow.y scrolls off screen, but boundsInWindow.top will not
stackScrollView.setStackTop(positionInWindow.y)
- stackScrollView.setStackBottom(positionInWindow.y + coordinates.size.height)
}
)
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
index 1b49b67..644040d 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
@@ -42,6 +42,7 @@
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBars
+import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.rememberScrollState
@@ -62,6 +63,7 @@
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.SceneScope
@@ -82,6 +84,7 @@
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.dagger.MediaModule
import com.android.systemui.notifications.ui.composable.HeadsUpNotificationSpace
+import com.android.systemui.notifications.ui.composable.NotificationScrollingStack
import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility
import com.android.systemui.qs.ui.composable.QuickSettings.SharedValues.MediaLandscapeTopOffset
import com.android.systemui.qs.ui.composable.QuickSettings.SharedValues.MediaOffset.InQS
@@ -90,6 +93,7 @@
import com.android.systemui.scene.session.ui.composable.SaveableSession
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
+import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.shade.ui.composable.CollapsedShadeHeader
import com.android.systemui.shade.ui.composable.ExpandedShadeHeader
import com.android.systemui.shade.ui.composable.Shade
@@ -102,6 +106,7 @@
import dagger.Lazy
import javax.inject.Inject
import javax.inject.Named
+import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
@@ -400,5 +405,16 @@
modifier = Modifier.align(Alignment.BottomCenter),
isPeekFromBottom = true,
)
+ NotificationScrollingStack(
+ shadeSession = shadeSession,
+ stackScrollView = notificationStackScrollView,
+ viewModel = notificationsPlaceholderViewModel,
+ maxScrimTop = { screenHeight },
+ shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim,
+ shouldIncludeHeadsUpSpace = false,
+ shadeMode = ShadeMode.Single,
+ modifier =
+ Modifier.fillMaxWidth().offset { IntOffset(x = 0, y = screenHeight.roundToInt()) },
+ )
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
index ec81e23..edef5fb 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
@@ -35,6 +35,7 @@
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
+import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
@@ -82,6 +83,7 @@
import com.android.systemui.media.controls.ui.view.MediaHostState
import com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL
import com.android.systemui.notifications.ui.composable.NotificationScrollingStack
+import com.android.systemui.notifications.ui.composable.NotificationStackCutoffGuideline
import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility
import com.android.systemui.qs.ui.composable.BrightnessMirror
import com.android.systemui.qs.ui.composable.QSMediaMeasurePolicy
@@ -350,6 +352,11 @@
notificationsPlaceable.placeRelative(x = 0, y = maxNotifScrimTop.value.roundToInt())
}
}
+ NotificationStackCutoffGuideline(
+ stackScrollView = notificationStackScrollView,
+ viewModel = viewModel.notifications,
+ modifier = Modifier.align(Alignment.BottomCenter).navigationBarsPadding()
+ )
}
}
@@ -529,6 +536,7 @@
viewModel = viewModel.notifications,
maxScrimTop = { 0f },
shouldPunchHoleBehindScrim = false,
+ shouldReserveSpaceForNavBar = false,
shadeMode = ShadeMode.Split,
modifier =
Modifier.weight(1f)
@@ -538,5 +546,10 @@
)
}
}
+ NotificationStackCutoffGuideline(
+ stackScrollView = notificationStackScrollView,
+ viewModel = viewModel.notifications,
+ modifier = Modifier.align(Alignment.BottomCenter).navigationBarsPadding()
+ )
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelTest.kt
index 3f93401..6d9c271 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelTest.kt
@@ -225,13 +225,13 @@
setUpState(isUdfpsSupported = true)
assertThat(accessibilityDelegateHint)
- .isEqualTo(DeviceEntryIconView.AccessibilityHintType.AUTHENTICATE)
+ .isEqualTo(DeviceEntryIconView.AccessibilityHintType.BOUNCER)
- // interactive lock icon for non udfps as well so that user can navigate to bouncer
+ // non-interactive lock icon
fingerprintPropertyRepository.supportsRearFps()
assertThat(accessibilityDelegateHint)
- .isEqualTo(DeviceEntryIconView.AccessibilityHintType.AUTHENTICATE)
+ .isEqualTo(DeviceEntryIconView.AccessibilityHintType.BOUNCER)
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
index ca4434d2..cc3fdc5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
@@ -32,6 +32,8 @@
import com.android.systemui.scene.shared.model.fakeSceneDataSource
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
+import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationTransitionThresholds.EXPANSION_FOR_DELAYED_STACK_FADE_IN
+import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationTransitionThresholds.EXPANSION_FOR_MAX_SCRIM_ALPHA
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationScrollViewModel
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel
import com.android.systemui.testKosmos
@@ -208,4 +210,50 @@
assertThat(expandFraction).isEqualTo(1f)
assertThat(isScrollable).isFalse()
}
+
+ @Test
+ fun shadeExpansion_goneToQs() =
+ testScope.runTest {
+ val transitionState =
+ MutableStateFlow<ObservableTransitionState>(
+ ObservableTransitionState.Idle(currentScene = Scenes.Gone)
+ )
+ sceneInteractor.setTransitionState(transitionState)
+ val expandFraction by collectLastValue(scrollViewModel.expandFraction)
+ assertThat(expandFraction).isEqualTo(0f)
+
+ fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
+ val isScrollable by collectLastValue(scrollViewModel.isScrollable)
+ assertThat(isScrollable).isFalse()
+
+ fakeSceneDataSource.pause()
+
+ sceneInteractor.changeScene(Scenes.QuickSettings, "reason")
+ val transitionProgress = MutableStateFlow(0f)
+ transitionState.value =
+ ObservableTransitionState.Transition(
+ fromScene = Scenes.Gone,
+ toScene = Scenes.QuickSettings,
+ currentScene = flowOf(Scenes.QuickSettings),
+ progress = transitionProgress,
+ isInitiatedByUserInput = false,
+ isUserInputOngoing = flowOf(false),
+ )
+ val steps = 10
+ repeat(steps) { repetition ->
+ val progress = (1f / steps) * (repetition + 1)
+ transitionProgress.value = progress
+ runCurrent()
+ assertThat(expandFraction)
+ .isEqualTo(
+ (progress / EXPANSION_FOR_MAX_SCRIM_ALPHA -
+ EXPANSION_FOR_DELAYED_STACK_FADE_IN)
+ .coerceIn(0f, 1f)
+ )
+ }
+
+ fakeSceneDataSource.unpause(expectedScene = Scenes.QuickSettings)
+ assertThat(expandFraction).isEqualTo(1f)
+ assertThat(isScrollable).isFalse()
+ }
}
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index de53f9f..544adee 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -23,7 +23,7 @@
<string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN кодуңузду киргизиңиз"</string>
<string name="keyguard_enter_pin" msgid="8114529922480276834">"PIN кодду киргизиңиз"</string>
<string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Графикалык ачкычты тартыңыз"</string>
- <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Графикалык ачкчты тартңыз"</string>
+ <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Графикалык ачкычты тартыңыз"</string>
<string name="keyguard_enter_your_password" msgid="7225626204122735501">"Сырсөзүңүздү киргизиңиз"</string>
<string name="keyguard_enter_password" msgid="6483623792371009758">"Сырсөздү киргизиңиз"</string>
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM-карта жараксыз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index f0d9596..3411571 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -25,7 +25,7 @@
<string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ਆਪਣਾ ਪੈਟਰਨ ਦਾਖਲ ਕਰੋ"</string>
<string name="keyguard_enter_pattern" msgid="7616595160901084119">"ਪੈਟਰਨ ਬਣਾਓ"</string>
<string name="keyguard_enter_your_password" msgid="7225626204122735501">"ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string>
- <string name="keyguard_enter_password" msgid="6483623792371009758">"ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string>
+ <string name="keyguard_enter_password" msgid="6483623792371009758">"ਪਾਸਵਰਡ ਪਾਓ"</string>
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ਅਵੈਧ ਕਾਰਡ।"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ਚਾਰਜ ਹੋ ਗਿਆ"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ਬਿਨਾਂ ਤਾਰ ਤੋਂ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
diff --git a/packages/SystemUI/res/drawable/audio_bars_playing.xml b/packages/SystemUI/res/drawable/audio_bars_playing.xml
deleted file mode 100644
index 6a6706a..0000000
--- a/packages/SystemUI/res/drawable/audio_bars_playing.xml
+++ /dev/null
@@ -1,457 +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.
- -->
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <target android:name="_R_G_L_4_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="283"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueTo="M-37.16 -13.39 C-33.94,-13.39 -31.32,-10.83 -31.2,-7.64 C-31.2,-7.57 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,6.79 -31.2,6.86 C-31.31,10.05 -33.94,12.61 -37.16,12.61 C-40.39,12.61 -43.01,10.05 -43.12,6.85 C-43.12,6.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-7.58 -43.12,-7.66 C-42.99,-10.84 -40.37,-13.39 -37.16,-13.39c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="433"
- android:propertyName="pathData"
- android:startOffset="283"
- android:valueFrom="M-37.16 -13.39 C-33.94,-13.39 -31.32,-10.83 -31.2,-7.64 C-31.2,-7.57 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,6.79 -31.2,6.86 C-31.31,10.05 -33.94,12.61 -37.16,12.61 C-40.39,12.61 -43.01,10.05 -43.12,6.85 C-43.12,6.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-7.58 -43.12,-7.66 C-42.99,-10.84 -40.37,-13.39 -37.16,-13.39c "
- android:valueTo="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="417"
- android:propertyName="pathData"
- android:startOffset="717"
- android:valueFrom="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueTo="M-37.16 -13.39 C-33.94,-13.39 -31.32,-10.83 -31.2,-7.64 C-31.2,-7.57 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,6.79 -31.2,6.86 C-31.31,10.05 -33.94,12.61 -37.16,12.61 C-40.39,12.61 -43.01,10.05 -43.12,6.85 C-43.12,6.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-7.58 -43.12,-7.66 C-42.99,-10.84 -40.37,-13.39 -37.16,-13.39c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="467"
- android:propertyName="pathData"
- android:startOffset="1133"
- android:valueFrom="M-37.16 -13.39 C-33.94,-13.39 -31.32,-10.83 -31.2,-7.64 C-31.2,-7.57 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,6.79 -31.2,6.86 C-31.31,10.05 -33.94,12.61 -37.16,12.61 C-40.39,12.61 -43.01,10.05 -43.12,6.85 C-43.12,6.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-7.58 -43.12,-7.66 C-42.99,-10.84 -40.37,-13.39 -37.16,-13.39c "
- android:valueTo="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="433"
- android:propertyName="pathData"
- android:startOffset="1600"
- android:valueFrom="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueTo="M-37.16 -13.39 C-33.94,-13.39 -31.32,-10.83 -31.2,-7.64 C-31.2,-7.57 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,6.79 -31.2,6.86 C-31.31,10.05 -33.94,12.61 -37.16,12.61 C-40.39,12.61 -43.01,10.05 -43.12,6.85 C-43.12,6.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-7.58 -43.12,-7.66 C-42.99,-10.84 -40.37,-13.39 -37.16,-13.39c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="517"
- android:propertyName="pathData"
- android:startOffset="2033"
- android:valueFrom="M-37.16 -13.39 C-33.94,-13.39 -31.32,-10.83 -31.2,-7.64 C-31.2,-7.57 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,6.79 -31.2,6.86 C-31.31,10.05 -33.94,12.61 -37.16,12.61 C-40.39,12.61 -43.01,10.05 -43.12,6.85 C-43.12,6.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-7.58 -43.12,-7.66 C-42.99,-10.84 -40.37,-13.39 -37.16,-13.39c "
- android:valueTo="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_3_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="367"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueTo="M-37.16 -18.51 C-33.94,-18.51 -31.32,-15.96 -31.2,-12.77 C-31.2,-12.7 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.16 -31.2,13.23 C-31.31,16.43 -33.94,18.99 -37.16,18.99 C-40.39,18.99 -43.01,16.43 -43.12,13.23 C-43.12,13.16 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-12.71 -43.12,-12.78 C-42.99,-15.97 -40.37,-18.51 -37.16,-18.51c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="433"
- android:propertyName="pathData"
- android:startOffset="367"
- android:valueFrom="M-37.16 -18.51 C-33.94,-18.51 -31.32,-15.96 -31.2,-12.77 C-31.2,-12.7 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.16 -31.2,13.23 C-31.31,16.43 -33.94,18.99 -37.16,18.99 C-40.39,18.99 -43.01,16.43 -43.12,13.23 C-43.12,13.16 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-12.71 -43.12,-12.78 C-42.99,-15.97 -40.37,-18.51 -37.16,-18.51c "
- android:valueTo="M-37.16 -9.14 C-33.94,-9.14 -31.32,-6.58 -31.2,-3.39 C-31.2,-3.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,3.79 -31.2,3.86 C-31.31,7.05 -33.94,9.61 -37.16,9.61 C-40.39,9.61 -43.01,7.05 -43.12,3.85 C-43.12,3.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-3.33 -43.12,-3.41 C-42.99,-6.59 -40.37,-9.14 -37.16,-9.14c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="417"
- android:propertyName="pathData"
- android:startOffset="800"
- android:valueFrom="M-37.16 -9.14 C-33.94,-9.14 -31.32,-6.58 -31.2,-3.39 C-31.2,-3.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,3.79 -31.2,3.86 C-31.31,7.05 -33.94,9.61 -37.16,9.61 C-40.39,9.61 -43.01,7.05 -43.12,3.85 C-43.12,3.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-3.33 -43.12,-3.41 C-42.99,-6.59 -40.37,-9.14 -37.16,-9.14c "
- android:valueTo="M-37.16 -18.51 C-33.94,-18.51 -31.32,-15.96 -31.2,-12.77 C-31.2,-12.7 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.16 -31.2,13.23 C-31.31,16.43 -33.94,18.99 -37.16,18.99 C-40.39,18.99 -43.01,16.43 -43.12,13.23 C-43.12,13.16 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-12.71 -43.12,-12.78 C-42.99,-15.97 -40.37,-18.51 -37.16,-18.51c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="467"
- android:propertyName="pathData"
- android:startOffset="1217"
- android:valueFrom="M-37.16 -18.51 C-33.94,-18.51 -31.32,-15.96 -31.2,-12.77 C-31.2,-12.7 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.16 -31.2,13.23 C-31.31,16.43 -33.94,18.99 -37.16,18.99 C-40.39,18.99 -43.01,16.43 -43.12,13.23 C-43.12,13.16 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-12.71 -43.12,-12.78 C-42.99,-15.97 -40.37,-18.51 -37.16,-18.51c "
- android:valueTo="M-37.16 -9.14 C-33.94,-9.14 -31.32,-6.58 -31.2,-3.39 C-31.2,-3.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,3.79 -31.2,3.86 C-31.31,7.05 -33.94,9.61 -37.16,9.61 C-40.39,9.61 -43.01,7.05 -43.12,3.85 C-43.12,3.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-3.33 -43.12,-3.41 C-42.99,-6.59 -40.37,-9.14 -37.16,-9.14c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="450"
- android:propertyName="pathData"
- android:startOffset="1683"
- android:valueFrom="M-37.16 -9.14 C-33.94,-9.14 -31.32,-6.58 -31.2,-3.39 C-31.2,-3.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,3.79 -31.2,3.86 C-31.31,7.05 -33.94,9.61 -37.16,9.61 C-40.39,9.61 -43.01,7.05 -43.12,3.85 C-43.12,3.79 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-3.33 -43.12,-3.41 C-42.99,-6.59 -40.37,-9.14 -37.16,-9.14c "
- android:valueTo="M-37.16 -18.51 C-33.94,-18.51 -31.32,-15.96 -31.2,-12.77 C-31.2,-12.7 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.16 -31.2,13.23 C-31.31,16.43 -33.94,18.99 -37.16,18.99 C-40.39,18.99 -43.01,16.43 -43.12,13.23 C-43.12,13.16 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-12.71 -43.12,-12.78 C-42.99,-15.97 -40.37,-18.51 -37.16,-18.51c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="417"
- android:propertyName="pathData"
- android:startOffset="2133"
- android:valueFrom="M-37.16 -18.51 C-33.94,-18.51 -31.32,-15.96 -31.2,-12.77 C-31.2,-12.7 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.16 -31.2,13.23 C-31.31,16.43 -33.94,18.99 -37.16,18.99 C-40.39,18.99 -43.01,16.43 -43.12,13.23 C-43.12,13.16 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-12.71 -43.12,-12.78 C-42.99,-15.97 -40.37,-18.51 -37.16,-18.51c "
- android:valueTo="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_2_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="433"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueTo="M-37.16 -25.01 C-33.94,-25.01 -31.32,-22.46 -31.2,-19.27 C-31.2,-19.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,19.54 -31.2,19.6 C-31.31,22.8 -33.94,25.36 -37.16,25.36 C-40.39,25.36 -43.01,22.8 -43.12,19.6 C-43.12,19.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-19.21 -43.12,-19.28 C-42.99,-22.47 -40.37,-25.01 -37.16,-25.01c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="450"
- android:propertyName="pathData"
- android:startOffset="433"
- android:valueFrom="M-37.16 -25.01 C-33.94,-25.01 -31.32,-22.46 -31.2,-19.27 C-31.2,-19.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,19.54 -31.2,19.6 C-31.31,22.8 -33.94,25.36 -37.16,25.36 C-40.39,25.36 -43.01,22.8 -43.12,19.6 C-43.12,19.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-19.21 -43.12,-19.28 C-42.99,-22.47 -40.37,-25.01 -37.16,-25.01c "
- android:valueTo="M-37.16 -15.76 C-33.94,-15.76 -31.32,-13.21 -31.2,-10.02 C-31.2,-9.95 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,10.54 -31.2,10.61 C-31.31,13.8 -33.94,16.36 -37.16,16.36 C-40.39,16.36 -43.01,13.8 -43.12,10.6 C-43.12,10.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-9.96 -43.12,-10.03 C-42.99,-13.22 -40.37,-15.76 -37.16,-15.76c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="417"
- android:propertyName="pathData"
- android:startOffset="883"
- android:valueFrom="M-37.16 -15.76 C-33.94,-15.76 -31.32,-13.21 -31.2,-10.02 C-31.2,-9.95 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,10.54 -31.2,10.61 C-31.31,13.8 -33.94,16.36 -37.16,16.36 C-40.39,16.36 -43.01,13.8 -43.12,10.6 C-43.12,10.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-9.96 -43.12,-10.03 C-42.99,-13.22 -40.37,-15.76 -37.16,-15.76c "
- android:valueTo="M-37.16 -25.01 C-33.94,-25.01 -31.32,-22.46 -31.2,-19.27 C-31.2,-19.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,19.54 -31.2,19.6 C-31.31,22.8 -33.94,25.36 -37.16,25.36 C-40.39,25.36 -43.01,22.8 -43.12,19.6 C-43.12,19.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-19.21 -43.12,-19.28 C-42.99,-22.47 -40.37,-25.01 -37.16,-25.01c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="467"
- android:propertyName="pathData"
- android:startOffset="1300"
- android:valueFrom="M-37.16 -25.01 C-33.94,-25.01 -31.32,-22.46 -31.2,-19.27 C-31.2,-19.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,19.54 -31.2,19.6 C-31.31,22.8 -33.94,25.36 -37.16,25.36 C-40.39,25.36 -43.01,22.8 -43.12,19.6 C-43.12,19.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-19.21 -43.12,-19.28 C-42.99,-22.47 -40.37,-25.01 -37.16,-25.01c "
- android:valueTo="M-37.16 -15.76 C-33.94,-15.76 -31.32,-13.21 -31.2,-10.02 C-31.2,-9.95 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,10.54 -31.2,10.61 C-31.31,13.8 -33.94,16.36 -37.16,16.36 C-40.39,16.36 -43.01,13.8 -43.12,10.6 C-43.12,10.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-9.96 -43.12,-10.03 C-42.99,-13.22 -40.37,-15.76 -37.16,-15.76c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="433"
- android:propertyName="pathData"
- android:startOffset="1767"
- android:valueFrom="M-37.16 -15.76 C-33.94,-15.76 -31.32,-13.21 -31.2,-10.02 C-31.2,-9.95 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,10.54 -31.2,10.61 C-31.31,13.8 -33.94,16.36 -37.16,16.36 C-40.39,16.36 -43.01,13.8 -43.12,10.6 C-43.12,10.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-9.96 -43.12,-10.03 C-42.99,-13.22 -40.37,-15.76 -37.16,-15.76c "
- android:valueTo="M-37.16 -25.01 C-33.94,-25.01 -31.32,-22.46 -31.2,-19.27 C-31.2,-19.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,19.54 -31.2,19.6 C-31.31,22.8 -33.94,25.36 -37.16,25.36 C-40.39,25.36 -43.01,22.8 -43.12,19.6 C-43.12,19.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-19.21 -43.12,-19.28 C-42.99,-22.47 -40.37,-25.01 -37.16,-25.01c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:startOffset="2200"
- android:valueFrom="M-37.16 -25.01 C-33.94,-25.01 -31.32,-22.46 -31.2,-19.27 C-31.2,-19.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,19.54 -31.2,19.6 C-31.31,22.8 -33.94,25.36 -37.16,25.36 C-40.39,25.36 -43.01,22.8 -43.12,19.6 C-43.12,19.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-19.21 -43.12,-19.28 C-42.99,-22.47 -40.37,-25.01 -37.16,-25.01c "
- android:valueTo="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_1_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="500"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueTo="M-37.16 -38.14 C-33.94,-38.14 -31.32,-35.58 -31.2,-32.39 C-31.2,-32.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,32.04 -31.2,32.1 C-31.31,35.3 -33.94,37.86 -37.16,37.86 C-40.39,37.86 -43.01,35.3 -43.12,32.1 C-43.12,32.04 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-32.33 -43.12,-32.41 C-42.99,-35.59 -40.37,-38.14 -37.16,-38.14c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="467"
- android:propertyName="pathData"
- android:startOffset="500"
- android:valueFrom="M-37.16 -38.14 C-33.94,-38.14 -31.32,-35.58 -31.2,-32.39 C-31.2,-32.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,32.04 -31.2,32.1 C-31.31,35.3 -33.94,37.86 -37.16,37.86 C-40.39,37.86 -43.01,35.3 -43.12,32.1 C-43.12,32.04 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-32.33 -43.12,-32.41 C-42.99,-35.59 -40.37,-38.14 -37.16,-38.14c "
- android:valueTo="M-37.16 -19.01 C-33.94,-19.01 -31.32,-16.46 -31.2,-13.27 C-31.2,-13.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.66 -31.2,13.73 C-31.31,16.93 -33.94,19.49 -37.16,19.49 C-40.39,19.49 -43.01,16.93 -43.12,13.73 C-43.12,13.66 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-13.21 -43.12,-13.28 C-42.99,-16.47 -40.37,-19.01 -37.16,-19.01c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="383"
- android:propertyName="pathData"
- android:startOffset="967"
- android:valueFrom="M-37.16 -19.01 C-33.94,-19.01 -31.32,-16.46 -31.2,-13.27 C-31.2,-13.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.66 -31.2,13.73 C-31.31,16.93 -33.94,19.49 -37.16,19.49 C-40.39,19.49 -43.01,16.93 -43.12,13.73 C-43.12,13.66 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-13.21 -43.12,-13.28 C-42.99,-16.47 -40.37,-19.01 -37.16,-19.01c "
- android:valueTo="M-37.16 -38.14 C-33.94,-38.14 -31.32,-35.58 -31.2,-32.39 C-31.2,-32.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,32.04 -31.2,32.1 C-31.31,35.3 -33.94,37.86 -37.16,37.86 C-40.39,37.86 -43.01,35.3 -43.12,32.1 C-43.12,32.04 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-32.33 -43.12,-32.41 C-42.99,-35.59 -40.37,-38.14 -37.16,-38.14c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="467"
- android:propertyName="pathData"
- android:startOffset="1350"
- android:valueFrom="M-37.16 -38.14 C-33.94,-38.14 -31.32,-35.58 -31.2,-32.39 C-31.2,-32.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,32.04 -31.2,32.1 C-31.31,35.3 -33.94,37.86 -37.16,37.86 C-40.39,37.86 -43.01,35.3 -43.12,32.1 C-43.12,32.04 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-32.33 -43.12,-32.41 C-42.99,-35.59 -40.37,-38.14 -37.16,-38.14c "
- android:valueTo="M-37.16 -19.01 C-33.94,-19.01 -31.32,-16.46 -31.2,-13.27 C-31.2,-13.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.66 -31.2,13.73 C-31.31,16.93 -33.94,19.49 -37.16,19.49 C-40.39,19.49 -43.01,16.93 -43.12,13.73 C-43.12,13.66 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-13.21 -43.12,-13.28 C-42.99,-16.47 -40.37,-19.01 -37.16,-19.01c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="433"
- android:propertyName="pathData"
- android:startOffset="1817"
- android:valueFrom="M-37.16 -19.01 C-33.94,-19.01 -31.32,-16.46 -31.2,-13.27 C-31.2,-13.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,13.66 -31.2,13.73 C-31.31,16.93 -33.94,19.49 -37.16,19.49 C-40.39,19.49 -43.01,16.93 -43.12,13.73 C-43.12,13.66 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-13.21 -43.12,-13.28 C-42.99,-16.47 -40.37,-19.01 -37.16,-19.01c "
- android:valueTo="M-37.16 -38.14 C-33.94,-38.14 -31.32,-35.58 -31.2,-32.39 C-31.2,-32.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,32.04 -31.2,32.1 C-31.31,35.3 -33.94,37.86 -37.16,37.86 C-40.39,37.86 -43.01,35.3 -43.12,32.1 C-43.12,32.04 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-32.33 -43.12,-32.41 C-42.99,-35.59 -40.37,-38.14 -37.16,-38.14c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="300"
- android:propertyName="pathData"
- android:startOffset="2250"
- android:valueFrom="M-37.16 -38.14 C-33.94,-38.14 -31.32,-35.58 -31.2,-32.39 C-31.2,-32.32 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,32.04 -31.2,32.1 C-31.31,35.3 -33.94,37.86 -37.16,37.86 C-40.39,37.86 -43.01,35.3 -43.12,32.1 C-43.12,32.04 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-32.33 -43.12,-32.41 C-42.99,-35.59 -40.37,-38.14 -37.16,-38.14c "
- android:valueTo="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="533"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueTo="M-37.16 -22.64 C-33.94,-22.64 -31.32,-20.08 -31.2,-16.89 C-31.2,-16.82 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,17.41 -31.2,17.48 C-31.31,20.68 -33.94,23.24 -37.16,23.24 C-40.39,23.24 -43.01,20.68 -43.12,17.48 C-43.12,17.41 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-16.83 -43.12,-16.91 C-42.99,-20.09 -40.37,-22.64 -37.16,-22.64c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="433"
- android:propertyName="pathData"
- android:startOffset="533"
- android:valueFrom="M-37.16 -22.64 C-33.94,-22.64 -31.32,-20.08 -31.2,-16.89 C-31.2,-16.82 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,17.41 -31.2,17.48 C-31.31,20.68 -33.94,23.24 -37.16,23.24 C-40.39,23.24 -43.01,20.68 -43.12,17.48 C-43.12,17.41 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-16.83 -43.12,-16.91 C-42.99,-20.09 -40.37,-22.64 -37.16,-22.64c "
- android:valueTo="M-37.18 -14.01 C-33.96,-14.01 -31.33,-11.46 -31.22,-8.27 C-31.22,-8.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,8.54 -31.2,8.61 C-31.31,11.8 -33.94,14.36 -37.16,14.36 C-40.39,14.36 -43.01,11.8 -43.12,8.6 C-43.12,8.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.14,-8.21 -43.13,-8.28 C-43.01,-11.47 -40.39,-14.01 -37.18,-14.01c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="417"
- android:propertyName="pathData"
- android:startOffset="967"
- android:valueFrom="M-37.18 -14.01 C-33.96,-14.01 -31.33,-11.46 -31.22,-8.27 C-31.22,-8.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,8.54 -31.2,8.61 C-31.31,11.8 -33.94,14.36 -37.16,14.36 C-40.39,14.36 -43.01,11.8 -43.12,8.6 C-43.12,8.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.14,-8.21 -43.13,-8.28 C-43.01,-11.47 -40.39,-14.01 -37.18,-14.01c "
- android:valueTo="M-37.16 -22.64 C-33.94,-22.64 -31.32,-20.08 -31.2,-16.89 C-31.2,-16.82 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,17.41 -31.2,17.48 C-31.31,20.68 -33.94,23.24 -37.16,23.24 C-40.39,23.24 -43.01,20.68 -43.12,17.48 C-43.12,17.41 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-16.83 -43.12,-16.91 C-42.99,-20.09 -40.37,-22.64 -37.16,-22.64c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="483"
- android:propertyName="pathData"
- android:startOffset="1383"
- android:valueFrom="M-37.16 -22.64 C-33.94,-22.64 -31.32,-20.08 -31.2,-16.89 C-31.2,-16.82 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,17.41 -31.2,17.48 C-31.31,20.68 -33.94,23.24 -37.16,23.24 C-40.39,23.24 -43.01,20.68 -43.12,17.48 C-43.12,17.41 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-16.83 -43.12,-16.91 C-42.99,-20.09 -40.37,-22.64 -37.16,-22.64c "
- android:valueTo="M-37.18 -14.01 C-33.96,-14.01 -31.33,-11.46 -31.22,-8.27 C-31.22,-8.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,8.54 -31.2,8.61 C-31.31,11.8 -33.94,14.36 -37.16,14.36 C-40.39,14.36 -43.01,11.8 -43.12,8.6 C-43.12,8.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.14,-8.21 -43.13,-8.28 C-43.01,-11.47 -40.39,-14.01 -37.18,-14.01c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="417"
- android:propertyName="pathData"
- android:startOffset="1867"
- android:valueFrom="M-37.18 -14.01 C-33.96,-14.01 -31.33,-11.46 -31.22,-8.27 C-31.22,-8.2 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,8.54 -31.2,8.61 C-31.31,11.8 -33.94,14.36 -37.16,14.36 C-40.39,14.36 -43.01,11.8 -43.12,8.6 C-43.12,8.54 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.14,-8.21 -43.13,-8.28 C-43.01,-11.47 -40.39,-14.01 -37.18,-14.01c "
- android:valueTo="M-37.16 -22.64 C-33.94,-22.64 -31.32,-20.08 -31.2,-16.89 C-31.2,-16.82 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,17.41 -31.2,17.48 C-31.31,20.68 -33.94,23.24 -37.16,23.24 C-40.39,23.24 -43.01,20.68 -43.12,17.48 C-43.12,17.41 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-16.83 -43.12,-16.91 C-42.99,-20.09 -40.37,-22.64 -37.16,-22.64c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="267"
- android:propertyName="pathData"
- android:startOffset="2283"
- android:valueFrom="M-37.16 -22.64 C-33.94,-22.64 -31.32,-20.08 -31.2,-16.89 C-31.2,-16.82 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,17.41 -31.2,17.48 C-31.31,20.68 -33.94,23.24 -37.16,23.24 C-40.39,23.24 -43.01,20.68 -43.12,17.48 C-43.12,17.41 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-16.83 -43.12,-16.91 C-42.99,-20.09 -40.37,-22.64 -37.16,-22.64c "
- android:valueTo="M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="2567"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <aapt:attr name="android:drawable">
- <vector
- android:width="168dp"
- android:height="168dp"
- android:viewportHeight="168"
- android:viewportWidth="168">
- <group android:name="_R_G">
- <group
- android:name="_R_G_L_4_G"
- android:translateX="84.411"
- android:translateY="83.911">
- <path
- android:name="_R_G_L_4_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c " />
- </group>
- <group
- android:name="_R_G_L_3_G"
- android:translateX="121.161"
- android:translateY="83.911">
- <path
- android:name="_R_G_L_3_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c " />
- </group>
- <group
- android:name="_R_G_L_2_G"
- android:translateX="102.911"
- android:translateY="83.911">
- <path
- android:name="_R_G_L_2_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c " />
- </group>
- <group
- android:name="_R_G_L_1_G"
- android:translateX="139.661"
- android:translateY="83.911">
- <path
- android:name="_R_G_L_1_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c " />
- </group>
- <group
- android:name="_R_G_L_0_G"
- android:translateX="157.911"
- android:translateY="83.911">
- <path
- android:name="_R_G_L_0_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M-37.16 -5.87 C-33.94,-5.87 -31.32,-3.32 -31.2,-0.13 C-31.2,-0.06 -31.2,0.02 -31.2,0.09 C-31.2,0.16 -31.2,0.23 -31.2,0.29 C-31.31,3.49 -33.94,6.05 -37.16,6.05 C-40.39,6.05 -43.01,3.49 -43.12,0.29 C-43.12,0.23 -43.12,0.16 -43.12,0.09 C-43.12,0.01 -43.12,-0.07 -43.12,-0.15 C-42.99,-3.33 -40.37,-5.87 -37.16,-5.87c " />
- </group>
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-</animated-vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index ad56216..39a1f1f 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -13,7 +13,9 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:sysui="http://schemas.android.com/apk/res-auto"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:id="@+id/volume_dialog_container"
android:layout_width="wrap_content"
@@ -94,18 +96,16 @@
android:paddingLeft="@dimen/volume_dialog_ringer_rows_padding"
android:paddingBottom="@dimen/volume_dialog_ringer_rows_padding"
android:paddingRight="@dimen/volume_dialog_ringer_rows_padding">
-
<com.android.keyguard.AlphaOptimizedImageButton
android:id="@+id/settings"
+ android:src="@drawable/horizontal_ellipsis"
android:layout_width="@dimen/volume_dialog_tap_target_size"
android:layout_height="@dimen/volume_dialog_tap_target_size"
android:layout_gravity="center"
- android:background="@drawable/ripple_drawable_20dp"
android:contentDescription="@string/accessibility_volume_settings"
- android:scaleType="centerInside"
- android:soundEffectsEnabled="false"
- android:src="@drawable/horizontal_ellipsis"
- android:tint="?androidprv:attr/colorAccent" />
+ android:background="@drawable/ripple_drawable_20dp"
+ android:tint="?androidprv:attr/colorAccent"
+ android:soundEffectsEnabled="false" />
</FrameLayout>
</LinearLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index a7dfdaa..c775336 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tik om te bekyk"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Kon nie skermopname stoor nie"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Kon nie skermopname begin nie"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Kwessieopnemer"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Verwerk tans kwessieopname"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Deurlopende kennisgewing vir ’n kwessieversamelingsessie"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Kon nie kwessieopname stoor nie"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Kon nie kwessieopname begin nie"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Bekyk tans volskerm"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Swiep van bo af as jy wil uitgaan."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Het dit"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Terug"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Tuis"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Gestoor"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ontkoppel"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiveer"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Skakel dit môre outomaties weer aan"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Kenmerke soos Kitsdeel en Kry My Toestel gebruik Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth sal môreoggend aanskakel"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Vou ikoon in"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vou ikoon uit"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Sleutelbordlig"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Vlak %1$d van %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Huiskontroles"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 396837e..de4138f 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ለመመልከት መታ ያድርጉ"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"የማያ ገጽ ቀረጻን ማስቀመጥ ላይ ስህተት"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"የማያ ገፅ ቀረጻን መጀመር ላይ ስህተት"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ችግር መመዝገቢያ"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"የአሰራር ችግር አመዘጋገብ"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ለችግር መሰብሰብ ክፍለ ጊዜ ቀጣይነት ያለው ማሳወቂያ"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"የችግር ምዝገባ ማስቀመጥ ላይ ስህተት"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"ችግር ምዝገባ ማስጀመር ላይ ስህተት"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"በሙሉ ገጽ ዕይታ በማየት ላይ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ለመውጣት፣ ከላይ ወደታች ያንሸራትቱ።"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"ገባኝ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ተመለስ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"መነሻ"</string>
@@ -278,13 +299,12 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"እንደ ፈጣን ማጋራት እና የእኔን መሣሪያ አግኝ ያሉ ባህሪዎች ብሉቱዝን ይጠቀማሉ"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"ብሉቱዝ ነገ ጠዋት ይበራል"</string>
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (3069309588231072128) -->
- <skip />
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="7545274861795853838">"ኦዲዮ አጋራ"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="3069309588231072128">"ኦዲዮ በማጋራት ላይ"</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>
@@ -1325,6 +1345,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"መሰብሰቢያ አዶ"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"መዘርጊያ አዶ"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ወይም"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"የቁልፍ ሰሌዳ የጀርባ ብርሃን"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"ደረጃ %1$d ከ %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"የቤት ውስጥ ቁጥጥሮች"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 254549f..8bd52d6 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"انقر لعرض التسجيل"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"حدث خطأ أثناء حفظ تسجيل محتوى الشاشة."</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"حدث خطأ في بدء تسجيل الشاشة"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"مسجّلة المشاكل"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"يجري معالجة تسجيل المشكلة."</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"إشعار بنشاط مستمر في الخلفية لجلسة جمع البيانات حول المشكلة"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"حدث خطأ أثناء حفظ تسجيل المشكلة."</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"حدث خطأ أثناء بدء تسجيل المشكلة."</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"جارٍ العرض بملء الشاشة"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"للخروج، مرِّر سريعًا من أعلى الشاشة لأسفلها."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"حسنًا"</string>
<string name="accessibility_back" msgid="6530104400086152611">"رجوع"</string>
<string name="accessibility_home" msgid="5430449841237966217">"الرئيسية"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,8 +1347,16 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"رمز التصغير"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"رمز التوسيع"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"أو"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"الإضاءة الخلفية للوحة المفاتيح"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"مستوى الإضاءة: %1$d من %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"إدارة المنزل آليًّا"</string>
- <string name="home_controls_dream_description" msgid="4644150952104035789">"إدارة المنزل آليًّا بشكل سريع من شاشة الاستراحة"</string>
+ <string name="home_controls_dream_description" msgid="4644150952104035789">"يمكنك إدارة المنزل آليًّا بشكل سريع من شاشة الاستراحة"</string>
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index dd71023..77774cc 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"চাবলৈ টিপক"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ৰেকৰ্ড কৰা স্ক্ৰীন ছেভ কৰোঁতে আসোঁৱাহ হৈছে"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"স্ক্রীন ৰেকৰ্ড কৰা আৰম্ভ কৰোঁতে আসোঁৱাহ হৈছে"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"সমস্যা ৰেকৰ্ডাৰ"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"সমস্যা ৰেকৰ্ড কৰি থকা হৈছে"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"সমস্যা সংগ্ৰহ কৰা এটা ছেশ্বনৰ বাবে চলিত জাননী"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"সমস্যাৰ ৰেকৰ্ডিং ছেভ কৰাত আসোঁৱাহ"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"সমস্যাৰ ৰেকৰ্ডিং আৰম্ভ কৰোঁতে আসোঁৱাহ হৈছে"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"পূৰ্ণ স্ক্ৰীনত চাই আছে"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"বাহিৰ হ’বলৈ ওপৰৰ পৰা তললৈ ছোৱাইপ কৰক।"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"বুজি পালোঁ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"উভতি যাওক"</string>
<string name="accessibility_home" msgid="5430449841237966217">"গৃহ পৃষ্ঠাৰ বুটাম"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"সংকোচন কৰাৰ চিহ্ন"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"বিস্তাৰ কৰাৰ চিহ্ন"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"কীব’ৰ্ডৰ বেকলাইট"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dৰ %1$d স্তৰ"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ঘৰৰ সা-সৰঞ্জামৰ নিয়ন্ত্ৰণ"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 592bc06..bf24c07 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Baxmaq üçün toxunun"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Ekran çəkimini yadda saxlayarkən xəta oldu"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Ekranın yazılması ilə bağlı xəta"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Problem qeydə alan"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Problem qeydi emal edilir"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Problemin əldə edilməsi sessiyası üçün davam edən bildiriş"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Problem qeydini yadda saxlayarkən xəta"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Problemi qeydə almağa başlayarkən xəta"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Tam ekran rejimi"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Çıxmaq üçün yuxarıdan aşağı sürüşdürün."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Anladım"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Geri"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Ana səhifə"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Yadda saxlandı"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"əlaqəni kəsin"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivləşdirin"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Sabah avtomatik aktiv edin"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Cəld Paylaşım və Cihazın Tapılması kimi funksiyalar Bluetooth istifadə edir"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth sabah səhər aktiv ediləcək"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"İkonanı yığcamlaşdırın"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"İkonanı genişləndirin"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"və ya"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatura işığı"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Səviyyə %1$d/%2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Ev nizamlayıcıları"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 9b27943..02271f0 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Dodirnite da biste pregledali"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Greška pri čuvanju snimka ekrana"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Greška pri pokretanju snimanja ekrana"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Snimač problema"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Obrađuje se snimak problema"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"obaveštenje o aktivnosti u toku za sesiju prikupljanja podataka o problemu"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Greška pri čuvanju snimka problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Greška pri pokretanju snimanja problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Prikazuje se ceo ekran"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Da biste izašli, prevucite nadole odozgo."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Važi"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Nazad"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Početna"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Sačuvano"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekinite vezu"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivirajte"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatski ponovo uključi sutra"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <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 ujutru"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za skupljanje"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvetljenje tastature"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. nivo od %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrole za dom"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index ca763cf..ed44819 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Націсніце для прагляду"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Памылка захавання запісу экрана"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Памылка пачатку запісу экрана"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Запіс праблемы"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Ідзе апрацоўка запісу праблемы"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Бягучае апавяшчэнне пра сеанс збору даных аб праблеме"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Пры захаванні запісу праблемы адбылася памылка"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Пры спробе пачаць запіс праблемы адбылася памылка"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Прагляд у поўнаэкранным рэжыме"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Каб выйсці, правядзіце пальцам па экране зверху ўніз."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Зразумела"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"На Галоўную старонку"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок \"Згарнуць\""</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Разгарнуць\""</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Падсветка клавіятуры"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Узровень %1$d з %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Кіраванне домам"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index d50b116..b88e0e4 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Докоснете за преглед"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Грешка при запазването на записа на екрана"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"При стартирането на записа на екрана възникна грешка"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Записване на проблем"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Записът се обработва"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Текущо известие за сесия за събиране на данни за проблем"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Грешка при запазването на записа на проблема"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Грешка при стартирането на записа на проблема"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Изглед на цял екран"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"За изход прекарайте пръст надолу от горната част."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Разбрах"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Начало"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за свиване"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за разгъване"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Подсветка на клавиатурата"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Ниво %1$d от %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Контроли за дома"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index bb41b1b..0e44b3c 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"দেখতে ট্যাপ করুন"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"স্ক্রিন রেকর্ডিং সেভ করার সময় কোনও সমস্যা হয়েছে"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"স্ক্রিন রেকর্ডিং শুরু করার সময় সমস্যা হয়েছে"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Recorder-এ সমস্যা হয়েছে"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"সমস্যা সংক্রান্ত রেকর্ডিং প্রসেস করা হচ্ছে"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"সমস্যা সংগ্রহ সেশনের জন্য অনগোইং নোটিফিকেশন"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"সমস্যা সংক্রান্ত রেকর্ডিং সেভ করার সময় সমস্যা হয়েছে"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"সমস্যা সংক্রান্ত রেকর্ডিং শুরু করতে সমস্যা হয়েছে"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"ফুল-স্ক্রিনে দেখা হচ্ছে"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"বেরিয়ে যেতে উপর থেকে নিচের দিকে সোয়াইপ করুন।"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"বুঝেছি"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ফিরুন"</string>
<string name="accessibility_home" msgid="5430449841237966217">"হোম"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"আইকন আড়াল করুন"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"আইকন বড় করুন"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"অথবা"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"কীবোর্ড ব্যাকলাইট"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-এর মধ্যে %1$d লেভেল"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"হোম কন্ট্রোল"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 4916d80..a7f9068 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Dodirnite da vidite"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Greška prilikom pohranjivanja snimka ekrana"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Greška pri pokretanju snimanja ekrana"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Snimač problema"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Obrada snimka problema"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Obavještenje o aktivnosti u pozadini za sesiju prikupljanja podataka o problemu"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Došlo je do greške prilikom pohranjivanja snimka problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Došlo je do greške prilikom pokretanja snimanja problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Prikazivanje preko cijelog ekrana"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Da izađete, prevucite s vrha nadolje."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Razumijem"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Nazad"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Dugme za početnu stranicu"</string>
@@ -278,13 +299,12 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (3069309588231072128) -->
- <skip />
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="7545274861795853838">"Dijeli zvuk"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="3069309588231072128">"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">"Zvuk"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Slušalice"</string>
@@ -1325,8 +1345,16 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sužavanja"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona proširivanja"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvjetljenje tastature"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. nivo od %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrole za dom"</string>
- <string name="home_controls_dream_description" msgid="4644150952104035789">"Brzo pristupajte kontrolama za dom kao čuvaru ekrana"</string>
+ <string name="home_controls_dream_description" msgid="4644150952104035789">"Brzo pristupajte kontrolama za dom putem čuvara ekrana"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 5afad1b..4f055d4 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Toca per veure-la"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"S\'ha produït un error en desar la gravació de la pantalla"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"S\'ha produït un error en iniciar la gravació de pantalla"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Gravadora de problemes"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Processant gravació del problema"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notificació en curs d\'una sessió de recollida de dades del problema"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"S\'ha produït un error en desar la gravació del problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"S\'ha produït un error en iniciar la gravació del problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visualització en pantalla completa"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Per sortir, llisca cap avall des de la part superior."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Entesos"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Enrere"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Inici"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Desat"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconnecta"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activa"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Torna\'l a activar automàticament demà"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Les funcions com Quick Share i Troba el meu dispositiu utilitzen el Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"El Bluetooth s\'activarà demà al matí"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Replega la icona"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Desplega la icona"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroil·luminació del teclat"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivell %1$d de %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Controls de la llar"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index b5293c0..e50fea5 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Klepnutím nahrávku zobrazíte"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Při ukládání záznamu obrazovky došlo k chybě"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Při spouštění nahrávání obrazovky došlo k chybě"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Rekordér problémů"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Zpracování záznamu problému"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Upozornění na probíhající shromažďování dat o problému"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Při ukládání záznamu problému došlo k chybě"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Při zahájení záznamu problému došlo k chybě"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Zobrazování přes celou obrazovku"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Režim ukončíte přejetím prstem shora dolů."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Rozumím"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Zpět"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Domů"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Uloženo"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"odpojit"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivovat"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Zítra znovu automaticky zapnout"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Bluetooth využívají funkce jako Quick Share a Najdi moje zařízení."</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth se zapne zítra ráno."</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona sbalení"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalení"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"nebo"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podsvícení klávesnice"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Úroveň %1$d z %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Ovládání domácnosti"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 6e2323b..310f2b1 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tryk for at se"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Skærmoptagelsen kunne ikke gemmes"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Skærmoptagelsen kunne ikke startes"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Problemoptagelse"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Behandler optagelse af problem"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Igangværende notifikation om en session med problemindsamling"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Kunne ikke gemme optagelse af problem"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Fejl under forsøg på at starte optagelse af problem"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visning i fuld skærm"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Stryg ned fra toppen for at afslutte."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Tilbage"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Hjem"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon for Skjul"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon for Udvid"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastaturets baggrundslys"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d af %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Hjemmestyring"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index bf28a88..27f6b57 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Zum Ansehen tippen"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Fehler beim Speichern der Bildschirmaufzeichnung"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Fehler beim Start der Bildschirmaufzeichnung"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Problem aufzeichnen"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Aufzeichnung wird verarbeitet"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Benachrichtigung über laufende Aufzeichnung eines Problems"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Fehler beim Speichern der Aufzeichnung des Problems"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Fehler beim Starten der Aufzeichnung des Problems"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Vollbildmodus wird aktiviert"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Zum Beenden von oben nach unten wischen."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ok"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Zurück"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Startbildschirm"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Symbol „Minimieren“"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Symbol „Maximieren“"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oder"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastaturbeleuchtung"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d von %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Smart-Home-Steuerung"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 3dd5fc0..e2480b2e 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Πατήστε για προβολή"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Σφάλμα κατά την αποθήκευση της εγγραφής οθόνης"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Σφάλμα κατά την έναρξη της εγγραφής οθόνης"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Εργαλείο καταγραφής προβλημάτων"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Επεξερ. καταγραφής προβλήματος"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Ειδοποίηση σε εξέλιξη για μια περίοδο λειτουργίας συλλογής προβλημάτων"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Σφάλμα κατά την αποθήκευση της καταγραφής του προβλήματος"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Σφάλμα κατά την έναρξη της καταγραφής του προβλήματος"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Προβολή σε πλήρη οθόνη"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Για έξοδο, σύρετε προς τα κάτω από το επάνω μέρος."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Το κατάλαβα"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Πίσω"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Αρχική οθόνη"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Λειτουργίες όπως το Quick Share και η Εύρεση συσκευής χρησιμοποιούν το Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Το Bluetooth θα ενεργοποιηθεί αύριο το πρωί"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Εικονίδιο σύμπτυξης"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Εικονίδιο ανάπτυξης"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ή"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Οπίσθιος φωτισμός πληκτρολογίου"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Επίπεδο %1$d από %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Οικιακοί έλεγχοι"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index e830f3c..303e922 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tap to view"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Error saving screen recording"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Error starting screen recording"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Issue Recorder"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Processing issue recording"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Ongoing notification for an issue collection session"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Error saving issue recording"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Error starting issue recording"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Got it"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Back"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Home"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Saved"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Features like Quick Share and Find My Device use Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth will turn on tomorrow morning"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 046ce28..042d06e 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tap to view"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Error saving screen recording"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Error starting screen recording"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Issue Recorder"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Processing issue recording"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Ongoing notification for an issue collection session"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Error saving issue recording"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Error starting issue recording"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Got it"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Back"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Home"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Saved"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Features like Quick Share and Find My Device use Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth will turn on tomorrow morning"</string>
<string name="quick_settings_bluetooth_audio_sharing_button" msgid="7545274861795853838">"Share audio"</string>
@@ -1323,6 +1345,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Home Controls"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index e830f3c..303e922 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tap to view"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Error saving screen recording"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Error starting screen recording"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Issue Recorder"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Processing issue recording"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Ongoing notification for an issue collection session"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Error saving issue recording"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Error starting issue recording"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Got it"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Back"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Home"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Saved"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Features like Quick Share and Find My Device use Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth will turn on tomorrow morning"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index e830f3c..303e922 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tap to view"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Error saving screen recording"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Error starting screen recording"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Issue Recorder"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Processing issue recording"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Ongoing notification for an issue collection session"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Error saving issue recording"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Error starting issue recording"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Got it"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Back"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Home"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Saved"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Features like Quick Share and Find My Device use Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth will turn on tomorrow morning"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Home controls"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 07907a6..5a5af96 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tap to view"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Error saving screen recording"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Error starting screen recording"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Issue Recorder"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Processing issue recording"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Ongoing notification for an issue collection session"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Error saving issue recording"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Error starting issue recording"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Viewing full screen"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"To exit, swipe down from the top."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Got it"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Back"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Home"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Saved"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Features like Quick Share and Find My Device use Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth will turn on tomorrow morning"</string>
<string name="quick_settings_bluetooth_audio_sharing_button" msgid="7545274861795853838">"Share audio"</string>
@@ -1323,6 +1345,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Collapse icon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Expand icon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"or"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Home Controls"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index c622ebe..ce5bd5e 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Presiona para ver"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Se produjo un error al guardar la grabación de pantalla"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Error al iniciar la grabación de pantalla"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Grabadora de errores"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Procesando grabación del error"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notificación continua por un error durante la sesión de recopilación de datos"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Se produjo un error al guardar la grabación del problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Se produjo un error al iniciar la grabación del problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visualización en pantalla completa"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Para salir, desliza el dedo hacia abajo desde la parte superior."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Entendido"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Atrás"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Página principal"</string>
@@ -278,7 +299,8 @@
<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">"Activar automáticamente mañana"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -360,7 +382,7 @@
<string name="qs_record_issue_start" msgid="2979831312582567056">"Iniciar"</string>
<string name="qs_record_issue_stop" msgid="3531747965741982657">"Detener"</string>
<string name="qs_record_issue_bug_report" msgid="8229031766918650079">"Informe de errores"</string>
- <string name="qs_record_issue_dropdown_header" msgid="5995983175678658329">"¿Qué parte de tu exp. del disp. se vio afectada?"</string>
+ <string name="qs_record_issue_dropdown_header" msgid="5995983175678658329">"¿Qué parte de tu experiencia se vio afectada?"</string>
<string name="qs_record_issue_dropdown_prompt" msgid="2526949919167046219">"Seleccionar tipo de problema"</string>
<string name="qs_record_issue_dropdown_screenrecord" msgid="6396141928484257626">"Grabadora de pant."</string>
<string name="performance" msgid="6552785217174378320">"Rendimiento"</string>
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícono de contraer"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícono de expandir"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación del teclado"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Controles de la casa"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index c021b45..000db75 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Toca para verla"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"No se ha podido guardar la grabación de pantalla"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"No se ha podido empezar a grabar la pantalla"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Grabadora de problemas"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Procesando grabación de problema"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notificación continua de una sesión de obtención de datos del problema"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"No se ha podido guardar la grabación del problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"No se ha podido iniciar la grabación del problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visualización en pantalla completa"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Para salir, desliza de arriba abajo."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Entendido"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Atrás"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Inicio"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icono de contraer"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icono de desplegar"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación del teclado"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Controles de la casa"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 003c925..fa10a8a 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Puudutage kuvamiseks"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Viga ekraanisalvestise salvestamisel"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Viga ekraanikuva salvestamise alustamisel"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Probleemisalvesti"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Probleemisalvestise töötlemine"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Probleemikogumise seansi taustamärguanne"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Viga probleemisalvestise salvestamisel"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Viga probleemi salvestamise alustamisel"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Kuvamine täisekraanil"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Väljumiseks pühkige ülevalt alla."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Selge"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Tagasi"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Kodu"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Sellised 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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ahendamisikoon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laiendamisikoon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"või"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatuuri taustavalgustus"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Tase %1$d/%2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Kodu juhtelemendid"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 66b79b8..960a92f 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Sakatu ikusteko"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Errore bat gertatu da pantaila-grabaketa gordetzean"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Errore bat gertatu da pantaila grabatzen hastean"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Arazo-grabagailua"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Arazoaren grabaketa prozesatzen"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Arazo bat biltzeko saio baten aktibo dagoen jakinarazpena"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Errore bat gertatu da arazoa grabatzean"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Errore bat gertatu da arazoa grabatzen hastean"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Pantaila osoa ikusgai"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Irteteko, pasatu hatza goitik behera."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ados"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Atzera"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Hasiera"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tolesteko ikonoa"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Zabaltzeko ikonoa"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"edo"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Teklatuaren hondoko argia"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d/%2$d maila"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Etxeko gailuen kontrola"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index cdbb685..f02c248 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"برای مشاهده ضربه بزنید"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"خطا در ذخیرهسازی ضبط صفحهنمایش"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"خطا هنگام شروع ضبط صفحهنمایش"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ضبطکننده مشکل"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"درحال پردازش کردن ضبط مشکل"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"اعلان جاری مربوط به جلسه جمعآوری مشکل"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"هنگام ذخیره کردن ضبط مشکل، خطایی پیش آمد"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"هنگام شروع ضبط مشکل، خطایی پیش آمد"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"درحال مشاهده در حالت تمامصفحه"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"برای خروج، از بالای صفحه تند بهپایین بکشید."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"متوجهام"</string>
<string name="accessibility_back" msgid="6530104400086152611">"برگشت"</string>
<string name="accessibility_home" msgid="5430449841237966217">"صفحهٔ اصلی"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"ویژگیهایی مثل «همرسانی سریع» و «پیدا کردن دستگاهم» از بلوتوث استفاده میکنند"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"بلوتوث فردا صبح روشن خواهد شد"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -636,7 +658,7 @@
<string name="volume_panel_hint_muted" msgid="1124844870181285320">"بیصدا شد"</string>
<string name="volume_panel_hint_vibrate" msgid="4136223145435914132">"لرزش"</string>
<string name="media_output_label_title" msgid="872824698593182505">"درحال پخش <xliff:g id="LABEL">%s</xliff:g> در"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"صدا در این دستگاه پخش میشود:"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"صدا کجا پخش خواهد شد:"</string>
<string name="media_output_title_ongoing_call" msgid="208426888064112006">"تماس برقرار است"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"تنظیمکننده واسط کاربری سیستم"</string>
<string name="status_bar" msgid="4357390266055077437">"نوار وضعیت"</string>
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"نماد جمع کردن"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"نماد ازهم بازکردن"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"نور پسزمینه صفحهکلید"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"سطح %1$d از %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"کنترل خانه هوشمند"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index bea39cb..9a24082 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Katso napauttamalla"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Virhe näyttötallenteen tallentamisessa"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Virhe näytön tallennuksen aloituksessa"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Ongelman tallentaja"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Käsittely: Ongelman tallennus"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Ongelmankeräykseen liittyvä ilmoitus taustalla jatkuvasta toiminnasta"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Virhe ongelman tallenteen tallentamisessa"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Virhe ongelman tallentamisen aloituksessa"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Koko näytön tilassa"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Sulje palkki pyyhkäisemällä alas ruudun ylälaidasta."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Selvä"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Takaisin"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Aloitus"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Tiivistyskuvake"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Laajennuskuvake"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"tai"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Näppämistön taustavalo"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Taso %1$d/%2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Kodin ohjaus"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 95b25936..77335de 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Touchez pour afficher"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Erreur d\'enregistrement de l\'écran"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Une erreur s\'est produite lors du démarrage de l\'enregistrement d\'écran"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Enregistreur de problèmes"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Trait. de l\'enreg. du problème"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notification continue pour une session de collecte d\'un problème"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Erreur lors de l\'enregistrement du problème"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Erreur lors du démarrage de l\'enregistrement du problème"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Affichage plein écran"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Pour quitter, balayez du haut vers le bas."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Précédent"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Domicile"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Enregistré"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"Déconnecter"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"Activer"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Activer le Bluetooth automatiquement demain"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Les fonctionnalités comme Partage rapide et Localiser mon appareil utilisent le Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Le Bluetooth s\'activera demain matin"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -620,7 +642,7 @@
<string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Contrôle du bruit"</string>
<string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Son spatial"</string>
<string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Désactivé"</string>
- <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fixé"</string>
+ <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Activé"</string>
<string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Suivi de la tête"</string>
<string name="volume_ringer_change" msgid="3574969197796055532">"Touchez pour modifier le mode de sonnerie"</string>
<string name="volume_ringer_hint_mute" msgid="4263821214125126614">"désactiver le son"</string>
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Rétroéclairage du clavier"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d de %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Domotique"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 1b8ddc1..98bfc72 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Appuyez pour afficher"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Erreur lors de l\'enregistrement de l\'écran"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Erreur lors du démarrage de l\'enregistrement de l\'écran"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Enregistreur de problèmes"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Enregistrement du problème"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notification d\'activité en cours concernant la session d\'enregistrement d\'un problème"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Erreur lors de l\'enregistrement du problème"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Erreur lors du démarrage de l\'enregistrement du problème"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Affichage en plein écran"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Pour quitter, balayez l\'écran du haut vers le bas."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Retour"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Accueil"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Enregistré"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"dissocier"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activer"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Réactiver automatiquement demain"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Certaines fonctionnalités, telles que Quick Share et Localiser mon appareil, utilisent le Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Le Bluetooth sera activé demain matin"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icône Réduire"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icône Développer"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Rétroéclairage du clavier"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d sur %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Contrôle de la maison"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 1d0f4c4..28cf92a 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Toca para ver o contido"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Produciuse un erro ao gardar a gravación da pantalla"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Produciuse un erro ao iniciar a gravación da pantalla"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Gravadora de problemas"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Procesando gravación problema"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notificación de actividade en curso para unha sesión de rexistro dun problema"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Produciuse un erro ao gardar a gravación do problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Produciuse un erro ao iniciar a gravación do problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Vendo pantalla completa"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Para saír, pasa o dedo cara abaixo desde a parte superior."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Entendido"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Volver"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Inicio"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona de contraer"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona de despregar"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación do teclado"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Controis domóticos"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 7a4cfd1..2914bad 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"જોવા માટે ટૅપ કરો"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"સ્ક્રીન રેકોર્ડિંગ સાચવવામાં ભૂલ આવી"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"સ્ક્રીનને રેકૉર્ડ કરવાનું શરૂ કરવામાં ભૂલ"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"સમસ્યા રેકોર્ડર"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"સમસ્યા રેકોર્ડિંગ ચાલુ છે"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"કોઈ સમસ્યા સંગ્રહના સત્ર માટે ચાલુ નોટિફિકેશન"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"સમસ્યા રેકોર્ડિંગને સાચવવામાં ભૂલ આવી"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"સમસ્યા રેકોર્ડિંગને શરૂ કરવામાં ભૂલ આવી"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"પૂર્ણ સ્ક્રીન જોઈ રહ્યાં છે"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"બહાર નીકળવા માટે, સૌથી ઉપરથી નીચેની તરફ સ્વાઇપ કરો."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"સમજાઈ ગયું"</string>
<string name="accessibility_back" msgid="6530104400086152611">"પાછળ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"હોમ"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\'નાનું કરો\'નું આઇકન"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\'મોટું કરો\'નું આઇકન"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"અથવા"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"કીબોર્ડની બૅકલાઇટ"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dમાંથી %1$d લેવલ"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ઘરેલું સાધનોના નિયંત્રણો"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 896af24..a6bc9b5 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"देखने के लिए टैप करें"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"स्क्रीन रिकॉर्डिंग सेव करते समय गड़बड़ी हुई"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"स्क्रीन को रिकॉर्ड करने में गड़बड़ी आ रही है"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"समस्या का डेटा सेव करने वाला टूल"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"समस्या का डेटा प्रोसेस हो रहा"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"समस्या का डेटा इकट्ठा करने के लिए बैकग्राउंड में जारी गतिविधि की सूचना"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"समस्या का डेटा सेव करते समय गड़बड़ी हुई"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"समस्या का डेटा सेव करने की प्रोसेस शुरू करते समय गड़बड़ी हुई"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"फ़ुल स्क्रीन मोड पर देखा जा रहा है"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"बाहर निकलने के लिए, सबसे ऊपर से नीचे की ओर स्वाइप करें."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"ठीक है"</string>
<string name="accessibility_back" msgid="6530104400086152611">"वापस जाएं"</string>
<string name="accessibility_home" msgid="5430449841237966217">"होम"</string>
@@ -178,7 +199,7 @@
<string name="biometric_dialog_wrong_pattern" msgid="8954812279840889029">"गलत पैटर्न"</string>
<string name="biometric_dialog_wrong_password" msgid="69477929306843790">"गलत पासवर्ड"</string>
<string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"आपकी कोशिशें बहुत बार गलत हुई हैं.\nआप <xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश कर सकते हैं."</string>
- <string name="work_challenge_emergency_button_text" msgid="8946588434515599288">"आपातकालीन कॉल"</string>
+ <string name="work_challenge_emergency_button_text" msgid="8946588434515599288">"आपातकालीन कॉल करें"</string>
<string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"फिर से कोशिश करें. आप <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> में से <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> बार कोशिश कर चुके हैं."</string>
<string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"आपका डेटा मिटा दिया जाएगा"</string>
<string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"अगर आप फिर से गलत पैटर्न डालते हैं, तो इस डिवाइस का डेटा मिटा दिया जाएगा."</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -596,7 +618,7 @@
<string name="screen_pinning_negative" msgid="6882816864569211666">"नहीं, रहने दें"</string>
<string name="screen_pinning_start" msgid="7483998671383371313">"ऐप्लिकेशन पिन किया गया"</string>
<string name="screen_pinning_exit" msgid="4553787518387346893">"ऐप्लिकेशन अनपिन किया गया"</string>
- <string name="stream_voice_call" msgid="7468348170702375660">"कॉल करें"</string>
+ <string name="stream_voice_call" msgid="7468348170702375660">"कॉल"</string>
<string name="stream_system" msgid="7663148785370565134">"सिस्टम"</string>
<string name="stream_ring" msgid="7550670036738697526">"रिंग"</string>
<string name="stream_music" msgid="2188224742361847580">"मीडिया"</string>
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"छोटा करने का आइकॉन"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"बड़ा करने का आइकॉन"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"या"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"कीबोर्ड की बैकलाइट"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d में से %1$d लेवल"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"होम कंट्रोल"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index acf253d..ba82bdd 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Dodirnite za prikaz"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Pogreška prilikom spremanja snimke zaslona"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Pogreška prilikom pokretanja snimanja zaslona"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Snimač poteškoća"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Obrada snimke poteškoće"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Obavijest o aktivnosti u pozadini za sesiju prikupljanja poteškoća"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Pogreška pri spremanju snimke poteškoće"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Pogreška pri pokretanju snimke poteškoće"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Gledanje preko cijelog zaslona"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Za izlaz prijeđite prstom od vrha prema dolje."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Shvaćam"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Natrag"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Početna"</string>
@@ -278,13 +299,12 @@
<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 uključi ponovno sutra"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <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>
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (3069309588231072128) -->
- <skip />
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="7545274861795853838">"Dijeli zvuk"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="3069309588231072128">"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>
@@ -1325,6 +1345,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za sažimanje"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za proširivanje"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ili"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvjetljenje tipkovnice"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Razina %1$d od %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Upravljanje uređajima"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index c73511e..bb22807 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Koppintson a megtekintéshez"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Hiba történt a képernyőrögzítés mentése során"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Hiba a képernyőrögzítés indításakor"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Problémafelvevő"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Problémafelvétel feldolgozása…"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Folyamatban lévő értesítés egy problémagyűjtési munkamenethez"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Hiba történt a problémafelvétel mentésekor"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Hiba történt a problémafelvétel elindításakor"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Megtekintése teljes képernyőn"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Kilépéshez csúsztassa ujját fentről lefelé."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Értem"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Vissza"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Főoldal"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Mentve"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"leválasztás"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiválás"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatikus visszakapcsolás holnap"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Egyes funkciók (például a Quick Share és a Készülékkereső) Bluetootht használnak"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"A Bluetooth holnap reggel bekapcsol"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Összecsukás ikon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Kibontás ikon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"vagy"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"A billentyűzet háttérvilágítása"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Fényerő: %2$d/%1$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Otthon vezérlése"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index f1462be..14db87a 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Հպեք՝ դիտելու համար"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Չհաջողվեց պահել էկրանի տեսագրությունը"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Չհաջողվեց սկսել տեսագրումը"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Խնդիրների տեսագրիչ"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Մշակում ենք տեսագրությունը"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Խնդրի տեսագրման մասին ընթացիկ ծանուցում"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Չհաջողվեց պահել տեսագրությունը"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Չհաջողվեց սկսել տեսագրումը"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Լիաէկրան դիտակերպ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Դուրս գալու համար վերևից մատը սահեցրեք դեպի ներքև։"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Եղավ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Հետ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Տուն"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ծալել պատկերակը"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ծավալել պատկերակը"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"կամ"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Հետին լուսավորությամբ ստեղնաշար"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d՝ %2$d-ից"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Տան կառավարման տարրեր"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 7525e9a..f9f6370 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Ketuk untuk melihat"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Terjadi error saat menyimpan rekaman layar"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Terjadi error saat memulai perekaman layar"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Perekam Masalah"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Memproses rekaman masalah"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notifikasi berkelanjutan untuk sesi pengumpulan masalah"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Terjadi error saat menyimpan rekaman masalah"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Terjadi error saat memulai perekaman masalah"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Melihat layar penuh"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Untuk keluar, geser layar ke bawah dari atas."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Oke"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Kembali"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Utama"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Disimpan"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"putuskan koneksi"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktifkan"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Otomatis aktifkan lagi besok"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Fitur seperti Quick Share dan Temukan Perangkat Saya menggunakan Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth akan dinyalakan besok pagi"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikon ciutkan"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikon luaskan"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Lampu latar keyboard"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Tingkat %1$d dari %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrol Rumah"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 3850790..0266cb2 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Ýttu til að skoða"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Villa við að vista skjáupptöku"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Villa við að hefja upptöku skjás"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Upptökutæki fyrir vandamál"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Vinnur úr upptöku af vandamáli"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Áframhaldandi tilkynning fyrir lotu vandamálasafns"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Villa kom upp við að vista upptöku af vandamáli"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Villa kom upp við að hefja upptöku af vandamáli"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Notar allan skjáinn"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Strjúktu niður frá efsta hluta skjásins til að hætta."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ég skil"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Til baka"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Heim"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Vistað"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"aftengja"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"virkja"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Kveikja sjálfkrafa aftur á morgun"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Eiginleikar eins og Flýtideiling og Finna tækið mitt nota Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Kveikt verður á Bluetooth í fyrramálið"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Minnka tákn"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Stækka tákn"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eða"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Baklýsing lyklaborðs"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Stig %1$d af %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Heimastýringar"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index a0d54c267..9cc5124 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tocca per visualizzare"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Errore durante il salvataggio della registrazione dello schermo"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Errore durante l\'avvio della registrazione dello schermo"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Registratore dei problemi"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Elaborazione registrazione…"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notifica continua per una sessione di raccolta di problemi"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Impossibile salvare la registrazione del problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Impossibile avviare la registrazione del problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visualizzazione a schermo intero"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Per uscire, scorri dall\'alto verso il basso."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Indietro"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Home"</string>
@@ -278,13 +299,12 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Dispositivo salvato"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnetti"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"attiva"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Riattiva automaticamente domani"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funzionalità come Quick Share e Trova il mio dispositivo usano il Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Il Bluetooth verrà attivato domani mattina"</string>
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_audio_sharing_button_sharing (3069309588231072128) -->
- <skip />
+ <string name="quick_settings_bluetooth_audio_sharing_button" msgid="7545274861795853838">"Condividi audio"</string>
+ <string name="quick_settings_bluetooth_audio_sharing_button_sharing" msgid="3069309588231072128">"Condivisione audio in corso…"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Batteria: <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">"Auricolare"</string>
@@ -1325,6 +1345,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icona Comprimi"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icona Espandi"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"oppure"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroilluminazione della tastiera"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Livello %1$d di %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Controlli della casa"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index f773b84..734e7da 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"יש להקיש כדי להציג"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"שגיאה בשמירה של הקלטת המסך"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"שגיאה בהפעלה של הקלטת המסך"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"בעיה במכשיר ההקלטה"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"מתבצע עיבוד של בעיית ההקלטה"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"התראה מתמשכת לסשן איסוף הבעיה"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"שגיאה בשמירה של בעיית ההקלטה"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"שגיאה בהפעלה של בעיית ההקלטה"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"צפייה במסך מלא"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"כדי לצאת, מחליקים למטה מהחלק העליון של המסך."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"הבנתי"</string>
<string name="accessibility_back" msgid="6530104400086152611">"חזרה"</string>
<string name="accessibility_home" msgid="5430449841237966217">"בית"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -636,7 +658,7 @@
<string name="volume_panel_hint_muted" msgid="1124844870181285320">"השתקה"</string>
<string name="volume_panel_hint_vibrate" msgid="4136223145435914132">"רטט"</string>
<string name="media_output_label_title" msgid="872824698593182505">"הפעלה של <xliff:g id="LABEL">%s</xliff:g> במכשיר"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"האודיו יופעל במכשיר"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"איפה האודיו יופעל"</string>
<string name="media_output_title_ongoing_call" msgid="208426888064112006">"מתבצעת שיחה במכשיר"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
<string name="status_bar" msgid="4357390266055077437">"שורת סטטוס"</string>
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"סמל הכיווץ"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"סמל ההרחבה"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"או"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"התאורה האחורית במקלדת"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"רמה %1$d מתוך %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"שליטה במכשירים"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 6b5d082..6e62972 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"タップすると表示されます"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"画面の録画の保存中にエラーが発生しました"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"画面の録画中にエラーが発生しました"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"問題記録ツール"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"問題の記録を処理しています"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"問題の収集セッションに関する進行中の通知"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"問題の記録の保存中にエラーが発生しました"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"問題の記録の開始中にエラーが発生しました"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"全画面表示"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"終了するには、上から下にスワイプします。"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"戻る"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ホーム"</string>
@@ -278,7 +299,8 @@
<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">"明日自動的に ON に戻す"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Quick Share や「デバイスを探す」などの機能は Bluetooth を使用します"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"明日の朝に Bluetooth が ON になります"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"閉じるアイコン"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"開くアイコン"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"または"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"キーボード バックライト"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"レベル %1$d/%2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ホーム コントロール"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 399c1f0..5914f12 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"შეეხეთ სანახავად"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ეკრანის ჩანაწერის შენახვისას შეცდომა მოხდა"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ეკრანის ჩაწერის დაწყებისას წარმოიქმნა შეცდომა"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ჩანაწერის რეკორდერი"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"პრობლემის ჩანაწერის დამუშავება"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"მიმდინარე შეტყობინება პრობლემების შეგროვების სესიისთვის"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"პრობლემის ჩანაწერის შენახვისას წარმოიქმნა შეცდომა"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"პრობლემის ჩაწერის დაწყებისას წარმოიქმნა შეცდომა"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"მიმდინარეობს სრულ ეკრანზე ნახვა"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"გასვლისთვის გადაფურცლეთ ზემოდან ქვემოთ."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"გასაგებია"</string>
<string name="accessibility_back" msgid="6530104400086152611">"უკან"</string>
<string name="accessibility_home" msgid="5430449841237966217">"საწყისი"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ხატულის ჩაკეცვა"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ხატულის გაფართოება"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ან"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"კლავიატურის შენათება"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"დონე: %1$d %2$d-დან"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"სახლის კონტროლი"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index a3e6179..40b9149 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Көру үшін түртіңіз."</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Экран жазбасын сақтау кезінде қате шықты."</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Экрандағы бейнені жазу кезінде қате шықты."</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Мәселені жазу құралы"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Мәселе жазбасы өңделіп жатыр"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Мәселе туралы дерек жинау сеансына арналған ағымдағы хабарландыру"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Мәселе жазбасын сақтау кезінде қате шықты."</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Мәселені жазуды бастау кезінде қате шықты."</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Толық экранда көру"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Шығу үшін жоғарыдан төмен қарай сырғытыңыз."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Түсінікті"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Артқа"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Үй"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,8 +1347,16 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Жию белгішесі"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жаю белгішесі"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"немесе"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Пернетақта жарығы"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Деңгей: %1$d/%2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Үй басқару элементтері"</string>
- <string name="home_controls_dream_description" msgid="4644150952104035789">"Үй басқару элементтерін скринсейверден қолдану"</string>
+ <string name="home_controls_dream_description" msgid="4644150952104035789">"Үй басқару элементтерін скринсейверден қолданыңыз."</string>
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 7c6f127..3836d7d 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ចុចដើម្បីមើល"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"មានបញ្ហាក្នុងការរក្សាទុកការថតវីដេអូអេក្រង់"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"មានបញ្ហាក្នុងការចាប់ផ្ដើមថតអេក្រង់"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"កម្មវិធីកត់ត្រាបញ្ហា"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"កំពុងដំណើរការការកត់ត្រាបញ្ហា"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ការជូនដំណឹងដែលកំពុងបន្តសម្រាប់វគ្គប្រមូលបញ្ហា"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"មានបញ្ហាក្នុងការរក្សាទុកកំណត់ត្រាបញ្ហា"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"មានបញ្ហាក្នុងការចាប់ផ្ដើមកត់ត្រាបញ្ហា"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"កំពុងមើលពេញអេក្រង់"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ដើម្បីចាកចេញ សូមអូសពីលើចុះក្រោម។"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"យល់ហើយ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ថយក្រោយ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"គេហទំព័រ"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"រូបតំណាង \"បង្រួម\""</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"រូបតំណាង \"ពង្រីក\""</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ឬ"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ពន្លឺក្រោយក្ដារចុច"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"កម្រិតទី %1$d នៃ %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ការគ្រប់គ្រងផ្ទះ"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 31aa875..85d67cd 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಸೇವ್ ಮಾಡುವಾಗ ದೋಷ ಎದುರಾಗಿದೆ"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭಿಸುವಾಗ ದೋಷ ಕಂಡುಬಂದಿದೆ"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ಸಮಸ್ಯೆ ರೆಕಾರ್ಡರ್"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"ಸಮಸ್ಯೆ ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಕ್ರಿಯೆ…"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ಸಮಸ್ಯೆ ಸಂಗ್ರಹಣೆಯ ಸೆಶನ್ಗಾಗಿ ಜರುಗುತ್ತಿರುವ ನೋಟಿಫಿಕೇಶನ್"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"ಸಮಸ್ಯೆಯ ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ಸೇವ್ ಮಾಡುವಾಗ ದೋಷ ಎದುರಾಗಿದೆ"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"ಸಮಸ್ಯೆಯ ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸುವಲ್ಲಿ ದೋಷ ಎದುರಾಗಿದೆ"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ನಿರ್ಗಮಿಸಲು, ಮೇಲಿನಿಂದ ಕೆಳಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"ಅರ್ಥವಾಯಿತು"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ಹಿಂದೆ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ಮುಖಪುಟ"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ಕುಗ್ಗಿಸುವ ಐಕಾನ್"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ವಿಸ್ತೃತಗೊಳಿಸುವ ಐಕಾನ್"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ಅಥವಾ"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ಕೀಬೋರ್ಡ್ ಬ್ಯಾಕ್ಲೈಟ್"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ರಲ್ಲಿ %1$d ಮಟ್ಟ"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ಮನೆ ನಿಯಂತ್ರಣಗಳು"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 91266b7..4c26ed2 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"탭하여 보기"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"화면 녹화 저장 중에 오류가 발생했습니다."</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"화면 녹화 시작 중 오류 발생"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"문제 녹화 도구"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"문제 녹화 처리 중"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"문제 수집 섹션에 대한 진행 중 알림"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"문제 녹화 저장 중에 오류가 발생했습니다."</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"문제 녹화 시작 중에 오류가 발생했습니다."</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"전체 화면 모드"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"종료하려면 위에서 아래로 스와이프합니다."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"확인"</string>
<string name="accessibility_back" msgid="6530104400086152611">"뒤로"</string>
<string name="accessibility_home" msgid="5430449841237966217">"홈"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"접기 아이콘"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"확장 아이콘"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"또는"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"키보드 백라이트"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d단계 중 %1$d단계"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"홈 컨트롤"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index a3fd0a2..ae91a7c 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Көрүү үчүн таптаңыз"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Экран тартылган жок"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Экранды жаздырууну баштоодо ката кетти"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Маселе жаздыргыч"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Маселе жаздырылууда"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Маселе тууралуу маалымат чогултулуп жатканы жөнүндө учурдагы билдирме"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Жаздырылган маселе сакталган жок"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Маселени жаздыруу башталбай койду"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Толук экран режимин көрүү"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Чыгуу үчүн экранды ылдый сүрүп коюңуз."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Түшүндүм"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Артка"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Үйгө"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Жыйыштыруу сүрөтчөсү"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Жайып көрсөтүү сүрөтчөсү"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"же"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Баскычтоптун жарыгы"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ичинен %1$d-деңгээл"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Үйдөгү түзмөктөрдү тескөө"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 31182fd..30f8a65 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ແຕະເພື່ອເບິ່ງ"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ເກີດຂໍ້ຜິດພາດໃນການບັນທຶກໜ້າຈໍ"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ເກີດຄວາມຜິດພາດໃນການບັນທຶກໜ້າຈໍ"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ຕົວບັນທຶກບັນຫາ"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"ກຳລັງປະມວນຜົນການບັນທຶກບັນຫາ"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ການແຈ້ງເຕືອນທີ່ດຳເນີນຢູ່ສຳລັບເຊດຊັນການຮວບຮວມບັນຫາ"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"ເກີດຂໍ້ຜິດພາດໃນການບັນທຶກບັນຫາ"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"ເກີດຂໍ້ຜິດພາດໃນການເລີ່ມຕົ້ນການບັນທຶກບັນຫາ"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"ກຳລັງເບິ່ງເຕັມຈໍ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ເພື່ອອອກ, ໃຫ້ປັດລົງຈາກເທິງສຸດ."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"ເຂົ້າໃຈແລ້ວ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ກັບຄືນ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ໜ້າທຳອິດ"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ໄອຄອນຫຍໍ້ລົງ"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ໄອຄອນຂະຫຍາຍ"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ຫຼື"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ໄຟປຸ່ມແປ້ນພິມ"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"ລະດັບທີ %1$d ຈາກ %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ການຄວບຄຸມເຮືອນ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 62c2911..4fffb3d 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Palieskite, kad peržiūrėtumėte"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Išsaugant ekrano įrašą įvyko klaida"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Pradedant ekrano vaizdo įrašymą iškilo problema"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Problemų įrašytuvas"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Apdorojamas problemos įrašas"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Šiuo metu rodomas problemos duomenų rinkimo seanso pranešimas"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Išsaugant problemos įrašą įvyko klaida"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Pradedant problemos įrašą įvyko klaida"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Peržiūrima viso ekrano režimu"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Jei norite išeiti, perbraukite žemyn iš viršaus."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Supratau"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Atgal"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Pagrindinis"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Išsaugota"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"atjungti"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"suaktyvinti"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatiškai vėl įjungti rytoj"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Tokioms funkcijoms kaip „Spartusis bendrinimas“ ir „Rasti įrenginį“ naudojamas „Bluetooth“ ryšys"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"„Bluetooth“ ryšys bus įjungtas rytoj ryte"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sutraukimo piktograma"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Išskleidimo piktograma"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"arba"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatūros foninis apšvietimas"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d lygis iš %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Namų sistemos valdymas"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 8d0b43c..28b15d0 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Pieskarieties, lai skatītu"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Saglabājot ekrāna ierakstu, radās kļūda."</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Sākot ierakstīt ekrāna saturu, radās kļūda."</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Problēmu ierakstītājs"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Apstrādā problēmas ierakstu"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Aktīvs paziņojums par problēmu vākšanas sesiju"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Saglabājot problēmas ierakstu, radās kļūda."</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Sākot problēmas ierakstīšanu, radās kļūda."</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Skatīšanās pilnekrāna režīmā"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Lai izietu, no augšdaļas velciet lejup."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Labi"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Atpakaļ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Sākums"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Saglabāta"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"atvienot"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivizēt"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automātiski atkal ieslēgt rīt"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Tādas funkcijas kā “Ātrā kopīgošana” un “Atrast ierīci” izmanto Bluetooth savienojumu"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth savienojums tiks ieslēgts rīt no rīta"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Sakļaušanas ikona"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Izvēršanas ikona"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"vai"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastatūras fona apgaismojums"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Līmenis numur %1$d, kopā ir %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Mājas kontrolierīces"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 1c889e6..bf71f8e 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Допрете за прегледување"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Грешка при зачувувањето на снимката од екранот"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Грешка при почетокот на снимањето на екранот"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Проблем со „Диктафон“"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Се обработува проб. со снимање"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Тековно известување за сесија за проблем со прибирање"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Грешка при зачувување на проблемот со снимање"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Грешка при започнување на проблемот со снимање"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Се прикажува на цел екран"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"За да излезете, повлечете одозгора надолу."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Сфатив"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Почетна страница"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за собирање"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширување"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Осветлување на тастатура"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Ниво %1$d од %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Контроли за домот"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 3dd91f7..2031af0 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"കാണാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"സ്ക്രീൻ റെക്കോർഡിംഗ് സംരക്ഷിക്കുന്നതിൽ പിശക്"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"സ്ക്രീൻ റെക്കോർഡിംഗ് ആരംഭിക്കുന്നതിൽ പിശക്"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"പ്രശ്ന റെക്കോർഡർ"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"പ്രശ്ന റെക്കോർഡിംഗ് പ്രോസസ് ചെയ്യുന്നു"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ഒരു പ്രശ്ന ശേഖരണ സെഷന്റെ ഓൺഗോയിംഗ് അറിയിപ്പ്"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"പ്രശ്ന റെക്കോർഡിംഗ് സംരക്ഷിക്കുന്നതിൽ പിശക്"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"പ്രശ്ന റെക്കോർഡിംഗ് ആരംഭിക്കുന്നതിൽ പിശക്"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"പൂർണ്ണ സ്ക്രീനിൽ കാണുന്നു"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"പുറത്തുകടക്കാൻ, മുകളിൽ നിന്ന് താഴോട്ട് സ്വൈപ്പ് ചെയ്യുക."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"മനസ്സിലായി"</string>
<string name="accessibility_back" msgid="6530104400086152611">"മടങ്ങുക"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ഹോം"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"ക്വിക്ക് ഷെയർ, Find My Device പോലുള്ള ഫീച്ചറുകൾ Bluetooth ഉപയോഗിക്കുന്നു"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth നാളെ രാവിലെ ഓണാകും"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ചുരുക്കൽ ഐക്കൺ"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"വികസിപ്പിക്കൽ ഐക്കൺ"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"അല്ലെങ്കിൽ"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"കീബോഡ് ബാക്ക്ലൈറ്റ്"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-ൽ %1$d-ാമത്തെ ലെവൽ"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ഹോം കൺട്രോളുകൾ"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 5539263..556d205 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Харахын тулд товшино уу"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Дэлгэцийн бичлэгийг хадгалахад алдаа гарлаа"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Дэлгэцийн бичлэгийг эхлүүлэхэд алдаа гарлаа"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Асуудал бичигч"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Асуудлын бичлэгийг боловсруулж байна"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Асуудал цуглуулах харилцан үйлдлийн үргэлжилж буй мэдэгдэл"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Асуудлын бичлэгийг хадгалахад алдаа гарлаа"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Асуудлын бичлэгийг эхлүүлэхэд алдаа гарлаа"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Бүтэн дэлгэцээр үзэж байна"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Гарах бол дээрээс доош шударна уу."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ойлголоо"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Буцах"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Гэрийн"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Хураах дүрс тэмдэг"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Дэлгэх дүрс тэмдэг"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"эсвэл"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Гарын арын гэрэл"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-с %1$d-р түвшин"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Гэрийн удирдлага"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index aea4d5a..a009fe1 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"पाहण्यासाठी टॅप करा"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"स्क्रीन रेकॉर्डिंग सेव्ह करताना एरर आली"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"स्क्रीन रेकॉर्डिंग सुरू करताना एरर आली"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"समस्या रेकॉर्डर"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"प्रक्रियेच्या समस्येचे रेकॉर्डिंग"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"समस्या गोळा करण्याच्या सेशनसाठीची सद्य सूचना"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"समस्येचे रेकॉर्डिंग सेव्ह करताना एरर आली"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"समस्येचे रेकॉर्डिंग सुरू करताना एरर आली"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"पूर्ण स्क्रीन पाहत आहात"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"बाहेर पडण्यासाठी, वरून खाली स्वाइप करा."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"समजले"</string>
<string name="accessibility_back" msgid="6530104400086152611">"मागे"</string>
<string name="accessibility_home" msgid="5430449841237966217">"होम"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"कोलॅप्स करा आयकन"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"विस्तार करा आयकन"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"किंवा"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"कीबोर्ड बॅकलाइट"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d पैकी %1$d पातळी"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"होम कंट्रोल"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 0131098..59c4071 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Ketik untuk lihat"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Ralat semasa menyimpan rakaman skrin"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Ralat semasa memulakan rakaman skrin"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Perakam Masalah"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Memproses rakaman masalah"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Pemberitahuan sedang berlangsung untuk sesi pengumpulan masalah"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Ralat menyimpan rakaman masalah"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Ralat memulakan rakaman masalah"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Melihat skrin penuh"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Untuk keluar, leret ke bawah dari bahagian atas."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Kembali"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Rumah"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Disimpan"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"putuskan sambungan"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktifkan"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Dihidupkan lagi esok secara automatik"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Ciri seperti Quick Share dan Find My Device menggunakan Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth akan dihidupkan esok pagi"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kuncupkan ikon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Kembangkan ikon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"atau"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Cahaya latar papan kekunci"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Tahap %1$d daripada %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Kawalan Rumah"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 9b19b62..d13ee63 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ကြည့်ရှုရန် တို့ပါ"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ဖန်သားပြင်ရိုက်ကူးမှုကို သိမ်းရာတွင် အမှားရှိသည်"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ဖန်သားပြင် ရိုက်ကူးမှု စတင်ရာတွင် အမှားအယွင်းရှိနေသည်"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ပြဿနာရိုက်ကူးစနစ်"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"ပြဿနာရိုက်ကူးမှု လုပ်နေသည်"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ပြဿနာစုစည်းခြင်း စက်ရှင်အတွက် လုပ်ဆောင်နေဆဲ အကြောင်းကြားချက်"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"ပြဿနာရိုက်ကူးမှုကို သိမ်း၍မရပါ"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"ပြဿနာရိုက်ကူးမှုကို စတင်၍မရပါ"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"ဖန်သားပြင်အပြည့် ကြည့်နေသည်"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ထွက်ရန် အပေါ်မှ အောက်သို့ ပွတ်ဆွဲပါ။"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"နားလည်ပြီ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"နောက်သို့"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ပင်မစာမျက်နှာ"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"လျှော့ပြရန် သင်္ကေတ"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ပိုပြရန် သင်္ကေတ"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"သို့မဟုတ်"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ကီးဘုတ်နောက်မီး"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"အဆင့် %2$d အနက် %1$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"အိမ်ထိန်းချုပ်မှုများ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index a8befb3..91ef466 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Trykk for å se"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Feil ved lagring av skjermopptaket"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Feil ved start av skjermopptaket"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Funksjon for opptak av problemer"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Opptak, databehandlingsproblem"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Pågående varsel for en innsamlingsøkt for et problem"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Feil ved lagring av problemopptaket"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Feil ved start av problemopptaket"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visning i fullskjerm"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Sveip ned fra toppen for å avslutte."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Greit"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Tilbake"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Startside"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Lagret"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"koble fra"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiver"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Slå på igjen i morgen automatisk"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funksjoner som Quick Share og Finn enheten min bruker Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth slås på i morgen tidlig"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Skjul-ikon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Vis-ikon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Bakgrunnslys for tastatur"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivå %1$d av %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Hjemkontroller"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index c26ea3e..10d64b7 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"हेर्नका लागि ट्याप गर्नुहोस्"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"स्क्रिन रेकर्डिङ सेभ गर्ने क्रममा त्रुटि भयो"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"स्क्रिन रेकर्ड गर्न थाल्ने क्रममा त्रुटि भयो"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"समस्यासम्बन्धी जानकारी रेकर्ड गर्ने रेकर्डर"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"समस्याको रेकर्डिङ प्रोसेस गरिँदै छ"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"समस्यासम्बन्धी जानकारी सङ्कलन गर्ने जारी सत्रसम्बन्धी सूचना"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"समस्याको रेकर्डिङ सेभ गर्ने क्रममा त्रुटि भयो"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"समस्यासम्बन्धी जानकारी रेकर्ड गर्न थाल्ने क्रममा त्रुटि भयो"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"फुल स्क्रिन हेरिँदै छ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"बाहिरिन सिरानबाट तलतिर स्वाइप गर्नुहोस्।"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"बुझेँ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"पछाडि"</string>
<string name="accessibility_home" msgid="5430449841237966217">"गृह"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"\"कोल्याप्स गर्नुहोस्\" आइकन"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"\"एक्स्पान्ड गर्नुहोस्\" आइकन"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"वा"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"किबोर्ड ब्याकलाइट"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d मध्ये %1$d औँ स्तर"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"होम कन्ट्रोलहरू"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 3eba8a8..c990cab 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tik om te bekijken"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Fout bij opslaan van schermopname"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Fout bij starten van schermopname"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Problemen opnemen"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Probleemopname verwerken"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Melding over actieve activiteit voor een sessie voor probleemverzameling"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Fout bij opslaan van probleemopname"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Fout bij starten van probleemopname"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Volledig scherm wordt getoond"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Swipe omlaag vanaf de bovenkant van het scherm om af te sluiten."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Terug"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Startscherm"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icoon voor samenvouwen"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Icoon voor uitvouwen"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"of"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Achtergrondverlichting van toetsenbord"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d van %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Bediening voor in huis"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 1e3ebab..49a3268 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ଦେଖିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ସ୍କ୍ରିନ ରେକର୍ଡିଂ ସେଭ କରିବାରେ ତ୍ରୁଟି"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ସ୍କ୍ରିନ୍ ରେକର୍ଡିଂ ଆରମ୍ଭ କରିବାରେ ତ୍ରୁଟି"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ସମସ୍ୟା ରେକର୍ଡର"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"ସମସ୍ୟାର ରେକର୍ଡିଂର ପ୍ରକ୍ରିୟାକରଣ"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ଏକ ସମସ୍ୟା ସଂଗ୍ରହ ସେସନ ପାଇଁ ଚାଲୁଥିବା ବିଜ୍ଞପ୍ତି"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"ସମସ୍ୟାର ରେକର୍ଡିଂ କରିବାରେ ତ୍ରୁଟି"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"ସମସ୍ୟାର ରେକର୍ଡିଂ ଆରମ୍ଭ କରିବାରେ ତ୍ରୁଟି"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନରେ ଦେଖିବା"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ବାହାରି ଯିବା ପାଇଁ, ଶୀର୍ଷରୁ ତଳକୁ ସ୍ୱାଇପ କରନ୍ତୁ।"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"ବୁଝିଗଲି"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ଫେରନ୍ତୁ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ହୋମ"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ଆଇକନକୁ ସଙ୍କୁଚିତ କରନ୍ତୁ"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ଆଇକନକୁ ବିସ୍ତାର କରନ୍ତୁ"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"କିମ୍ବା"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"କୀବୋର୍ଡ ବେକଲାଇଟ"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dରୁ %1$d ନମ୍ବର ଲେଭେଲ"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ହୋମ କଣ୍ଟ୍ରୋଲ୍ସ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index dddda72..6a7e9e8 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋ ਗਈ"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋਈ"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ਸਮੱਸਿਆ ਰਿਕਾਰਡਰ"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"ਸਮੱਸਿਆ ਰਿਕਾਰਡਿੰਗ ਪ੍ਰਕਿਰਿਆ-ਅਧੀਨ ਹੈ"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ਸਮੱਸਿਆ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਤਰ ਕਰਨ ਵਾਲੇ ਸੈਸ਼ਨ ਸੰਬੰਧੀ ਨਿਰੰਤਰ ਸੂਚਨਾ"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"ਸਮੱਸਿਆ ਰਿਕਾਰਡਿੰਗ ਰੱਖਿਅਤ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋ ਗਈ"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"ਸਮੱਸਿਆ ਰਿਕਾਰਡਿੰਗ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋ ਗਈ"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦੇਖਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ਬਾਹਰ ਜਾਣ ਲਈ, ਉਪਰੋਂ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"ਸਮਝ ਲਿਆ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ਪਿੱਛੇ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ਘਰ"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ਪ੍ਰਤੀਕ ਨੂੰ ਸਮੇਟੋ"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ਪ੍ਰਤੀਕ ਦਾ ਵਿਸਤਾਰ ਕਰੋ"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ਜਾਂ"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ਕੀ-ਬੋਰਡ ਬੈਕਲਾਈਟ"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ਵਿੱਚੋਂ %1$d ਪੱਧਰ"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ਹੋਮ ਕੰਟਰੋਲ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 2dbcf20..c154fc9b 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Kliknij, aby wyświetlić"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Podczas zapisywania nagrania ekranu wystąpił błąd"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Błąd podczas rozpoczynania rejestracji zawartości ekranu"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Rejestrator problemów"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Przetwarzam nagranie problemu"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Powiadomienie o trwającej aktywności sesji nagrywania ekranu"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Błąd podczas zapisywania nagrania problemu"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Błąd podczas rozpoczynania nagrania problemu"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Włączony pełny ekran"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Aby wyjść, przesuń palcem z góry na dół."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Wróć"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Ekran główny"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Zapisane"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"rozłącz"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktywuj"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatycznie włącz ponownie jutro"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Bluetootha używają funkcje takie jak szybkie udostępnianie czy Znajdź moje urządzenie"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth włączy się jutro rano"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona zwijania"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozwijania"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"lub"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podświetlenie klawiatury"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Poziom %1$d z %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Sterowanie domem"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 992db40..2e64391 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Toque para ver"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Erro ao salvar a gravação da tela"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Erro ao iniciar a gravação de tela"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Gravador de problemas"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Processando a gravação do problema"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notificação em andamento para uma sessão de coleta de problemas"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Erro ao salvar a gravação do problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Erro ao iniciar a gravação do problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visualização em tela cheia"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Para sair, deslize de cima para baixo."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Entendi"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Voltar"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Página inicial"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -596,7 +618,7 @@
<string name="screen_pinning_negative" msgid="6882816864569211666">"Agora não"</string>
<string name="screen_pinning_start" msgid="7483998671383371313">"App fixado"</string>
<string name="screen_pinning_exit" msgid="4553787518387346893">"App liberado"</string>
- <string name="stream_voice_call" msgid="7468348170702375660">"Ligar"</string>
+ <string name="stream_voice_call" msgid="7468348170702375660">"Ligações"</string>
<string name="stream_system" msgid="7663148785370565134">"Sistema"</string>
<string name="stream_ring" msgid="7550670036738697526">"Toques"</string>
<string name="stream_music" msgid="2188224742361847580">"Mídia"</string>
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone \"Abrir\""</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz de fundo do teclado"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Automação residencial"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index fb0bbfa..ca0f171 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Toque para ver"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Erro ao guardar a gravação de ecrã"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Ocorreu um erro ao iniciar a gravação do ecrã."</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Registador de problemas"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"A proc. registo de problemas"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notificação em curso de uma sessão de recolha de problemas"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Erro ao guardar o registo de problemas"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Erro ao iniciar o registo de problemas"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visualização de ecrã inteiro"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Para sair, deslize rapidamente para baixo a partir da parte superior."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Anterior"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Página inicial"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Guardado"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desassociar"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ativar"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Reativar amanhã automaticamente"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funcionalidades como a Partilha rápida e o serviço Localizar o meu dispositivo usam o Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"O Bluetooth vai ser ativado amanhã de manhã"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone de reduzir"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone de expandir"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz do teclado"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Controlos domésticos"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 992db40..2e64391 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Toque para ver"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Erro ao salvar a gravação da tela"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Erro ao iniciar a gravação de tela"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Gravador de problemas"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Processando a gravação do problema"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notificação em andamento para uma sessão de coleta de problemas"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Erro ao salvar a gravação do problema"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Erro ao iniciar a gravação do problema"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visualização em tela cheia"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Para sair, deslize de cima para baixo."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Entendi"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Voltar"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Página inicial"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -596,7 +618,7 @@
<string name="screen_pinning_negative" msgid="6882816864569211666">"Agora não"</string>
<string name="screen_pinning_start" msgid="7483998671383371313">"App fixado"</string>
<string name="screen_pinning_exit" msgid="4553787518387346893">"App liberado"</string>
- <string name="stream_voice_call" msgid="7468348170702375660">"Ligar"</string>
+ <string name="stream_voice_call" msgid="7468348170702375660">"Ligações"</string>
<string name="stream_system" msgid="7663148785370565134">"Sistema"</string>
<string name="stream_ring" msgid="7550670036738697526">"Toques"</string>
<string name="stream_music" msgid="2188224742361847580">"Mídia"</string>
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ícone \"Fechar\""</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ícone \"Abrir\""</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ou"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz de fundo do teclado"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Automação residencial"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index ff07fe9..36457fd 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Atinge pentru a afișa"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Eroare la salvarea înregistrării ecranului"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Eroare la începerea înregistrării ecranului"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Instrument de înregistrare a problemelor"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Se procesează înregistrarea problemei"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Notificare în curs pentru o sesiune de înregistrare a problemei"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Eroare la salvarea înregistrării problemei"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Eroare la începerea înregistrării problemei"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Vizualizare pe ecran complet"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Pentru a ieși, glisează de sus în jos."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Înapoi"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Ecranul de pornire"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Pictograma de restrângere"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Pictograma de extindere"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"sau"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Iluminarea din spate a tastaturii"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivelul %1$d din %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Comenzi pentru locuință"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 1900a8e..fe0e8db 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Нажмите, чтобы посмотреть."</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Не удалось сохранить запись видео с экрана."</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Не удалось начать запись видео с экрана."</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Запись проблем на видео"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Обрабатываем запись"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Текущее уведомление о записи проблемы на видео"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Не удалось сохранить запись."</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Не удалось начать запись."</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Полноэкранный режим"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Чтобы выйти, проведите по экрану сверху вниз."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"ОК"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Главный экран"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок \"Свернуть\""</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок \"Развернуть\""</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Подсветка клавиатуры"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Уровень %1$d из %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Управление домом"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 5d41eed..8357008 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"බැලීමට තට්ටු කරන්න"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"තිර පටිගත කිරීම සුරැකීමේ දෝෂයකි"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"තිර පටිගත කිරීම ආරම්භ කිරීමේ දෝෂයකි"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ගැටලු රෙකෝඩරය"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"ගැටලු වාර්තාව සැකසුම් කිරීම"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ගැටලු එකතු කිරීමේ සැසියක් සඳහා දැනට පවතින දැනුම්දීම"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"ගැටලුව සටහන් කිරීම සුරැකීමේ දෝෂය"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"ගැටලුව වාර්තා කිරීම ආරම්භ කිරීමේ දෝෂය"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"මුළු තිරය බලමින්"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ඉවත් වීමට, ඉහළ සිට පහළට ස්වයිප් කරන්න"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"තේරුණා"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ආපසු"</string>
<string name="accessibility_home" msgid="5430449841237966217">"මුල් පිටුව"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"ඉක්මන් බෙදා ගැනීම සහ මගේ උපාංගය සෙවීම වැනි විශේෂාංග බ්ලූටූත් භාවිත කරයි"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"බ්ලූටූත් හෙට උදේ සක්රීය වෙයි"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"හැකුළුම් නිරූපකය"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"දිගහැරීම් නිරූපකය"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"හෝ"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"යතුරු පුවරු පසු ආලෝකය"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dන් %1$d වැනි මට්ටම"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"නිවෙස් පාලන"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index eef2a01..148b390 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Zobrazte klepnutím"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Pri ukladaní nahrávky obrazovky sa vyskytla chyba"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Pri spustení nahrávania obrazovky sa vyskytla chyba"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Nástroj na zaznamenávanie problémov"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Záznam problému sa spracúva"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Upozornenie na prebiehajúcu aktivitu týkajúcu sa relácie zhromažďovania problémov"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Pri ukladaní záznamu problému sa vyskytla chyba"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Pri spúšťaní záznamu problému sa vyskytla chyba"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Zobrazenie na celú obrazovku"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Ukončíte potiahnutím zhora nadol."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Dobre"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Späť"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Plocha"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Uložené"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"odpojiť"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivovať"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automaticky zajtra znova zapnúť"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Funkcie ako Quick Share a Nájdi moje zariadenie používajú Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth sa zapne zajtra ráno"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona zbalenia"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona rozbalenia"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"alebo"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podsvietenie klávesnice"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. úroveň z %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Ovládanie domácnosti"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index facf72b..489551d 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Dotaknite se za ogled."</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Napaka pri shranjevanju posnetka zaslona"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Napaka pri začenjanju snemanja zaslona"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Snemalnik težav"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Obdelovanje posnetka težave"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Obvestilo o aktivni dejavnosti za sejo zbiranja težav"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Napaka pri shranjevanju posnetka težave"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Napaka pri zagonu snemanja težave"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Vklopljen je celozaslonski način."</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Zaprete ga tako, da z vrha s prstom povlečete navzdol."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Razumem"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Nazaj"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Začetni zaslon"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -600,7 +622,7 @@
<string name="stream_system" msgid="7663148785370565134">"Sistem"</string>
<string name="stream_ring" msgid="7550670036738697526">"Sprožitev zvonjenja"</string>
<string name="stream_music" msgid="2188224742361847580">"Predstavnost"</string>
- <string name="stream_alarm" msgid="16058075093011694">"Opozorilo"</string>
+ <string name="stream_alarm" msgid="16058075093011694">"Alarm"</string>
<string name="stream_notification" msgid="7930294049046243939">"Obvestilo"</string>
<string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
<string name="stream_dtmf" msgid="7322536356554673067">"Dvojna večtonska frekvenca"</string>
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona za strnitev"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona za razširitev"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ali"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Osvetlitev tipkovnice"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Stopnja %1$d od %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrolniki za dom"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 5333632..5b74b1e 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Trokit për të parë"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Gabim gjatë ruajtjes së regjistrimit të ekranit"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Gabim gjatë nisjes së regjistrimit të ekranit"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Regjistruesi i problemeve"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Regjistrimi i problemeve me përpunimin"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Njoftim në vazhdim për një seancë për mbledhjen e problemeve"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Gabim gjatë ruajtjes së regjistrimit të problemit"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Gabim gjatë nisjes së regjistrimit të problemit"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Po shikon ekranin e plotë"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Për të dalë, rrëshqit shpejt poshtë."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"E kuptova"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Prapa"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Faqja bazë"</string>
@@ -278,7 +299,8 @@
<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 sërish nesër"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -368,10 +390,8 @@
<string name="thermal" msgid="6758074791325414831">"Termike"</string>
<string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modaliteti i përdorimit me një dorë"</string>
<string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Pajisje ndihmëse për dëgjimin"</string>
- <!-- no translation found for quick_settings_hearing_devices_connected (6519069502397037781) -->
- <skip />
- <!-- no translation found for quick_settings_hearing_devices_disconnected (8907061223998176187) -->
- <skip />
+ <string name="quick_settings_hearing_devices_connected" msgid="6519069502397037781">"Aktive"</string>
+ <string name="quick_settings_hearing_devices_disconnected" msgid="8907061223998176187">"Shkëputur"</string>
<string name="quick_settings_hearing_devices_dialog_title" msgid="9004774017688484981">"Pajisjet e dëgjimit"</string>
<string name="quick_settings_pair_hearing_devices" msgid="5987105102207447322">"Çifto pajisje të re"</string>
<string name="accessibility_hearing_device_pair_new_device" msgid="8440082580186130090">"Kliko për të çiftuar një pajisje të re"</string>
@@ -1327,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikona e palosjes"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikona e zgjerimit"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"ose"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Drita e sfondit e tastierës"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveli: %1$d nga %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Kontrollet e shtëpisë"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index f35d7d8..1877274 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Додирните да бисте прегледали"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Грешка при чувању снимка екрана"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Грешка при покретању снимања екрана"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Снимач проблема"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Обрађује се снимак проблема"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"обавештење о активности у току за сесију прикупљања података о проблему"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Грешка при чувању снимка проблема"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Грешка при покретању снимања проблема"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Приказује се цео екран"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Да бисте изашли, превуците надоле одозго."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Важи"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Почетна"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Функције као што су Quick Share и Пронађи мој уређај користе Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth ће се укључити сутра ујутру"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Икона за скупљање"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Икона за проширивање"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"или"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Позадинско осветљење тастатуре"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. ниво од %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Контроле за дом"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 535a4aa..dc4dea1 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Tryck för att visa"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Det gick inte att spara skärminspelningen"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Det gick inte att starta skärminspelningen"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Probleminspelare"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Behandlar probleminspelning"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Avisering om pågående probleminsamlingssession"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Det gick inte att spara probleminspelning"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Det gick inte att starta probleminspelning"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visar på fullskärm"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Svep nedåt från skärmens överkant för att avsluta."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Tillbaka"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Startsida"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Ikonen Komprimera"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Ikonen Utöka"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"eller"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Bakgrundsbelysning för tangentbord"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivå %1$d av %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Hemstyrning"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 98a7e03..7bfef43 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Gusa ili uangalie"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Hitilafu imetokea wakati wa kuhifadhi rekodi ya skrini"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Hitilafu imetokea wakati wa kuanza kurekodi skrini"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Kifaa cha Kurekodi Hitilafu"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Mchakato wa kurekodi hitilafu unaendelea"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Arifa inayoendelea kuhusu kipindi cha ukusanyaji wa data ya hitilafu"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Hitilafu imetokea wakati wa kuhifadhi rekodi ya hitilafu"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Hitilafu imetokea wakati wa kuanza kurekodi hitilafu"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Unatazama kwenye skrini nzima"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Ili uondoke, telezesha kidole kutoka juu hadi chini."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Nimeelewa"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Nyuma"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Nyumbani"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Imehifadhiwa"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ondoa"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"anza kutumia"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Iwashe tena kesho kiotomatiki"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Vipengele kama vile Kutuma Haraka na Tafuta Kifaa Changu hutumia Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth itawaka kesho asubuhi"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Kunja aikoni"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Panua aikoni"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"au"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Mwanga chini ya kibodi"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Kiwango cha %1$d kati ya %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Dhibiti Vifaa Nyumbani"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 896b55f..6298363 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"பார்க்கத் தட்டவும்"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ஸ்கிரீன் ரெக்கார்டிங்கைச் சேமிப்பதில் பிழை ஏற்பட்டது"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ஸ்கிரீன் ரெக்கார்டிங்கைத் தொடங்குவதில் பிழை"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"சிக்கல் ரெக்கார்டர்"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"சிக்கல் ரெக்கார்டிங்கைச் செயலாக்குகிறது"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"சிக்கல் சேகரிப்பு அமர்வுக்கான பின்னணிச் செயல்பாட்டின் அறிவிப்பு"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"சிக்கல் தொடர்பான ரெக்கார்டிங்கைச் சேமிப்பதில் பிழை ஏற்பட்டது"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"சிக்கலை ரெக்கார்டிங் செய்யத் தொடங்குவதில் பிழை ஏற்பட்டது"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"முழுத் திரையில் காட்டுகிறது"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"வெளியேற, மேலிருந்து கீழே ஸ்வைப் செய்யவும்."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"சரி"</string>
<string name="accessibility_back" msgid="6530104400086152611">"பின்செல்"</string>
<string name="accessibility_home" msgid="5430449841237966217">"முகப்பு"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"சுருக்குவதற்கான ஐகான்"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"விரிவாக்குவதற்கான ஐகான்"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"அல்லது"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"கீபோர்டு பேக்லைட்"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"நிலை, %2$d இல் %1$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ஹோம் கன்ட்ரோல்கள்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index b88386f..e3238fe 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"చూడటానికి ట్యాప్ చేయండి"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"స్క్రీన్ రికార్డింగ్ను సేవ్ చేయడంలో ఎర్రర్ ఏర్పడింది"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"స్క్రీన్ రికార్డింగ్ ప్రారంభించడంలో ఎర్రర్ ఏర్పడింది"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"సమస్య రికార్డర్"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"సమస్య రికార్డింగ్ ప్రాసెసింగ్"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"సమస్య సేకరణ సెషన్ కోసం కొనసాగుతోన్న నోటిఫికేషన్"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"సమస్య రికార్డింగ్ను సేవ్ చేయడంలో ఎర్రర్ ఏర్పడింది"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"సమస్య రికార్డింగ్ను ప్రారంభించడంలో ఎర్రర్ ఏర్పడింది"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"ఫుల్ స్క్రీన్లో చూస్తున్నారు"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"నిష్క్రమించడానికి, పై నుండి కిందికి స్వైప్ చేయండి."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"సరే"</string>
<string name="accessibility_back" msgid="6530104400086152611">"వెనుకకు"</string>
<string name="accessibility_home" msgid="5430449841237966217">"హోమ్"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"కుదించండి చిహ్నం"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"విస్తరించండి చిహ్నం"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"లేదా"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"కీబోర్డ్ బ్యాక్లైట్"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dలో %1$dవ స్థాయి"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"హోమ్ కంట్రోల్స్"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 12c676e..d21bf5e 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"แตะเพื่อดู"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"เกิดข้อผิดพลาดในการบันทึกหน้าจอ"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"เกิดข้อผิดพลาดขณะเริ่มบันทึกหน้าจอ"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"โปรแกรมบันทึกปัญหา"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"กำลังประมวลผลการบันทึกปัญหา"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการรวบรวมปัญหา"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"เกิดข้อผิดพลาดในการบันทึกไฟล์บันทึกปัญหา"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"เกิดข้อผิดพลาดในการเริ่มบันทึกปัญหา"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"กำลังดูแบบเต็มหน้าจอ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"หากต้องการออก ให้ปัดลงจากด้านบน"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"รับทราบ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"กลับ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"หน้าแรก"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"ไอคอนยุบ"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"ไอคอนขยาย"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"หรือ"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ไฟแบ็กไลต์ของแป้นพิมพ์"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"ระดับที่ %1$d จาก %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ระบบควบคุมอุปกรณ์สมาร์ทโฮม"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 84a4541..b63d282 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"I-tap para tingnan"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Nagka-error sa pag-save ng recording ng screen"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Nagkaroon ng error sa pagsisimula ng pag-record ng screen"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Recorder ng Isyu"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Pinoproseso: recording ng isyu"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Kasalukuyang notification para sa session ng pangongolekta ng isyu"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Nagkaroon ng error sa pag-save ng recording ng isyu"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Nagkaroon ng error sa pagsisimula ng pag-record ng isyu"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Nanonood sa full screen"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Para lumabas, mag-swipe mula sa itaas pababa."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Bumalik"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Home"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"I-collapse ang icon"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"I-expand ang icon"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"o"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Backlight ng keyboard"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d sa %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Mga Home Control"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index c2df2c2..f78afe4 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Görüntülemek için dokunun"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Ekran kaydı saklanırken hata oluştu"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Ekran kaydı başlatılırken hata oluştu"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Sorun Kaydedici"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Sorun kaydı işleniyor"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Sorun toplama oturumuyla ilgili devam eden görev bildirimi"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Sorun kaydı saklanırken hata oluştu"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Sorun kaydı başlatılırken hata oluştu"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Tam ekran olarak görüntüleme"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Çıkmak için yukarıdan aşağıya doğru hızlıca kaydırın."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Anladım"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Geri"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Ana sayfa"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Daralt simgesi"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Genişlet simgesi"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"veya"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klavye aydınlatması"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Seviye %1$d / %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Ev Kontrolleri"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 5fcfb3e..46d0619 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Натисніть, щоб переглянути"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Не вдалося зберегти запис відео з екрана"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Не вдалося почати запис екрана"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Засіб запису проблем"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Обробка запису проблеми"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Поточне сповіщення про сеанс збирання даних про проблему"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Не вдалося зберегти запис проблеми"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Не вдалося почати запис проблеми"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Перегляд на весь екран"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Щоб вийти, проведіть пальцем униз від верху екрана."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Головна"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Значок згортання"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Значок розгортання"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"або"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Підсвічування клавіатури"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Рівень %1$d з %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Автоматизація дому"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index f08dd7e..38bddf7 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"دیکھنے کے لیے تھپتھپائیں"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"اسکرین ریکارڈنگ محفوظ کرنے میں خرابی"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"اسکرین ریکارڈنگ شروع کرنے میں خرابی"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"ایشو ریکارڈر"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"ایشو ریکارڈنگ پروسیس ہو رہی ہے"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"ایشو کلیکشن سیشن کے لیے جاری اطلاع"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"ایشو ریکارڈنگ محفوظ کرنے میں خرابی"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"ایشو ریکارڈنگ شروع کرنے میں خرابی"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"فُل اسکرین میں دیکھ رہے ہیں"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"باہر نکلنے کیلئے اوپر سے نیچے کی طرف سوائپ کریں۔"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"سمجھ آ گئی"</string>
<string name="accessibility_back" msgid="6530104400086152611">"واپس جائیں"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ہوم"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"فوری اشتراک اور \'میرا آلہ ڈھونڈیں\' جیسی خصوصیات بلوٹوتھ کا استعمال کرتی ہیں"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"بلوٹوتھ کل صبح آن ہو جائے گا"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1329,6 +1351,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"آئیکن سکیڑیں"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"آئیکن پھیلائیں"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"یا"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"کی بورڈ بیک لائٹ"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d میں سے %1$d کا لیول"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"ہوم کنٹرولز"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 4a04a33..52ecbc3 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Koʻrish uchun bosing"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Ekran yozuvi saqlanmadi"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Ekranni yozib olish boshlanmadi"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Muammoni yozib olish vositasi"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Yozuv qayta ishlanmoqda"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Muammo toʻplash seansi uchun faol bildirishnoma"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Yozuv saqlanmadi"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Yozib olish boshlanmadi"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Butun ekran rejimi"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Chiqish uchun tepadan pastga torting."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Orqaga"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Uyga"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Saqlangan"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"uzish"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"faollashtirish"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Ertaga yana avtomatik yoqilsin"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Tezkor ulashuv va Qurilmamni top kabi funksiyalar Bluetooth ishlatadi"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"Bluetooth ertaga ertalab yoqiladi"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Yigʻish belgisi"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Yoyish belgisi"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"yoki"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatura orqa yoritkichi"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Daraja: %1$d / %2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Uy boshqaruvi"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 45d9165..041da41 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Nhấn để xem"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Có lỗi xảy ra khi lưu video ghi màn hình"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Lỗi khi bắt đầu ghi màn hình"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Trình ghi sự cố"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Đang xử lý bản ghi sự cố"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Thông báo hiển thị liên tục cho một phiên thu thập sự cố"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Đã xảy ra lỗi khi lưu bản ghi sự cố"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Đã xảy ra lỗi khi bắt đầu ghi sự cố"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Xem toàn màn hình"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Để thoát, hãy vuốt từ trên cùng xuống dưới."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Tôi hiểu"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Quay lại"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Trang chủ"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <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>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Biểu tượng Thu gọn"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Biểu tượng Mở rộng"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"hoặc"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Đèn nền bàn phím"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Độ sáng %1$d/%2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Điều khiển nhà"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 98a1187..9df7a50 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"点按即可查看"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"保存屏幕录制内容时出错"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"启动屏幕录制时出错"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"问题录制器"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"正在处理问题录制"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"针对问题收集会话的持续性通知"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"保存问题录制内容时出错"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"启动问题录制时出错"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"目前处于全屏模式"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"要退出,请从顶部向下滑动。"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"知道了"</string>
<string name="accessibility_back" msgid="6530104400086152611">"返回"</string>
<string name="accessibility_home" msgid="5430449841237966217">"主屏幕"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"快速分享、查找我的设备等功能会使用蓝牙"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"蓝牙将在明天早上开启"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收起图标"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展开图标"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"键盘背光"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 级,共 %2$d 级"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"家居控制"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index edc624f..fdb7759 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"輕按即可查看"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"儲存螢幕錄影時發生錯誤"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"開始錄影畫面時發生錯誤"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"問題記錄工具"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"正在處理問題記錄"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"問題收集工作階段的持續通知"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"儲存錄影問題時發生錯誤"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"開始記錄問題時發生錯誤"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"以全螢幕檢視"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"如要退出,請從螢幕頂部向下滑動。"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"知道了"</string>
<string name="accessibility_back" msgid="6530104400086152611">"返回"</string>
<string name="accessibility_home" msgid="5430449841237966217">"首頁"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"「快速共享」和「尋找我的裝置」等功能都會使用藍牙"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"藍牙將於明天上午開啟"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"鍵盤背光"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 級,共 %2$d 級"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"智能家居"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 5679282..cbeb38a 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"輕觸即可查看"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"儲存螢幕錄影內容時發生錯誤"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"開始錄製螢幕畫面時發生錯誤"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"問題記錄工具"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"正在處理問題記錄"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"問題收集工作階段的持續性通知"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"儲存問題記錄時發生錯誤"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"開始記錄問題時發生錯誤"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"以全螢幕檢視"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"如要退出,請從螢幕頂端向下滑動。"</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"我知道了"</string>
<string name="accessibility_back" msgid="6530104400086152611">"返回"</string>
<string name="accessibility_home" msgid="5430449841237966217">"主畫面"</string>
@@ -278,7 +299,8 @@
<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_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"「快速分享」和「尋找我的裝置」等功能都需要使用藍牙技術"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"藍牙會在明天早上開啟"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"收合圖示"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"展開圖示"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"或"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"鍵盤背光"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 級,共 %2$d 級"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"居家控制"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index a0a57ac..2117568 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -125,6 +125,26 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Thepha ukuze ubuke"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Iphutha lokulondoloza okokuqopha iskrini"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Iphutha lokuqala ukurekhoda isikrini"</string>
+ <!-- no translation found for screenrecord_stop_dialog_title (2685522129492260887) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_message (1926783607059442889) -->
+ <skip />
+ <!-- no translation found for screenrecord_stop_dialog_button (2883812564938194350) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_title (9212915050910250438) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_message (3181723638915877339) -->
+ <skip />
+ <!-- no translation found for share_to_app_stop_dialog_button (6334056916284230217) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_title (1910372600290258193) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_message (1502520537030715412) -->
+ <skip />
+ <!-- no translation found for cast_to_other_device_stop_dialog_button (6420183747435521834) -->
+ <skip />
+ <!-- no translation found for close_dialog_button (4749497706540104133) -->
+ <skip />
<string name="issuerecord_title" msgid="286627115110121849">"Ushicilelo Lokurekhoda"</string>
<string name="issuerecord_background_processing_label" msgid="1666840264959336876">"Icubungula ushicilelo lokurekhoda"</string>
<string name="issuerecord_channel_description" msgid="6142326363431474632">"Isaziso esiqhubekayo seqoqo leseshini yoshicilelo"</string>
@@ -135,7 +155,8 @@
<string name="issuerecord_save_error" msgid="6913040083446722726">"Iphutha ekulondolozeni ushicilelo lokurekhoda"</string>
<string name="issuerecord_start_error" msgid="3402782952722871190">"Iphutha lokuqalisa ushicilelo lokurekhoda"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Ukubuka isikrini esigcwele"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Ukuze uphume, swayiphela phansi kusuka phezulu."</string>
+ <!-- no translation found for immersive_cling_description (2717426731830851921) -->
+ <skip />
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ngiyezwa"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Emuva"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Ekhaya"</string>
@@ -278,7 +299,8 @@
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Ilondoloziwe"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"nqamula"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"yenza kusebenze"</string>
- <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Vula ngokuzenzekela futhi kusasa"</string>
+ <!-- no translation found for turn_on_bluetooth_auto_tomorrow (3345758139235739006) -->
+ <skip />
<string name="turn_on_bluetooth_auto_info_disabled" msgid="682984290339848844">"Izakhi ezifana nokuthi Ukwabelana Ngokushesha kanye nokuthi Thola Idivayisi Yami zisebenzisa i-Bluetooth"</string>
<string name="turn_on_bluetooth_auto_info_enabled" msgid="7440944034584560279">"IBluetooth izovuleka kusasa ekuseni"</string>
<!-- no translation found for quick_settings_bluetooth_audio_sharing_button (7545274861795853838) -->
@@ -1325,6 +1347,14 @@
<string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Goqa isithonjana"</string>
<string name="shortcut_helper_content_description_expand_icon" msgid="1084435697860417390">"Nweba isithonjana"</string>
<string name="shortcut_helper_key_combinations_or_separator" msgid="7082902112102125540">"noma"</string>
+ <!-- no translation found for touchpad_tutorial_back_gesture_button (2746834288077265946) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_home_gesture_button (7640544867625955304) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_action_key_button (3220074511852927267) -->
+ <skip />
+ <!-- no translation found for touchpad_tutorial_done_button (176168488821755503) -->
+ <skip />
<string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Ilambu lekhibhodi"</string>
<string name="keyboard_backlight_value" msgid="7336398765584393538">"Ileveli %1$d ka-%2$d"</string>
<string name="home_controls_dream_label" msgid="6567105701292324257">"Izilawuli Zasekhaya"</string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index eca5846..8381812 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -3123,6 +3123,8 @@
<!-- Accessibility label for a11y action to show the bouncer (pin/pattern/password) screen lock [CHAR LIMIT=NONE] -->
<string name="accessibility_bouncer">enter screen lock</string>
+ <!-- Accessibility label for side fingerprint sensor indicator [CHAR LIMIT=NONE] -->
+ <string name="accessibility_side_fingerprint_indicator_label">Touch the fingerprint sensor. It\u2019s the shorter button on the side of the phone</string>
<!-- Accessibility label for fingerprint sensor [CHAR LIMIT=NONE] -->
<string name="accessibility_fingerprint_label">Fingerprint sensor</string>
<!-- Accessibility action for tapping on an affordance that will bring up the user's
diff --git a/packages/SystemUI/src/com/android/systemui/emergency/EmergencyGesture.java b/packages/SystemUI/src/com/android/systemui/emergency/EmergencyGesture.java
index dccb24d..e65a42d 100644
--- a/packages/SystemUI/src/com/android/systemui/emergency/EmergencyGesture.java
+++ b/packages/SystemUI/src/com/android/systemui/emergency/EmergencyGesture.java
@@ -36,5 +36,17 @@
public static final String ACTION_LAUNCH_EMERGENCY =
"com.android.systemui.action.LAUNCH_EMERGENCY";
+ /**
+ * An alternate intent to launch the emergency flow if the device is in retail mode
+ */
+ public static final String ACTION_LAUNCH_EMERGENCY_RETAIL =
+ "com.android.systemui.action.LAUNCH_EMERGENCY_RETAIL";
+
+ /**
+ * Launches the emergency information screen
+ */
+ public static final String ACTION_LAUNCH_EMERGENCY_INFO =
+ "com.android.systemui.action.LAUNCH_EMERGENCY_INFO";
+
private EmergencyGesture() {}
}
diff --git a/packages/SystemUI/src/com/android/systemui/emergency/EmergencyGestureModule.kt b/packages/SystemUI/src/com/android/systemui/emergency/EmergencyGestureModule.kt
new file mode 100644
index 0000000..858c2ea
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/emergency/EmergencyGestureModule.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.emergency
+
+import android.content.ComponentName
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.content.pm.ResolveInfo
+import android.content.res.Resources
+import android.text.TextUtils
+import android.util.Log
+import dagger.Module
+import dagger.Provides
+
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.res.R
+
+/** Module for providing emergency gesture objects. */
+@Module
+object EmergencyGestureModule {
+
+ val TAG: String = "EmergencyGestureModule"
+
+ @Provides
+ fun emergencyGestureIntentFactory(
+ packageManager: PackageManager,
+ @Main resources: Resources,
+ ): EmergencyGestureIntentFactory {
+ return object : EmergencyGestureIntentFactory {
+ override fun invoke(action: String): Intent? {
+ return getEmergencyActionIntent(packageManager, resources, action)
+ }
+ }
+ }
+
+ /**
+ * Return the "best" Emergency action intent for a given action
+ */
+ private fun getEmergencyActionIntent(
+ packageManager: PackageManager,
+ @Main resources: Resources,
+ action: String,
+ ): Intent? {
+ val emergencyIntent = Intent(action)
+ val emergencyActivities = packageManager.queryIntentActivities(emergencyIntent,
+ PackageManager.MATCH_SYSTEM_ONLY)
+ val resolveInfo: ResolveInfo? = getTopEmergencySosInfo(emergencyActivities, resources)
+ if (resolveInfo == null) {
+ Log.wtf(TAG, "Couldn't find an app to process the emergency intent.")
+ return null
+ }
+ emergencyIntent.setComponent(ComponentName(resolveInfo.activityInfo.packageName,
+ resolveInfo.activityInfo.name))
+ emergencyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ return emergencyIntent
+ }
+
+ /**
+ * Select and return the "best" ResolveInfo for Emergency SOS Activity.
+ */
+ private fun getTopEmergencySosInfo(
+ emergencyActivities: List<ResolveInfo>,
+ @Main resources: Resources,
+ ): ResolveInfo? {
+ // No matched activity.
+ if (emergencyActivities.isEmpty()) {
+ return null
+ }
+
+ // Of multiple matched Activities, give preference to the pre-set package name.
+ val preferredAppPackageName =
+ resources.getString(R.string.config_preferredEmergencySosPackage)
+
+ // If there is no preferred app, then return first match.
+ if (TextUtils.isEmpty(preferredAppPackageName)) {
+ return emergencyActivities.get(0)
+ }
+
+ for (emergencyInfo: ResolveInfo in emergencyActivities) {
+ // If activity is from the preferred app, use it.
+ if (TextUtils.equals(emergencyInfo.activityInfo.packageName, preferredAppPackageName)) {
+ return emergencyInfo
+ }
+ }
+ // No matching activity: return first match
+ return emergencyActivities.get(0)
+ }
+
+ /**
+ * Creates an intent to launch the Emergency action. If no handler is present, returns `null`.
+ */
+ public interface EmergencyGestureIntentFactory {
+ operator fun invoke(action: String): Intent?
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt
index 04fa749..8706280 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt
@@ -123,7 +123,7 @@
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
+ val screenWidth = windowManager.maximumWindowMetrics.bounds.width()
bottomSheetBehavior.maxWidth = (sheetScreenWidthFraction * screenWidth).toInt()
}
@@ -132,7 +132,7 @@
val safeDrawingInsets = insets.safeDrawing
// Make sure the bottom sheet is not covered by the status bar.
bottomSheetBehavior.maxHeight =
- resources.displayMetrics.heightPixels - safeDrawingInsets.top
+ windowManager.maximumWindowMetrics.bounds.height() - safeDrawingInsets.top
// Make sure the contents inside of the bottom sheet are not hidden by system bars, or
// cutouts.
bottomSheet.updatePadding(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
index 25c3b0d..7fa197c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
@@ -118,7 +118,6 @@
fun startToLockscreenTransition() {
scope.launch {
- KeyguardWmStateRefactor.isUnexpectedlyInLegacyMode()
if (
transitionInteractor.startedKeyguardState.replayCache.last() ==
KeyguardState.DREAMING
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 7a2e610..215ac46 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
@@ -63,10 +63,10 @@
private fun setupAccessibilityDelegate() {
accessibilityDelegate =
object : AccessibilityDelegate() {
- private val accessibilityAuthenticateHint =
+ private val accessibilityBouncerHint =
AccessibilityNodeInfo.AccessibilityAction(
AccessibilityNodeInfoCompat.ACTION_CLICK,
- resources.getString(R.string.accessibility_authenticate_hint)
+ resources.getString(R.string.accessibility_bouncer)
)
private val accessibilityEnterHint =
AccessibilityNodeInfo.AccessibilityAction(
@@ -79,8 +79,8 @@
) {
super.onInitializeAccessibilityNodeInfo(v, info)
when (accessibilityHintType) {
- AccessibilityHintType.AUTHENTICATE ->
- info.addAction(accessibilityAuthenticateHint)
+ AccessibilityHintType.BOUNCER ->
+ info.addAction(accessibilityBouncerHint)
AccessibilityHintType.ENTER -> info.addAction(accessibilityEnterHint)
AccessibilityHintType.NONE -> return
}
@@ -274,7 +274,7 @@
enum class AccessibilityHintType {
NONE,
- AUTHENTICATE,
+ BOUNCER,
ENTER,
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
index 92bba38..4688088 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
@@ -162,6 +162,7 @@
KeyguardState.LOCKSCREEN, -> 1f
}
}
+
val useBackgroundProtection: StateFlow<Boolean> = isUdfpsSupported
val burnInOffsets: Flow<BurnInOffsets> =
deviceEntryUdfpsInteractor.isUdfpsEnrolledAndEnabled
@@ -263,13 +264,7 @@
val accessibilityDelegateHint: Flow<DeviceEntryIconView.AccessibilityHintType> =
accessibilityInteractor.isEnabled.flatMapLatest { touchExplorationEnabled ->
if (touchExplorationEnabled) {
- combine(iconType, isInteractive) { iconType, isInteractive ->
- if (isInteractive || iconType == DeviceEntryIconView.IconType.LOCK) {
- iconType.toAccessibilityHintType()
- } else {
- DeviceEntryIconView.AccessibilityHintType.NONE
- }
- }
+ iconType.map { it.toAccessibilityHintType() }
} else {
flowOf(DeviceEntryIconView.AccessibilityHintType.NONE)
}
@@ -289,8 +284,7 @@
private fun DeviceEntryIconView.IconType.toAccessibilityHintType():
DeviceEntryIconView.AccessibilityHintType {
return when (this) {
- DeviceEntryIconView.IconType.LOCK ->
- DeviceEntryIconView.AccessibilityHintType.AUTHENTICATE
+ DeviceEntryIconView.IconType.LOCK -> DeviceEntryIconView.AccessibilityHintType.BOUNCER
DeviceEntryIconView.IconType.UNLOCK -> DeviceEntryIconView.AccessibilityHintType.ENTER
DeviceEntryIconView.IconType.FINGERPRINT,
DeviceEntryIconView.IconType.NONE -> DeviceEntryIconView.AccessibilityHintType.NONE
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
index 14890d7..1e79f42 100644
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
@@ -364,6 +364,16 @@
return factory.create("MediaCarouselCtlrLog", 20);
}
+ /**
+ * Provides a buffer for media loading changes
+ */
+ @Provides
+ @SysUISingleton
+ @MediaLoadingLog
+ public static LogBuffer providesMediaLoadingLogBuffer(LogBufferFactory factory) {
+ return factory.create("MediaLoadingLog", 20);
+ }
+
/** Allows logging buffers to be tweaked via adb on debug builds but not on prod builds. */
@Provides
@SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaLoadingLog.kt b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaLoadingLog.kt
new file mode 100644
index 0000000..05e1b2e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaLoadingLog.kt
@@ -0,0 +1,26 @@
+/*
+ * 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.log.dagger
+
+import com.android.systemui.log.LogBuffer
+import javax.inject.Qualifier
+
+/** A [LogBuffer] for [com.android.systemui.media.controls.domain.pipeline.MediaLoadingLogger] */
+@Qualifier
+@MustBeDocumented
+@Retention(AnnotationRetention.RUNTIME)
+annotation class MediaLoadingLog
diff --git a/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java b/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java
index 1b3b473..988fe64 100644
--- a/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java
+++ b/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java
@@ -43,7 +43,7 @@
public class NotificationPlayer implements OnCompletionListener, OnErrorListener {
private static final int PLAY = 1;
private static final int STOP = 2;
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
private static final class Command {
int code;
diff --git a/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java b/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java
index 3ab0420..e7c2a45 100644
--- a/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java
+++ b/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java
@@ -53,7 +53,7 @@
@SysUISingleton
public class RingtonePlayer implements CoreStartable {
private static final String TAG = "RingtonePlayer";
- private static final boolean LOGD = false;
+ private static final boolean LOGD = true;
private final Context mContext;
// TODO: support Uri switching under same IBinder
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
index 8d19ce8..f78a0f9 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
@@ -24,6 +24,7 @@
import com.android.internal.annotations.VisibleForTesting
import com.android.internal.logging.InstanceId
import com.android.systemui.broadcast.BroadcastSender
+import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.media.controls.data.repository.MediaFilterRepository
import com.android.systemui.media.controls.shared.model.EXTRA_KEY_TRIGGER_RESUME
@@ -56,6 +57,7 @@
* This is added at the end of the pipeline since we may still need to handle callbacks from
* background users (e.g. timeouts).
*/
+@SysUISingleton
class MediaDataFilterImpl
@Inject
constructor(
@@ -68,11 +70,13 @@
private val logger: MediaUiEventLogger,
private val mediaFlags: MediaFlags,
private val mediaFilterRepository: MediaFilterRepository,
+ private val mediaLoadingLogger: MediaLoadingLogger,
) : MediaDataManager.Listener {
/** Non-UI listeners to media changes. */
private val _listeners: MutableSet<MediaDataProcessor.Listener> = mutableSetOf()
val listeners: Set<MediaDataProcessor.Listener>
get() = _listeners.toSet()
+
lateinit var mediaDataProcessor: MediaDataProcessor
// Ensure the field (and associated reference) isn't removed during optimization.
@@ -114,6 +118,7 @@
mediaFilterRepository.addSelectedUserMediaEntry(data)
+ mediaLoadingLogger.logMediaLoaded(data.instanceId, data.active, "loading media")
mediaFilterRepository.addMediaDataLoadingState(
MediaDataLoadingModel.Loaded(data.instanceId)
)
@@ -167,7 +172,6 @@
if (shouldReactivate) {
val lastActiveId = sorted.lastKey() // most recently active id
// Update loading state to consider this media active
- Log.d(TAG, "reactivating $lastActiveId instead of smartspace")
mediaFilterRepository.setReactivatedId(lastActiveId)
val mediaData = sorted[lastActiveId]!!.copy(active = true)
logger.logRecommendationActivated(
@@ -178,6 +182,11 @@
mediaFilterRepository.addMediaDataLoadingState(
MediaDataLoadingModel.Loaded(lastActiveId)
)
+ mediaLoadingLogger.logMediaLoaded(
+ mediaData.instanceId,
+ mediaData.active,
+ "reactivating media instead of smartspace"
+ )
listeners.forEach { listener ->
getKey(lastActiveId)?.let { lastActiveKey ->
listener.onMediaDataLoaded(
@@ -210,6 +219,7 @@
mediaFilterRepository.setRecommendationsLoadingState(
SmartspaceMediaLoadingModel.Loaded(key, shouldPrioritizeMutable)
)
+ mediaLoadingLogger.logRecommendationLoaded(key, data.isActive, "loading recommendations")
listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data, shouldPrioritizeMutable) }
}
@@ -220,6 +230,7 @@
mediaFilterRepository.addMediaDataLoadingState(
MediaDataLoadingModel.Removed(instanceId)
)
+ mediaLoadingLogger.logMediaRemoved(instanceId, "removing media card")
// Only notify listeners if something actually changed
listeners.forEach { it.onMediaDataRemoved(key, userInitiated) }
}
@@ -230,12 +241,16 @@
// First check if we had reactivated media instead of forwarding smartspace
mediaFilterRepository.reactivatedId.value?.let { lastActiveId ->
mediaFilterRepository.setReactivatedId(null)
- Log.d(TAG, "expiring reactivated key $lastActiveId")
// Update loading state with actual active value
mediaFilterRepository.selectedUserEntries.value[lastActiveId]?.let {
mediaFilterRepository.addMediaDataLoadingState(
MediaDataLoadingModel.Loaded(lastActiveId, immediately)
)
+ mediaLoadingLogger.logMediaLoaded(
+ lastActiveId,
+ it.active,
+ "expiring reactivated id"
+ )
listeners.forEach { listener ->
getKey(lastActiveId)?.let { lastActiveKey ->
listener.onMediaDataLoaded(lastActiveKey, lastActiveKey, it, immediately)
@@ -256,6 +271,11 @@
mediaFilterRepository.setRecommendationsLoadingState(
SmartspaceMediaLoadingModel.Removed(key, immediately)
)
+ mediaLoadingLogger.logRecommendationRemoved(
+ key,
+ immediately,
+ "removing recommendations card"
+ )
listeners.forEach { it.onSmartspaceMediaDataRemoved(key, immediately) }
}
@@ -265,11 +285,14 @@
mediaFilterRepository.allUserEntries.value.forEach { (key, data) ->
if (!lockscreenUserManager.isProfileAvailable(data.userId)) {
// Only remove media when the profile is unavailable.
- if (DEBUG) Log.d(TAG, "Removing $key after profile change")
mediaFilterRepository.removeSelectedUserMediaEntry(data.instanceId, data)
mediaFilterRepository.addMediaDataLoadingState(
MediaDataLoadingModel.Removed(data.instanceId)
)
+ mediaLoadingLogger.logMediaRemoved(
+ data.instanceId,
+ "Removing $key after profile change"
+ )
listeners.forEach { listener -> listener.onMediaDataRemoved(key, false) }
}
}
@@ -283,10 +306,10 @@
// Clear the list first and update loading state to remove media from UI.
mediaFilterRepository.clearSelectedUserMedia()
keyCopy.forEach { instanceId ->
- if (DEBUG) Log.d(TAG, "Removing $instanceId after user change")
mediaFilterRepository.addMediaDataLoadingState(
MediaDataLoadingModel.Removed(instanceId)
)
+ mediaLoadingLogger.logMediaRemoved(instanceId, "Removing media after user change")
getKey(instanceId)?.let {
listenersCopy.forEach { listener -> listener.onMediaDataRemoved(it, false) }
}
@@ -294,15 +317,15 @@
mediaFilterRepository.allUserEntries.value.forEach { (key, data) ->
if (lockscreenUserManager.isCurrentProfile(data.userId)) {
- if (DEBUG)
- Log.d(
- TAG,
- "Re-adding $key with instanceId=${data.instanceId} after user change"
- )
mediaFilterRepository.addSelectedUserMediaEntry(data)
mediaFilterRepository.addMediaDataLoadingState(
MediaDataLoadingModel.Loaded(data.instanceId)
)
+ mediaLoadingLogger.logMediaLoaded(
+ data.instanceId,
+ data.active,
+ "Re-adding $key after user change"
+ )
listenersCopy.forEach { listener -> listener.onMediaDataLoaded(key, null, data) }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaLoadingLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaLoadingLogger.kt
new file mode 100644
index 0000000..c6cfd65
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaLoadingLogger.kt
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.domain.pipeline
+
+import com.android.internal.logging.InstanceId
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.dagger.MediaLoadingLog
+import javax.inject.Inject
+
+/** A buffered log for media loading events. */
+@SysUISingleton
+class MediaLoadingLogger @Inject constructor(@MediaLoadingLog private val buffer: LogBuffer) {
+
+ fun logMediaLoaded(instanceId: InstanceId, active: Boolean, reason: String) {
+ buffer.log(
+ TAG,
+ LogLevel.DEBUG,
+ {
+ str1 = instanceId.toString()
+ bool1 = active
+ str2 = reason
+ },
+ { "add media $str1, active: $bool1, reason: $str2" }
+ )
+ }
+
+ fun logMediaRemoved(instanceId: InstanceId, reason: String) {
+ buffer.log(
+ TAG,
+ LogLevel.DEBUG,
+ {
+ str1 = instanceId.toString()
+ str2 = reason
+ },
+ { "removing media $str1, reason: $str2" }
+ )
+ }
+
+ fun logRecommendationLoaded(key: String, isActive: Boolean, reason: String) {
+ buffer.log(
+ TAG,
+ LogLevel.DEBUG,
+ {
+ str1 = key
+ bool1 = isActive
+ str2 = reason
+ },
+ { "add recommendation $str1, active $bool1, reason: $str2" }
+ )
+ }
+
+ fun logRecommendationRemoved(key: String, immediately: Boolean, reason: String) {
+ buffer.log(
+ TAG,
+ LogLevel.DEBUG,
+ {
+ str1 = key
+ bool1 = immediately
+ str2 = reason
+ },
+ { "removing recommendation $str1, immediate=$bool1, reason: $str2" }
+ )
+ }
+
+ companion object {
+ private const val TAG = "MediaLoadingLog"
+ }
+}
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 315a9fb..f0d8df5 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
@@ -155,13 +155,17 @@
mediaFlags.isPersistentSsCardEnabled(),
recsViewModel = recommendationsViewModel,
onAdded = { commonViewModel ->
- onMediaRecommendationAddedOrUpdated(commonViewModel)
+ onMediaRecommendationAddedOrUpdated(
+ commonViewModel as MediaCommonViewModel.MediaRecommendations
+ )
},
onRemoved = { immediatelyRemove ->
onMediaRecommendationRemoved(commonModel, immediatelyRemove)
},
onUpdated = { commonViewModel ->
- onMediaRecommendationAddedOrUpdated(commonViewModel)
+ onMediaRecommendationAddedOrUpdated(
+ commonViewModel as MediaCommonViewModel.MediaRecommendations
+ )
},
)
.also { mediaRecs = it }
@@ -185,7 +189,9 @@
}
}
- private fun onMediaRecommendationAddedOrUpdated(commonViewModel: MediaCommonViewModel) {
+ private fun onMediaRecommendationAddedOrUpdated(
+ commonViewModel: MediaCommonViewModel.MediaRecommendations
+ ) {
if (!interactor.isRecommendationActive()) {
if (!mediaFlags.isPersistentSsCardEnabled()) {
commonViewModel.onRemoved(true)
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
index 99c95b5..c9be993 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
@@ -45,6 +45,7 @@
import android.graphics.Region;
import android.hardware.input.InputManager;
import android.icu.text.SimpleDateFormat;
+import android.os.Handler;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemProperties;
@@ -410,6 +411,7 @@
PluginManager pluginManager,
@BackPanelUiThread UiThreadContext uiThreadContext,
@Background Executor backgroundExecutor,
+ @Background Handler bgHandler,
UserTracker userTracker,
NavigationModeController navigationModeController,
BackPanelController.Factory backPanelControllerFactory,
@@ -473,7 +475,8 @@
ViewConfiguration.getLongPressTimeout());
mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(
- mUiThreadContext.getHandler(), mContext, this::onNavigationSettingsChanged);
+ mUiThreadContext.getHandler(), bgHandler, mContext,
+ this::onNavigationSettingsChanged);
updateCurrentUserResources();
}
@@ -1316,6 +1319,7 @@
private final PluginManager mPluginManager;
private final UiThreadContext mUiThreadContext;
private final Executor mBackgroundExecutor;
+ private final Handler mBgHandler;
private final UserTracker mUserTracker;
private final NavigationModeController mNavigationModeController;
private final BackPanelController.Factory mBackPanelControllerFactory;
@@ -1336,6 +1340,7 @@
PluginManager pluginManager,
@BackPanelUiThread UiThreadContext uiThreadContext,
@Background Executor backgroundExecutor,
+ @Background Handler bgHandler,
UserTracker userTracker,
NavigationModeController navigationModeController,
BackPanelController.Factory backPanelControllerFactory,
@@ -1354,6 +1359,7 @@
mPluginManager = pluginManager;
mUiThreadContext = uiThreadContext;
mBackgroundExecutor = backgroundExecutor;
+ mBgHandler = bgHandler;
mUserTracker = userTracker;
mNavigationModeController = navigationModeController;
mBackPanelControllerFactory = backPanelControllerFactory;
@@ -1378,6 +1384,7 @@
mPluginManager,
mUiThreadContext,
mBackgroundExecutor,
+ mBgHandler,
mUserTracker,
mNavigationModeController,
mBackPanelControllerFactory,
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotDetectionController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotDetectionController.kt
index be39d2e..4bf6c96 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotDetectionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotDetectionController.kt
@@ -18,6 +18,7 @@
import android.content.pm.PackageManager
import android.content.pm.PackageManager.ComponentInfoFlags
+import android.content.pm.PackageManager.MATCH_ANY_USER
import android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS
import android.view.Display
import android.view.IWindowManager
@@ -47,7 +48,8 @@
// Convert component names to app names.
return components.map {
packageManager
- .getActivityInfo(it, ComponentInfoFlags.of(MATCH_DISABLED_COMPONENTS.toLong()))
+ .getActivityInfo(it, ComponentInfoFlags.of(
+ (MATCH_DISABLED_COMPONENTS or MATCH_ANY_USER).toLong()))
.loadLabel(packageManager)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
index 40d709d..3c3797b 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
@@ -7,6 +7,7 @@
import android.view.WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE
import com.android.internal.logging.UiEventLogger
import com.android.internal.util.ScreenshotRequest
+import com.android.systemui.Flags.screenshotShelfUi2
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.display.data.repository.DisplayRepository
@@ -139,8 +140,8 @@
private suspend fun getDisplaysToScreenshot(requestType: Int): List<Display> {
val allDisplays = displays.first()
- return if (requestType == TAKE_SCREENSHOT_PROVIDED_IMAGE) {
- // If this is a provided image, let's show the UI on the default display only.
+ return if (requestType == TAKE_SCREENSHOT_PROVIDED_IMAGE || screenshotShelfUi2()) {
+ // If this is a provided image or using the shelf UI, just screenshot th default display
allDisplays.filter { it.displayId == Display.DEFAULT_DISPLAY }
} else {
allDisplays.filter { it.type in ALLOWED_DISPLAY_TYPES }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index d193286..9624e0f 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -25,7 +25,6 @@
import static com.android.keyguard.KeyguardClockSwitch.LARGE;
import static com.android.keyguard.KeyguardClockSwitch.SMALL;
import static com.android.systemui.Flags.predictiveBackAnimateShade;
-import static com.android.systemui.Flags.shadeCollapseActivityLaunchFix;
import static com.android.systemui.Flags.smartspaceRelocateToBottom;
import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK;
import static com.android.systemui.classifier.Classifier.GENERIC;
@@ -4125,11 +4124,7 @@
@Override
public boolean canBeCollapsed() {
- return !isFullyCollapsed() && !isTracking() && !isClosing()
- // Don't try to collapse if on keyguard, as the expansion fraction is 1 in this
- // case.
- && !(shadeCollapseActivityLaunchFix() && mExpandedFraction == 1f
- && mBarState == KEYGUARD);
+ return !isFullyCollapsed() && !isTracking() && !isClosing();
}
public void instantCollapse() {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt
index 558f179..d5953ca 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt
@@ -18,18 +18,22 @@
import com.android.keyguard.LockIconViewController
import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.model.SceneFamilies
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.data.repository.ShadeRepository
import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
class ShadeLockscreenInteractorImpl
@Inject
constructor(
+ @Main private val mainDispatcher: CoroutineDispatcher,
@Background private val backgroundScope: CoroutineScope,
private val shadeInteractor: ShadeInteractor,
private val sceneInteractor: SceneInteractor,
@@ -71,7 +75,7 @@
override fun transitionToExpandedShade(delay: Long) {
backgroundScope.launch {
delay(delay)
- changeToShadeScene()
+ withContext(mainDispatcher) { changeToShadeScene() }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 337ffa4..95cabfb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -1630,6 +1630,7 @@
"skip showing FACE_ERROR_TIMEOUT due to co-ex logic");
}
} else if (deferredFaceMessage != null) {
+ mBouncerMessageInteractor.setFaceAcquisitionMessage(deferredFaceMessage.toString());
// Face-only: The face timeout message is not very actionable, let's ask the
// user to manually retry.
showBiometricMessage(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
index 27536bc..c8f0b52 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.dagger;
+import com.android.systemui.emergency.EmergencyGestureModule;
import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
import com.android.systemui.statusbar.notification.row.NotificationRowModule;
import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule;
@@ -26,6 +27,6 @@
/** */
@Module(includes = {CentralSurfacesDependenciesModule.class,
StatusBarNotificationPresenterModule.class, StatusBarPhoneModule.class,
- NotificationsModule.class, NotificationRowModule.class})
+ NotificationsModule.class, NotificationRowModule.class, EmergencyGestureModule.class})
public interface CentralSurfacesModule {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 71a0b94..60a26dc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -837,8 +837,8 @@
y = (int) mScrollViewFields.getStackTop();
drawDebugInfo(canvas, y, Color.RED, /* label= */ "getStackTop() = " + y);
- y = (int) mScrollViewFields.getStackBottom();
- drawDebugInfo(canvas, y, Color.MAGENTA, /* label= */ "getStackBottom() = " + y);
+ y = (int) mScrollViewFields.getStackCutoff();
+ drawDebugInfo(canvas, y, Color.MAGENTA, /* label= */ "getStackCutoff() = " + y);
y = (int) mScrollViewFields.getHeadsUpTop();
drawDebugInfo(canvas, y, Color.GREEN, /* label= */ "getHeadsUpTop() = " + y);
@@ -1220,8 +1220,8 @@
}
@Override
- public void setStackBottom(float stackBottom) {
- mScrollViewFields.setStackBottom(stackBottom);
+ public void setStackCutoff(float stackCutoff) {
+ mScrollViewFields.setStackCutoff(stackCutoff);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt
index 6afcf37..a693dd7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt
@@ -38,7 +38,7 @@
* Y coordinate in view pixels above which the bottom of the notification stack / shelf / footer
* must be.
*/
- var stackBottom: Float = 0f
+ var stackCutoff: Float = 0f
/** Y coordinate in view pixels of the top of the HUN */
var headsUpTop: Float = 0f
/** Whether the notifications are scrolled all the way to the top (i.e. when freshly opened) */
@@ -80,7 +80,7 @@
pw.printSection("StackViewStates") {
pw.println("scrimClippingShape", scrimClippingShape)
pw.println("stackTop", stackTop)
- pw.println("stackBottom", stackBottom)
+ pw.println("stackCutoff", stackCutoff)
pw.println("headsUpTop", headsUpTop)
pw.println("isScrolledToTop", isScrolledToTop)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
index eaaa9a1..8d1a096 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
@@ -50,8 +50,11 @@
/** set the y position in px of the top of the stack in this view's coordinates */
fun setStackTop(stackTop: Float)
- /** set the y position in px of the bottom of the stack in this view's coordinates */
- fun setStackBottom(stackBottom: Float)
+ /**
+ * set the bottom-most acceptable y-position of the bottom of the notification stack/ shelf /
+ * footer.
+ */
+ fun setStackCutoff(stackBottom: Float)
/** set the y position in px of the top of the HUN in this view's coordinates */
fun setHeadsUpTop(headsUpTop: Float)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
index a21db12..ebb0d7d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
@@ -90,8 +90,10 @@
1f
} else if (
shadeMode != ShadeMode.Split &&
- transitionState.fromScene in SceneFamilies.Home &&
- transitionState.toScene in quickSettingsScene
+ (transitionState.fromScene in SceneFamilies.Home &&
+ transitionState.toScene == quickSettingsScene) ||
+ (transitionState.fromScene == quickSettingsScene &&
+ transitionState.toScene in SceneFamilies.Home)
) {
// during QS expansion, increase fraction at same rate as scrim alpha,
// but start when scrim alpha is at EXPANSION_FOR_DELAYED_STACK_FADE_IN.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
index fbc9e1c..a35709d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
@@ -499,6 +499,8 @@
occludedToLockscreenTransitionViewModel.lockscreenAlpha,
primaryBouncerToGoneTransitionViewModel.notificationAlpha,
primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha,
+ glanceableHubToLockscreenTransitionViewModel.keyguardAlpha,
+ lockscreenToGlanceableHubTransitionViewModel.keyguardAlpha,
)
return merge(
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 7434891..d75a738 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
@@ -21,7 +21,6 @@
import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.UserHandle;
@@ -261,9 +260,6 @@
boolean isScreenFullyOff();
- @Nullable
- Intent getEmergencyActionIntent();
-
boolean isCameraAllowedByAdmin();
boolean isGoingToSleep();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
index 7dac77e..c8a4450 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
@@ -46,6 +46,8 @@
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.DisplayId;
import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.emergency.EmergencyGesture;
+import com.android.systemui.emergency.EmergencyGestureModule.EmergencyGestureIntentFactory;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.qs.QSHost;
@@ -113,6 +115,8 @@
private int mDisabled1;
private int mDisabled2;
+ private final EmergencyGestureIntentFactory mEmergencyGestureIntentFactory;
+
@Inject
CentralSurfacesCommandQueueCallbacks(
CentralSurfaces centralSurfaces,
@@ -143,7 +147,8 @@
Lazy<CameraLauncher> cameraLauncherLazy,
UserTracker userTracker,
QSHost qsHost,
- ActivityStarter activityStarter) {
+ ActivityStarter activityStarter,
+ EmergencyGestureIntentFactory emergencyGestureIntentFactory) {
mCentralSurfaces = centralSurfaces;
mQsController = quickSettingsController;
mContext = context;
@@ -176,6 +181,7 @@
mCameraLaunchGestureVibrationEffect = getCameraGestureVibrationEffect(
mVibratorOptional, resources);
mActivityStarter = activityStarter;
+ mEmergencyGestureIntentFactory = emergencyGestureIntentFactory;
}
@Override
@@ -395,7 +401,8 @@
@Override
public void onEmergencyActionLaunchGestureDetected() {
- Intent emergencyIntent = mCentralSurfaces.getEmergencyActionIntent();
+ Intent emergencyIntent = mEmergencyGestureIntentFactory.invoke(
+ EmergencyGesture.ACTION_LAUNCH_EMERGENCY);
if (emergencyIntent == null) {
Log.wtf(CentralSurfaces.TAG, "Couldn't find an app to process the emergency intent.");
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 906baa2..3bc8e27 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.phone
-import android.content.Intent
import android.view.MotionEvent
import androidx.lifecycle.LifecycleRegistry
import com.android.keyguard.AuthKeyguardMessageArea
@@ -71,7 +70,6 @@
override fun getNavigationBarView(): NavigationBarView? = null
override fun setBouncerShowing(bouncerShowing: Boolean) {}
override fun isScreenFullyOff() = false
- override fun getEmergencyActionIntent(): Intent? = null
override fun isCameraAllowedByAdmin() = false
override fun isGoingToSleep() = false
override fun notifyBiometricAuthModeChanged() {}
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 42680ab..62c139b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -49,12 +49,9 @@
import android.app.WallpaperManager;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.graphics.Point;
import android.hardware.devicestate.DeviceStateManager;
@@ -74,7 +71,6 @@
import android.provider.Settings;
import android.service.dreams.IDreamManager;
import android.service.notification.StatusBarNotification;
-import android.text.TextUtils;
import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.EventLog;
@@ -136,6 +132,7 @@
import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor;
import com.android.systemui.emergency.EmergencyGesture;
+import com.android.systemui.emergency.EmergencyGestureModule.EmergencyGestureIntentFactory;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.fragments.ExtensionFragmentListener;
@@ -247,7 +244,6 @@
import java.io.PrintWriter;
import java.io.StringWriter;
-import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executor;
@@ -598,6 +594,8 @@
private final BrightnessMirrorShowingInteractor mBrightnessMirrorShowingInteractor;
private final GlanceableHubContainerController mGlanceableHubContainerController;
+ private final EmergencyGestureIntentFactory mEmergencyGestureIntentFactory;
+
/**
* Public constructor for CentralSurfaces.
*
@@ -710,7 +708,8 @@
Provider<FingerprintManager> fingerprintManager,
ActivityStarter activityStarter,
BrightnessMirrorShowingInteractor brightnessMirrorShowingInteractor,
- GlanceableHubContainerController glanceableHubContainerController
+ GlanceableHubContainerController glanceableHubContainerController,
+ EmergencyGestureIntentFactory emergencyGestureIntentFactory
) {
mContext = context;
mNotificationsController = notificationsController;
@@ -806,6 +805,7 @@
mActivityStarter = activityStarter;
mBrightnessMirrorShowingInteractor = brightnessMirrorShowingInteractor;
mGlanceableHubContainerController = glanceableHubContainerController;
+ mEmergencyGestureIntentFactory = emergencyGestureIntentFactory;
mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
mStartingSurfaceOptional = startingSurfaceOptional;
@@ -2628,7 +2628,8 @@
}
if (mLaunchEmergencyActionWhenFinishedWaking) {
mLaunchEmergencyActionWhenFinishedWaking = false;
- Intent emergencyIntent = getEmergencyActionIntent();
+ Intent emergencyIntent = mEmergencyGestureIntentFactory.invoke(
+ EmergencyGesture.ACTION_LAUNCH_EMERGENCY);
if (emergencyIntent != null) {
mContext.startActivityAsUser(emergencyIntent,
getActivityUserHandle(emergencyIntent));
@@ -2694,52 +2695,6 @@
return mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_OFF;
}
- @Nullable
- @Override
- public Intent getEmergencyActionIntent() {
- Intent emergencyIntent = new Intent(EmergencyGesture.ACTION_LAUNCH_EMERGENCY);
- PackageManager pm = mContext.getPackageManager();
- List<ResolveInfo> emergencyActivities = pm.queryIntentActivities(emergencyIntent,
- PackageManager.MATCH_SYSTEM_ONLY);
- ResolveInfo resolveInfo = getTopEmergencySosInfo(emergencyActivities);
- if (resolveInfo == null) {
- Log.wtf(TAG, "Couldn't find an app to process the emergency intent.");
- return null;
- }
- emergencyIntent.setComponent(new ComponentName(resolveInfo.activityInfo.packageName,
- resolveInfo.activityInfo.name));
- emergencyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return emergencyIntent;
- }
-
- /**
- * Select and return the "best" ResolveInfo for Emergency SOS Activity.
- */
- private @Nullable ResolveInfo getTopEmergencySosInfo(List<ResolveInfo> emergencyActivities) {
- // No matched activity.
- if (emergencyActivities == null || emergencyActivities.isEmpty()) {
- return null;
- }
-
- // Of multiple matched Activities, give preference to the pre-set package name.
- String preferredAppPackageName =
- mContext.getString(R.string.config_preferredEmergencySosPackage);
-
- // If there is no preferred app, then return first match.
- if (TextUtils.isEmpty(preferredAppPackageName)) {
- return emergencyActivities.get(0);
- }
-
- for (ResolveInfo emergencyInfo: emergencyActivities) {
- // If activity is from the preferred app, use it.
- if (TextUtils.equals(emergencyInfo.activityInfo.packageName, preferredAppPackageName)) {
- return emergencyInfo;
- }
- }
- // No matching activity: return first match
- return emergencyActivities.get(0);
- }
-
@Override
public boolean isCameraAllowedByAdmin() {
if (mDevicePolicyManager.getCameraDisabled(null,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
index 2235035..d2a1c44 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
@@ -29,6 +29,7 @@
import com.android.app.animation.Interpolators;
import com.android.internal.policy.GestureNavigationSettingsObserver;
import com.android.systemui.Dumpable;
+import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.CommandQueue;
@@ -124,6 +125,7 @@
@AssistedInject
public LightBarTransitionsController(
Context context,
+ @Background Handler bgHandler,
@Assisted DarkIntensityApplier applier,
CommandQueue commandQueue,
KeyguardStateController keyguardStateController,
@@ -140,7 +142,7 @@
mContext = context;
mDisplayId = mContext.getDisplayId();
mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(
- mHandler, mContext, this::onNavigationSettingsChanged);
+ mHandler, bgHandler, mContext, this::onNavigationSettingsChanged);
mGestureNavigationSettingsObserver.register();
onNavigationSettingsChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
index c089092..ca94363 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
@@ -31,6 +31,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfile;
@@ -71,6 +72,7 @@
private final LocalBluetoothManager mLocalBluetoothManager;
private final UserManager mUserManager;
private final int mCurrentUser;
+ private final Context mContext;
@GuardedBy("mConnectedDevices")
private final List<CachedBluetoothDevice> mConnectedDevices = new ArrayList<>();
@@ -99,6 +101,7 @@
@Main Looper mainLooper,
@Nullable LocalBluetoothManager localBluetoothManager,
@Nullable BluetoothAdapter bluetoothAdapter) {
+ mContext = context;
mDumpManager = dumpManager;
mLogger = logger;
mBluetoothRepository = bluetoothRepository;
@@ -262,9 +265,21 @@
}
private Collection<CachedBluetoothDevice> getDevices() {
- return mLocalBluetoothManager != null
- ? mLocalBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy()
- : Collections.emptyList();
+ Collection<CachedBluetoothDevice> devices =
+ mLocalBluetoothManager != null
+ ? mLocalBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy()
+ : Collections.emptyList();
+ if (com.android.settingslib.flags.Flags.enableHideExclusivelyManagedBluetoothDevice()) {
+ // When the device is exclusively managed by its owner app it needs to be hidden.
+ devices =
+ devices.stream()
+ .filter(
+ device ->
+ !BluetoothUtils.isExclusivelyManagedBluetoothDevice(
+ mContext, device.getDevice()))
+ .toList();
+ }
+ return devices;
}
private void updateConnected() {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 4205dd8..795d427 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -138,7 +138,6 @@
import com.android.systemui.volume.domain.interactor.VolumeDialogInteractor;
import com.android.systemui.volume.domain.interactor.VolumePanelNavigationInteractor;
import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag;
-import com.android.systemui.volume.ui.binder.VolumeDialogMenuIconBinder;
import com.android.systemui.volume.ui.navigation.VolumeNavigator;
import dagger.Lazy;
@@ -314,7 +313,6 @@
private int mDialogTimeoutMillis;
private final VibratorHelper mVibratorHelper;
private final com.android.systemui.util.time.SystemClock mSystemClock;
- private final VolumeDialogMenuIconBinder mVolumeDialogMenuIconBinder;
private final VolumePanelFlag mVolumePanelFlag;
private final VolumeDialogInteractor mInteractor;
@@ -336,7 +334,6 @@
DumpManager dumpManager,
Lazy<SecureSettings> secureSettings,
VibratorHelper vibratorHelper,
- VolumeDialogMenuIconBinder volumeDialogMenuIconBinder,
com.android.systemui.util.time.SystemClock systemClock,
VolumeDialogInteractor interactor) {
mContext =
@@ -370,7 +367,6 @@
mVolumePanelNavigationInteractor = volumePanelNavigationInteractor;
mVolumeNavigator = volumeNavigator;
mSecureSettings = secureSettings;
- mVolumeDialogMenuIconBinder = volumeDialogMenuIconBinder;
mDialogTimeoutMillis = DIALOG_TIMEOUT_MILLIS;
mVolumePanelFlag = volumePanelFlag;
mInteractor = interactor;
@@ -448,7 +444,6 @@
if (mDevicePostureController != null) {
mDevicePostureController.removeCallback(mDevicePostureControllerCallback);
}
- mVolumeDialogMenuIconBinder.destroy();
}
@Override
@@ -684,7 +679,6 @@
mSettingsView = mDialog.findViewById(R.id.settings_container);
mSettingsIcon = mDialog.findViewById(R.id.settings);
- mVolumeDialogMenuIconBinder.bind(mSettingsIcon);
if (mRows.isEmpty()) {
if (!AudioSystem.isSingleVolume(mContext)) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogModule.kt b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogModule.kt
deleted file mode 100644
index 54dc3db..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogModule.kt
+++ /dev/null
@@ -1,46 +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.systemui.volume
-
-import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag
-import com.android.systemui.volume.ui.viewmodel.AnimatedVolumeMenuIconViewModel
-import com.android.systemui.volume.ui.viewmodel.StaticVolumeMenuIconViewModel
-import com.android.systemui.volume.ui.viewmodel.VolumeMenuIconViewModel
-import dagger.Lazy
-import dagger.Module
-import dagger.Provides
-
-@Module
-interface VolumeDialogModule {
-
- companion object {
-
- @Provides
- fun provideVolumeMenuIconViewModel(
- volumePanelFlag: VolumePanelFlag,
- static: Lazy<StaticVolumeMenuIconViewModel>,
- animated: Lazy<AnimatedVolumeMenuIconViewModel>,
- ): VolumeMenuIconViewModel {
- return if (volumePanelFlag.canUseNewVolumePanel()) {
- animated
- } else {
- static
- }
- .get()
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java b/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java
index 8003f39..5420988 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java
@@ -38,7 +38,6 @@
import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.volume.VolumeDialogComponent;
import com.android.systemui.volume.VolumeDialogImpl;
-import com.android.systemui.volume.VolumeDialogModule;
import com.android.systemui.volume.VolumePanelDialogReceiver;
import com.android.systemui.volume.VolumeUI;
import com.android.systemui.volume.domain.interactor.VolumeDialogInteractor;
@@ -46,7 +45,6 @@
import com.android.systemui.volume.panel.dagger.VolumePanelComponent;
import com.android.systemui.volume.panel.dagger.factory.VolumePanelComponentFactory;
import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag;
-import com.android.systemui.volume.ui.binder.VolumeDialogMenuIconBinder;
import com.android.systemui.volume.ui.navigation.VolumeNavigator;
import dagger.Binds;
@@ -65,7 +63,6 @@
CaptioningModule.class,
MediaDevicesModule.class,
SpatializerModule.class,
- VolumeDialogModule.class,
},
subcomponents = {
VolumePanelComponent.class
@@ -118,7 +115,6 @@
DumpManager dumpManager,
Lazy<SecureSettings> secureSettings,
VibratorHelper vibratorHelper,
- VolumeDialogMenuIconBinder volumeDialogMenuIconBinder,
SystemClock systemClock,
VolumeDialogInteractor interactor) {
VolumeDialogImpl impl = new VolumeDialogImpl(
@@ -139,7 +135,6 @@
dumpManager,
secureSettings,
vibratorHelper,
- volumeDialogMenuIconBinder,
systemClock,
interactor);
impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaDeviceSessionInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaDeviceSessionInteractor.kt
index 12e624ca..6e1ebc8 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaDeviceSessionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaDeviceSessionInteractor.kt
@@ -19,10 +19,10 @@
import android.media.session.MediaController
import android.media.session.PlaybackState
import com.android.settingslib.volume.data.repository.MediaControllerRepository
-import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaControllerChangeModel
import com.android.systemui.volume.panel.component.mediaoutput.shared.model.MediaDeviceSession
+import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -38,7 +38,7 @@
/** Allows to observe and change [MediaDeviceSession] state. */
@OptIn(ExperimentalCoroutinesApi::class)
-@SysUISingleton
+@VolumePanelScope
class MediaDeviceSessionInteractor
@Inject
constructor(
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 8282210..31a8977 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
@@ -23,12 +23,11 @@
import com.android.settingslib.media.MediaDevice
import com.android.settingslib.volume.data.repository.LocalMediaRepository
import com.android.settingslib.volume.data.repository.MediaControllerRepository
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.volume.panel.component.mediaoutput.data.repository.LocalMediaRepositoryFactory
import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaDeviceSessions
import com.android.systemui.volume.panel.component.mediaoutput.shared.model.MediaDeviceSession
+import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
import com.android.systemui.volume.panel.shared.model.Result
import com.android.systemui.volume.panel.shared.model.filterData
import com.android.systemui.volume.panel.shared.model.wrapInResult
@@ -53,13 +52,13 @@
/** Provides observable models about the current media session state. */
@OptIn(ExperimentalCoroutinesApi::class)
-@SysUISingleton
+@VolumePanelScope
class MediaOutputInteractor
@Inject
constructor(
private val localMediaRepositoryFactory: LocalMediaRepositoryFactory,
private val packageManager: PackageManager,
- @Application private val coroutineScope: CoroutineScope,
+ @VolumePanelScope private val coroutineScope: CoroutineScope,
@Background private val backgroundCoroutineContext: CoroutineContext,
mediaControllerRepository: MediaControllerRepository,
private val mediaControllerInteractor: MediaControllerInteractor,
@@ -75,7 +74,7 @@
.onStart { emit(activeSessions) }
}
.map { getMediaControllers(it) }
- .stateIn(coroutineScope, SharingStarted.WhileSubscribed(), MediaControllers(null, null))
+ .stateIn(coroutineScope, SharingStarted.Eagerly, MediaControllers(null, null))
/** [MediaDeviceSessions] that contains currently active sessions. */
val activeMediaDeviceSessions: Flow<MediaDeviceSessions> =
@@ -86,11 +85,7 @@
remote = it.remote?.mediaDeviceSession()
)
}
- .stateIn(
- coroutineScope,
- SharingStarted.WhileSubscribed(),
- MediaDeviceSessions(null, null)
- )
+ .stateIn(coroutineScope, SharingStarted.Eagerly, MediaDeviceSessions(null, null))
/** Returns the default [MediaDeviceSession] from [activeMediaDeviceSessions] */
val defaultActiveMediaSession: StateFlow<Result<MediaDeviceSession?>> =
@@ -105,7 +100,7 @@
}
.wrapInResult()
.flowOn(backgroundCoroutineContext)
- .stateIn(coroutineScope, SharingStarted.WhileSubscribed(), Result.Loading())
+ .stateIn(coroutineScope, SharingStarted.Eagerly, Result.Loading())
private val localMediaRepository: Flow<LocalMediaRepository> =
defaultActiveMediaSession
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ui/binder/VolumeDialogMenuIconBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/ui/binder/VolumeDialogMenuIconBinder.kt
deleted file mode 100644
index a352e28..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/ui/binder/VolumeDialogMenuIconBinder.kt
+++ /dev/null
@@ -1,79 +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.systemui.volume.ui.binder
-
-import android.animation.ValueAnimator
-import android.graphics.drawable.Animatable2
-import android.widget.ImageView
-import androidx.core.animation.doOnEnd
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.common.ui.binder.IconViewBinder
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.statusbar.CrossFadeHelper
-import com.android.systemui.volume.ui.viewmodel.VolumeMenuIconViewModel
-import javax.inject.Inject
-import kotlin.coroutines.resume
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.suspendCancellableCoroutine
-
-/** Binds volume dialog menu button icon. */
-class VolumeDialogMenuIconBinder
-@Inject
-constructor(
- @Application private val coroutineScope: CoroutineScope,
- private val viewModel: VolumeMenuIconViewModel,
-) {
-
- private var job: Job? = null
-
- fun bind(iconImageView: ImageView?) {
- job?.cancel()
- job =
- iconImageView?.let { imageView ->
- coroutineScope.launch {
- viewModel.icon.collectLatest { icon ->
- animate { CrossFadeHelper.fadeOut(imageView, it) }
- IconViewBinder.bind(icon, imageView)
- if (icon is Icon.Loaded && icon.drawable is Animatable2) {
- icon.drawable.start()
- }
- animate { CrossFadeHelper.fadeIn(imageView, it) }
- }
- }
- }
- }
-
- private suspend fun animate(update: (value: Float) -> Unit) =
- suspendCancellableCoroutine { continuation ->
- val anim = ValueAnimator.ofFloat(0f, 1f)
- anim.start()
- anim.addUpdateListener { update(it.animatedValue as Float) }
- anim.doOnEnd { continuation.resume(Unit) }
- continuation.invokeOnCancellation {
- anim.removeAllListeners()
- anim.cancel()
- }
- }
-
- fun destroy() {
- job?.cancel()
- job = null
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ui/viewmodel/VolumeMenuIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/ui/viewmodel/VolumeMenuIconViewModel.kt
deleted file mode 100644
index 0bd3adb..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/ui/viewmodel/VolumeMenuIconViewModel.kt
+++ /dev/null
@@ -1,81 +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.systemui.volume.ui.viewmodel
-
-import android.annotation.SuppressLint
-import android.content.Context
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.res.R
-import com.android.systemui.util.drawable.LoopedAnimatable2DrawableWrapper
-import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaDeviceSessionInteractor
-import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor
-import com.android.systemui.volume.panel.shared.model.filterData
-import javax.inject.Inject
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.distinctUntilChangedBy
-import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.flow.mapLatest
-
-/** View Model that provides an icon for the menu button of the volume dialog. */
-interface VolumeMenuIconViewModel {
-
- val icon: Flow<Icon>
-}
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SuppressLint("UseCompatLoadingForDrawables")
-class AnimatedVolumeMenuIconViewModel
-@Inject
-constructor(
- @Application private val context: Context,
- private val mediaOutputInteractor: MediaOutputInteractor,
- private val mediaDeviceSessionInteractor: MediaDeviceSessionInteractor,
-) : VolumeMenuIconViewModel {
-
- override val icon: Flow<Icon>
- get() =
- mediaOutputInteractor.defaultActiveMediaSession
- .filterData()
- .flatMapLatest { session ->
- if (session == null) {
- flowOf(null)
- } else {
- mediaDeviceSessionInteractor.playbackState(session)
- }
- }
- .distinctUntilChangedBy { it?.isActive }
- .mapLatest { playbackState ->
- if (playbackState?.isActive == true) {
- Icon.Loaded(
- LoopedAnimatable2DrawableWrapper.fromDrawable(
- context.getDrawable(R.drawable.audio_bars_playing)!!
- ),
- null,
- )
- } else {
- Icon.Resource(R.drawable.horizontal_ellipsis, null)
- }
- }
-}
-
-class StaticVolumeMenuIconViewModel @Inject constructor() : VolumeMenuIconViewModel {
-
- override val icon: Flow<Icon> = flowOf(Icon.Resource(R.drawable.horizontal_ellipsis, null))
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
index 064cf09..4da56b5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
@@ -53,8 +53,10 @@
import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.ArgumentMatchers.anyLong
+import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mock
import org.mockito.Mockito.never
+import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.any
@@ -100,6 +102,7 @@
private lateinit var dataPrivateProfile: MediaData
private val clock = FakeSystemClock()
private val repository: MediaFilterRepository = kosmos.mediaFilterRepository
+ private val mediaLoadingLogger = kosmos.mockMediaLoadingLogger
@Before
fun setup() {
@@ -118,6 +121,7 @@
logger,
mediaFlags,
repository,
+ mediaLoadingLogger,
)
mediaDataFilter.mediaDataProcessor = mediaDataProcessor
mediaDataFilter.addListener(listener)
@@ -176,6 +180,8 @@
verify(listener)
.onMediaDataLoaded(eq(KEY), eq(null), eq(dataMain), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataMain.instanceId), eq(dataMain.active), anyString())
assertThat(currentMedia).containsExactly(mediaCommonModel)
}
@@ -190,6 +196,7 @@
verify(listener, never())
.onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
+ verify(mediaLoadingLogger, never()).logMediaLoaded(any(), anyBoolean(), anyString())
assertThat(currentMedia).doesNotContain(mediaCommonModel)
}
@@ -203,11 +210,14 @@
// GIVEN a media was removed for main user
mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain)
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataMain.instanceId), eq(dataMain.active), anyString())
assertThat(currentMedia).containsExactly(mediaCommonModel)
mediaDataFilter.onMediaDataRemoved(KEY, false)
verify(listener).onMediaDataRemoved(eq(KEY), eq(false))
+ verify(mediaLoadingLogger).logMediaRemoved(eq(dataMain.instanceId), anyString())
assertThat(currentMedia).doesNotContain(mediaCommonModel)
}
@@ -221,6 +231,8 @@
mediaDataFilter.onMediaDataRemoved(KEY, false)
verify(listener, never()).onMediaDataRemoved(eq(KEY), eq(false))
+ verify(mediaLoadingLogger, never())
+ .logMediaRemoved(eq(dataGuest.instanceId), anyString())
assertThat(currentMedia).isEmpty()
}
@@ -233,6 +245,8 @@
// GIVEN that we have a media loaded for main user
mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain)
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataMain.instanceId), eq(dataMain.active), anyString())
assertThat(currentMedia).containsExactly(MediaCommonModel.MediaControl(mediaLoaded))
// and we switch to guest user
@@ -240,6 +254,7 @@
// THEN we should remove the main user's media
verify(listener).onMediaDataRemoved(eq(KEY), eq(false))
+ verify(mediaLoadingLogger).logMediaRemoved(eq(dataMain.instanceId), anyString())
assertThat(currentMedia).isEmpty()
}
@@ -260,6 +275,10 @@
// THEN we should add back the guest user media
verify(listener)
.onMediaDataLoaded(eq(KEY_ALT), eq(null), eq(dataGuest), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataGuest.instanceId), eq(dataGuest.active), anyString())
+
+ reset(mediaLoadingLogger)
// but not the main user's
verify(listener, never())
@@ -271,6 +290,8 @@
anyInt(),
anyBoolean()
)
+ verify(mediaLoadingLogger, never())
+ .logMediaLoaded(eq(dataMain.instanceId), anyBoolean(), anyString())
assertThat(currentMedia)
.containsExactly(MediaCommonModel.MediaControl(guestLoadedStatesModel))
assertThat(currentMedia)
@@ -292,6 +313,7 @@
val mediaLoadedStatesModel = MediaDataLoadingModel.Loaded(dataMain.instanceId)
// THEN we should remove the private profile media
verify(listener).onMediaDataRemoved(eq(KEY_ALT), eq(false))
+ verify(mediaLoadingLogger).logMediaRemoved(eq(dataGuest.instanceId), anyString())
assertThat(currentMedia)
.containsExactly(MediaCommonModel.MediaControl(mediaLoadedStatesModel))
}
@@ -541,6 +563,8 @@
assertThat(hasActiveMedia(selectedUserEntries)).isFalse()
verify(listener)
.onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true))
+ verify(mediaLoadingLogger)
+ .logRecommendationLoaded(eq(SMARTSPACE_KEY), eq(true), anyString())
verify(logger).logRecommendationAdded(SMARTSPACE_PACKAGE, SMARTSPACE_INSTANCE_ID)
verify(logger, never()).logRecommendationActivated(any(), any(), any())
}
@@ -570,6 +594,9 @@
verify(listener, never())
.onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+ verify(mediaLoadingLogger, never()).logMediaLoaded(any(), anyBoolean(), anyString())
+ verify(mediaLoadingLogger, never())
+ .logRecommendationLoaded(any(), anyBoolean(), anyString())
verify(logger, never()).logRecommendationAdded(any(), any())
verify(logger, never()).logRecommendationActivated(any(), any(), any())
}
@@ -607,6 +634,8 @@
assertThat(hasActiveMedia(selectedUserEntries)).isFalse()
verify(listener)
.onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true))
+ verify(mediaLoadingLogger)
+ .logRecommendationLoaded(eq(SMARTSPACE_KEY), eq(true), anyString())
verify(logger).logRecommendationAdded(SMARTSPACE_PACKAGE, SMARTSPACE_INSTANCE_ID)
verify(logger, never()).logRecommendationActivated(any(), any(), any())
}
@@ -641,6 +670,8 @@
.isFalse()
assertThat(hasActiveMedia(selectedUserEntries)).isFalse()
verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+ verify(mediaLoadingLogger, never())
+ .logRecommendationLoaded(any(), anyBoolean(), anyString())
verify(logger, never()).logRecommendationAdded(any(), any())
verify(logger, never()).logRecommendationActivated(any(), any(), any())
}
@@ -668,6 +699,10 @@
assertThat(currentMedia).containsExactly(controlCommonModel)
verify(listener)
.onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataCurrent.instanceId), eq(dataCurrent.active), anyString())
+
+ reset(mediaLoadingLogger)
// AND we get a smartspace signal
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
@@ -686,6 +721,10 @@
verify(listener, never())
.onMediaDataLoaded(eq(KEY), eq(KEY), any(), anyBoolean(), anyInt(), anyBoolean())
verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+ verify(mediaLoadingLogger, never())
+ .logMediaLoaded(eq(dataCurrent.instanceId), anyBoolean(), anyString())
+ verify(mediaLoadingLogger, never())
+ .logRecommendationLoaded(any(), anyBoolean(), anyString())
verify(logger, never()).logRecommendationAdded(any(), any())
verify(logger, never()).logRecommendationActivated(any(), any(), any())
}
@@ -711,6 +750,8 @@
assertThat(currentMedia).containsExactly(controlCommonModel)
verify(listener)
.onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataCurrent.instanceId), eq(dataCurrent.active), anyString())
// AND we get a smartspace signal
runCurrent()
@@ -736,8 +777,16 @@
eq(100),
eq(true)
)
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(
+ eq(dataCurrentAndActive.instanceId),
+ eq(dataCurrentAndActive.active),
+ anyString()
+ )
// Smartspace update shouldn't be propagated for the empty rec list.
verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+ verify(mediaLoadingLogger, never())
+ .logRecommendationLoaded(any(), anyBoolean(), anyString())
verify(logger, never()).logRecommendationAdded(any(), any())
verify(logger).logRecommendationActivated(eq(APP_UID), eq(PACKAGE), eq(INSTANCE_ID))
}
@@ -767,6 +816,8 @@
assertThat(currentMedia).containsExactly(controlCommonModel)
verify(listener)
.onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataCurrent.instanceId), eq(dataCurrent.active), anyString())
// AND we get a smartspace signal
runCurrent()
@@ -783,6 +834,12 @@
eq(100),
eq(true)
)
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(
+ eq(dataCurrentAndActive.instanceId),
+ eq(dataCurrentAndActive.active),
+ anyString()
+ )
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -795,6 +852,8 @@
assertThat(currentMedia).containsExactly(controlCommonModel, recsCommonModel)
verify(listener)
.onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(mediaLoadingLogger)
+ .logRecommendationLoaded(eq(SMARTSPACE_KEY), eq(true), anyString())
verify(logger).logRecommendationAdded(SMARTSPACE_PACKAGE, SMARTSPACE_INSTANCE_ID)
verify(logger).logRecommendationActivated(eq(APP_UID), eq(PACKAGE), eq(INSTANCE_ID))
}
@@ -811,6 +870,8 @@
mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
verify(listener).onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
+ verify(mediaLoadingLogger)
+ .logRecommendationRemoved(eq(SMARTSPACE_KEY), eq(true), anyString())
assertThat(currentMedia).isEmpty()
assertThat(
hasActiveMediaOrRecommendation(
@@ -842,6 +903,8 @@
assertThat(currentMedia).containsExactly(controlCommonModel)
verify(listener)
.onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataCurrent.instanceId), eq(dataCurrent.active), anyString())
runCurrent()
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
@@ -856,10 +919,18 @@
eq(100),
eq(true)
)
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(
+ eq(dataCurrentAndActive.instanceId),
+ eq(dataCurrentAndActive.active),
+ anyString()
+ )
mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
verify(listener).onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
+ verify(mediaLoadingLogger)
+ .logRecommendationRemoved(eq(SMARTSPACE_KEY), eq(true), anyString())
assertThat(currentMedia).containsExactly(controlCommonModel)
assertThat(
hasActiveMediaOrRecommendation(
@@ -890,6 +961,8 @@
verify(listener)
.onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(mediaLoadingLogger)
+ .logRecommendationLoaded(eq(SMARTSPACE_KEY), eq(false), anyString())
assertThat(currentMedia).containsExactly(recsCommonModel)
assertThat(
hasActiveMediaOrRecommendation(
@@ -930,16 +1003,23 @@
verify(listener)
.onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataCurrent.instanceId), eq(dataCurrent.active), anyString())
assertThat(currentMedia).containsExactly(controlCommonModel)
+ reset(mediaLoadingLogger)
+
// And an inactive recommendation is loaded
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
// Smartspace is loaded but the media stays inactive
verify(listener)
.onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(mediaLoadingLogger)
+ .logRecommendationLoaded(eq(SMARTSPACE_KEY), eq(false), anyString())
verify(listener, never())
.onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
+ verify(mediaLoadingLogger, never()).logMediaLoaded(any(), anyBoolean(), anyString())
assertThat(currentMedia).containsExactly(controlCommonModel, recsCommonModel)
assertThat(
hasActiveMediaOrRecommendation(
@@ -995,6 +1075,8 @@
verify(listener)
.onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataCurrent.instanceId), eq(dataCurrent.active), anyString())
assertThat(currentMedia).containsExactly(controlCommonModel)
// AND we get a smartspace signal with extra to trigger resume
@@ -1014,6 +1096,12 @@
eq(100),
eq(true)
)
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(
+ eq(dataCurrentAndActive.instanceId),
+ eq(dataCurrentAndActive.active),
+ anyString()
+ )
assertThat(currentMedia).containsExactly(controlCommonModel, recsCommonModel)
assertThat(
hasActiveMediaOrRecommendation(
@@ -1026,6 +1114,8 @@
// And update the smartspace data state, but not prioritized
verify(listener)
.onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(mediaLoadingLogger)
+ .logRecommendationLoaded(eq(SMARTSPACE_KEY), eq(true), anyString())
}
@Test
@@ -1049,8 +1139,12 @@
verify(listener)
.onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ verify(mediaLoadingLogger)
+ .logMediaLoaded(eq(dataCurrent.instanceId), eq(dataCurrent.active), anyString())
assertThat(currentMedia).containsExactly(controlCommonModel)
+ reset(mediaLoadingLogger)
+
// AND we get a smartspace signal with extra to not trigger resume
val extras = Bundle().apply { putBoolean(EXTRA_KEY_TRIGGER_RESUME, false) }
whenever(cardAction.extras).thenReturn(extras)
@@ -1059,9 +1153,13 @@
// THEN listeners are not updated to show media
verify(listener, never())
.onMediaDataLoaded(eq(KEY), eq(KEY), any(), eq(true), eq(100), eq(true))
+ verify(mediaLoadingLogger, never())
+ .logMediaLoaded(eq(dataCurrent.instanceId), anyBoolean(), anyString())
// But the smartspace update is still propagated
verify(listener)
.onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(mediaLoadingLogger)
+ .logRecommendationLoaded(eq(SMARTSPACE_KEY), eq(true), anyString())
assertThat(currentMedia).containsExactly(controlCommonModel, recsCommonModel)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt
index 16091b2..1538c72 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt
@@ -19,6 +19,7 @@
import android.content.ComponentName
import android.content.pm.ActivityInfo
import android.content.pm.PackageManager
+import android.content.pm.PackageManager.MATCH_ANY_USER
import android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS
import android.testing.AndroidTestingRunner
import android.view.Display
@@ -169,12 +170,12 @@
private class ComponentInfoFlagMatcher(
@PackageManager.ComponentInfoFlagsBits val mask: Int, val value: Int
- ): ArgumentMatcher<PackageManager.ComponentInfoFlags> {
+ ) : ArgumentMatcher<PackageManager.ComponentInfoFlags> {
override fun matches(flags: PackageManager.ComponentInfoFlags?): Boolean {
return flags != null && (mask.toLong() and flags.value) == value.toLong()
}
- override fun toString(): String{
+ override fun toString(): String {
return "mask 0x%08x == 0x%08x".format(mask, value)
}
}
@@ -191,16 +192,16 @@
whenever(
packageManager.getActivityInfo(
eq(component),
- argThat(includesFlagBits(MATCH_DISABLED_COMPONENTS))
+ argThat(includesFlagBits(MATCH_DISABLED_COMPONENTS or MATCH_ANY_USER))
)
- ).thenReturn(activityInfo);
+ ).thenReturn(activityInfo)
whenever(
packageManager.getActivityInfo(
eq(component),
argThat(excludesFlagBits(MATCH_DISABLED_COMPONENTS))
)
- ).thenThrow(PackageManager.NameNotFoundException::class.java);
+ ).thenThrow(PackageManager.NameNotFoundException::class.java)
whenever(windowManager.notifyScreenshotListeners(eq(Display.DEFAULT_DISPLAY)))
.thenReturn(listOf(component))
@@ -212,5 +213,4 @@
assertEquals(1, list.size)
assertEquals(appName, list[0])
}
-
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt
index bf7d909..dd6ba90 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt
@@ -3,6 +3,8 @@
import android.content.ComponentName
import android.graphics.Bitmap
import android.net.Uri
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
import android.testing.AndroidTestingRunner
import android.view.Display
import android.view.Display.TYPE_EXTERNAL
@@ -15,6 +17,7 @@
import androidx.test.filters.SmallTest
import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.internal.util.ScreenshotRequest
+import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.display.data.repository.FakeDisplayRepository
import com.android.systemui.display.data.repository.display
@@ -77,6 +80,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_severalDisplays_callsControllerForEachOne() =
testScope.runTest {
val internalDisplay = display(TYPE_INTERNAL, id = 0)
@@ -108,6 +112,32 @@
}
@Test
+ @EnableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
+ fun executeScreenshots_severalDisplaysShelfUi_justCallsOne() =
+ testScope.runTest {
+ val internalDisplay = display(TYPE_INTERNAL, id = 0)
+ val externalDisplay = display(TYPE_EXTERNAL, id = 1)
+ setDisplays(internalDisplay, externalDisplay)
+ val onSaved = { _: Uri? -> }
+ screenshotExecutor.executeScreenshots(createScreenshotRequest(), onSaved, callback)
+
+ verify(controllerFactory).create(eq(internalDisplay), any())
+
+ val capturer = ArgumentCaptor<ScreenshotData>()
+
+ verify(controller0).handleScreenshot(capturer.capture(), any(), any())
+ assertThat(capturer.value.displayId).isEqualTo(0)
+
+ assertThat(eventLogger.numLogs()).isEqualTo(1)
+ assertThat(eventLogger.get(0).eventId)
+ .isEqualTo(ScreenshotEvent.SCREENSHOT_REQUESTED_KEY_OTHER.id)
+ assertThat(eventLogger.get(0).packageName).isEqualTo(topComponent.packageName)
+
+ screenshotExecutor.onDestroy()
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_providedImageType_callsOnlyDefaultDisplayController() =
testScope.runTest {
val internalDisplay = display(TYPE_INTERNAL, id = 0)
@@ -139,6 +169,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_onlyVirtualDisplays_noInteractionsWithControllers() =
testScope.runTest {
setDisplays(display(TYPE_VIRTUAL, id = 0), display(TYPE_VIRTUAL, id = 1))
@@ -150,6 +181,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_allowedTypes_allCaptured() =
testScope.runTest {
whenever(controllerFactory.create(any(), any())).thenReturn(controller0)
@@ -168,6 +200,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_reportsOnFinishedOnlyWhenBothFinished() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -193,6 +226,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_oneFinishesOtherFails_reportFailsOnlyAtTheEnd() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -220,6 +254,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_allDisplaysFail_reportsFail() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -247,6 +282,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun onDestroy_propagatedToControllers() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -259,6 +295,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun removeWindows_propagatedToControllers() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -273,6 +310,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun onCloseSystemDialogsReceived_propagatedToControllers() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -287,6 +325,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun onCloseSystemDialogsReceived_someControllerHavePendingTransitions() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -303,6 +342,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_controllerCalledWithRequestProcessorReturnValue() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0))
@@ -324,6 +364,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_errorFromProcessor_logsScreenshotRequested() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -341,6 +382,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_errorFromProcessor_logsUiError() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -358,6 +400,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_errorFromProcessorOnDefaultDisplay_showsErrorNotification() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -384,6 +427,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_errorFromScreenshotController_reportsRequested() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -404,6 +448,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_errorFromScreenshotController_reportsError() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
@@ -424,6 +469,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SCREENSHOT_SHELF_UI2)
fun executeScreenshots_errorFromScreenshotController_showsErrorNotification() =
testScope.runTest {
setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = 1))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
index 6536405..13d44de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
@@ -18,7 +18,6 @@
import static com.android.keyguard.KeyguardClockSwitch.LARGE;
import static com.android.keyguard.KeyguardClockSwitch.SMALL;
-import static com.android.systemui.Flags.FLAG_SHADE_COLLAPSE_ACTIVITY_LAUNCH_FIX;
import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_CLOSED;
import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_OPEN;
import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_OPENING;
@@ -48,7 +47,6 @@
import android.graphics.Point;
import android.os.PowerManager;
import android.platform.test.annotations.DisableFlags;
-import android.platform.test.annotations.EnableFlags;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.MotionEvent;
@@ -679,32 +677,6 @@
}
@Test
- @EnableFlags(FLAG_SHADE_COLLAPSE_ACTIVITY_LAUNCH_FIX)
- public void testCanBeCollapsed_expandedInKeyguard() {
- mStatusBarStateController.setState(KEYGUARD);
- mNotificationPanelViewController.setExpandedFraction(1f);
-
- assertThat(mNotificationPanelViewController.canBeCollapsed()).isFalse();
- }
-
- @Test
- @EnableFlags(FLAG_SHADE_COLLAPSE_ACTIVITY_LAUNCH_FIX)
- public void testCanBeCollapsed_expandedInShade() {
- mStatusBarStateController.setState(SHADE);
- mNotificationPanelViewController.setExpandedFraction(1f);
- assertThat(mNotificationPanelViewController.canBeCollapsed()).isTrue();
- }
-
- @Test
- @DisableFlags(FLAG_SHADE_COLLAPSE_ACTIVITY_LAUNCH_FIX)
- public void testCanBeCollapsed_expandedInKeyguard_flagDisabled() {
- mStatusBarStateController.setState(KEYGUARD);
- mNotificationPanelViewController.setExpandedFraction(1f);
-
- assertThat(mNotificationPanelViewController.canBeCollapsed()).isTrue();
- }
-
- @Test
@Ignore("b/341163515 - fails to clean up animators correctly")
public void testSwipeWhileLocked_notifiesKeyguardState() {
mStatusBarStateController.setState(KEYGUARD);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
index 5675915..5e5586d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
@@ -40,6 +40,7 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.assist.AssistManager;
+import com.android.systemui.emergency.EmergencyGestureModule.EmergencyGestureIntentFactory;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.qs.QSHost;
@@ -101,6 +102,7 @@
@Mock private UserTracker mUserTracker;
@Mock private QSHost mQSHost;
@Mock private ActivityStarter mActivityStarter;
+ @Mock private EmergencyGestureIntentFactory mEmergencyGestureIntentFactory;
CentralSurfacesCommandQueueCallbacks mSbcqCallbacks;
@@ -137,7 +139,8 @@
mCameraLauncherLazy,
mUserTracker,
mQSHost,
- mActivityStarter);
+ mActivityStarter,
+ mEmergencyGestureIntentFactory);
when(mUserTracker.getUserHandle()).thenReturn(
UserHandle.of(ActivityManager.getCurrentUser()));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
index 7ea85a1..1eb33ce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
@@ -112,6 +112,7 @@
import com.android.systemui.communal.shared.model.CommunalScenes;
import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.dump.DumpManager;
+import com.android.systemui.emergency.EmergencyGestureModule.EmergencyGestureIntentFactory;
import com.android.systemui.flags.DisableSceneContainer;
import com.android.systemui.flags.EnableSceneContainer;
import com.android.systemui.flags.FakeFeatureFlags;
@@ -339,6 +340,7 @@
@Mock private KeyboardShortcutListSearch mKeyboardShortcutListSearch;
@Mock private PackageManager mPackageManager;
@Mock private GlanceableHubContainerController mGlanceableHubContainerController;
+ @Mock private EmergencyGestureIntentFactory mEmergencyGestureIntentFactory;
private ShadeController mShadeController;
private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
@@ -596,7 +598,8 @@
() -> mFingerprintManager,
mActivityStarter,
mBrightnessMirrorShowingInteractor,
- mGlanceableHubContainerController
+ mGlanceableHubContainerController,
+ mEmergencyGestureIntentFactory
);
mScreenLifecycle.addObserver(mCentralSurfaces.mScreenObserver);
mCentralSurfaces.initShadeVisibilityListener();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
index 43c19b8..7dfdb92 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
@@ -28,6 +28,7 @@
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.os.Handler;
import android.testing.TestableLooper;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -58,14 +59,16 @@
private KeyguardStateController mKeyguardStateController;
@Mock
private StatusBarStateController mStatusBarStateController;
+ @Mock
+ private Handler mBgHandler;
private LightBarTransitionsController mLightBarTransitionsController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mLightBarTransitionsController = new LightBarTransitionsController(mContext, mApplier,
- new CommandQueue(mContext, new FakeDisplayTracker(mContext)),
+ mLightBarTransitionsController = new LightBarTransitionsController(mContext,
+ mBgHandler, mApplier, new CommandQueue(mContext, new FakeDisplayTracker(mContext)),
mKeyguardStateController, mStatusBarStateController);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
index a1da167..9ab64d65 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
@@ -14,6 +14,10 @@
package com.android.systemui.statusbar.policy;
+import static android.platform.test.flag.junit.FlagsParameterization.allCombinationsOf;
+
+import static com.android.settingslib.flags.Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
@@ -21,6 +25,7 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
@@ -30,7 +35,11 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
-import android.testing.AndroidTestingRunner;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.FlagsParameterization;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -55,16 +64,31 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
-@RunWith(AndroidTestingRunner.class)
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
+import platform.test.runner.parameterized.Parameters;
+
+@RunWith(ParameterizedAndroidJunit4.class)
@RunWithLooper
@SmallTest
public class BluetoothControllerImplTest extends SysuiTestCase {
+ @Parameters(name = "{0}")
+ public static List<FlagsParameterization> getParams() {
+ return allCombinationsOf(FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE);
+ }
+
+ private static final String TEST_EXCLUSIVE_MANAGER = "com.test.manager";
+
+ @Mock
+ private PackageManager mPackageManager;
+
private UserTracker mUserTracker;
private LocalBluetoothManager mMockBluetoothManager;
private CachedBluetoothDeviceManager mMockDeviceManager;
@@ -77,14 +101,21 @@
private FakeExecutor mBackgroundExecutor;
+ public BluetoothControllerImplTest(FlagsParameterization flags) {
+ super();
+ mSetFlagsRule.setFlagsParameterization(flags);
+ }
+
@Before
public void setup() throws Exception {
+ MockitoAnnotations.initMocks(this);
mTestableLooper = TestableLooper.get(this);
mMockBluetoothManager = mDependency.injectMockDependency(LocalBluetoothManager.class);
mDevices = new ArrayList<>();
mUserTracker = mock(UserTracker.class);
mMockDeviceManager = mock(CachedBluetoothDeviceManager.class);
mMockAdapter = mock(BluetoothAdapter.class);
+ mContext.setMockPackageManager(mPackageManager);
when(mMockDeviceManager.getCachedDevicesCopy()).thenReturn(mDevices);
when(mMockBluetoothManager.getCachedDeviceManager()).thenReturn(mMockDeviceManager);
mMockLocalAdapter = mock(LocalBluetoothAdapter.class);
@@ -114,6 +145,7 @@
CachedBluetoothDevice device = mock(CachedBluetoothDevice.class);
when(device.isConnected()).thenReturn(true);
when(device.getMaxConnectionState()).thenReturn(BluetoothProfile.STATE_CONNECTED);
+ when(device.getDevice()).thenReturn(mock(BluetoothDevice.class));
mDevices.add(device);
when(mMockLocalAdapter.getConnectionState())
@@ -139,10 +171,12 @@
public void getConnectedDevices_onlyReturnsConnected() {
CachedBluetoothDevice device1Disconnected = mock(CachedBluetoothDevice.class);
when(device1Disconnected.isConnected()).thenReturn(false);
+ when(device1Disconnected.getDevice()).thenReturn(mock(BluetoothDevice.class));
mDevices.add(device1Disconnected);
CachedBluetoothDevice device2Connected = mock(CachedBluetoothDevice.class);
when(device2Connected.isConnected()).thenReturn(true);
+ when(device2Connected.getDevice()).thenReturn(mock(BluetoothDevice.class));
mDevices.add(device2Connected);
mBluetoothControllerImpl.onDeviceAdded(device1Disconnected);
@@ -154,6 +188,46 @@
}
@Test
+ @EnableFlags(FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void getConnectedDevice_exclusivelyManagedDevice_doNotReturn()
+ throws PackageManager.NameNotFoundException {
+ CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
+ when(cachedDevice.isConnected()).thenReturn(true);
+ BluetoothDevice device = mock(BluetoothDevice.class);
+ when(device.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ TEST_EXCLUSIVE_MANAGER.getBytes());
+ when(cachedDevice.getDevice()).thenReturn(device);
+ doReturn(new ApplicationInfo()).when(mPackageManager).getApplicationInfo(
+ TEST_EXCLUSIVE_MANAGER, 0);
+
+ mDevices.add(cachedDevice);
+ mBluetoothControllerImpl.onDeviceAdded(cachedDevice);
+
+ assertThat(mBluetoothControllerImpl.getConnectedDevices()).isEmpty();
+ }
+
+ @Test
+ @DisableFlags(FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void getConnectedDevice_exclusivelyManagedDevice_returnsConnected()
+ throws PackageManager.NameNotFoundException {
+ CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
+ when(cachedDevice.isConnected()).thenReturn(true);
+ BluetoothDevice device = mock(BluetoothDevice.class);
+ when(device.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ TEST_EXCLUSIVE_MANAGER.getBytes());
+ when(cachedDevice.getDevice()).thenReturn(device);
+ doReturn(new ApplicationInfo()).when(mPackageManager).getApplicationInfo(
+ TEST_EXCLUSIVE_MANAGER, 0);
+
+ mDevices.add(cachedDevice);
+ mBluetoothControllerImpl.onDeviceAdded(cachedDevice);
+
+ assertThat(mBluetoothControllerImpl.getConnectedDevices()).hasSize(1);
+ assertThat(mBluetoothControllerImpl.getConnectedDevices().get(0))
+ .isEqualTo(cachedDevice);
+ }
+
+ @Test
public void testOnBluetoothStateChange_updatesBluetoothState() {
mBluetoothControllerImpl.onBluetoothStateChanged(BluetoothAdapter.STATE_OFF);
@@ -184,6 +258,7 @@
assertFalse(mBluetoothControllerImpl.isBluetoothConnected());
CachedBluetoothDevice device = mock(CachedBluetoothDevice.class);
+ when(device.getDevice()).thenReturn(mock(BluetoothDevice.class));
mDevices.add(device);
when(device.isConnected()).thenReturn(true);
when(device.getMaxConnectionState()).thenReturn(BluetoothProfile.STATE_CONNECTED);
@@ -402,6 +477,7 @@
private CachedBluetoothDevice createBluetoothDevice(
int profile, boolean isConnected, boolean isActive) {
CachedBluetoothDevice device = mock(CachedBluetoothDevice.class);
+ when(device.getDevice()).thenReturn(mock(BluetoothDevice.class));
mDevices.add(device);
when(device.isActiveDevice(profile)).thenReturn(isActive);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
index 57ddcde..4654a4d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
@@ -89,7 +89,6 @@
import com.android.systemui.volume.domain.interactor.VolumeDialogInteractor;
import com.android.systemui.volume.domain.interactor.VolumePanelNavigationInteractor;
import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag;
-import com.android.systemui.volume.ui.binder.VolumeDialogMenuIconBinder;
import com.android.systemui.volume.ui.navigation.VolumeNavigator;
import dagger.Lazy;
@@ -151,8 +150,6 @@
@Mock
private VolumeNavigator mVolumeNavigator;
@Mock
- private VolumeDialogMenuIconBinder mVolumeDialogMenuIconBinder;
- @Mock
private VolumePanelFlag mVolumePanelFlag;
@Mock
private VolumeDialogInteractor mVolumeDialogInteractor;
@@ -220,7 +217,6 @@
mDumpManager,
mLazySecureSettings,
mVibratorHelper,
- mVolumeDialogMenuIconBinder,
new FakeSystemClock(),
mVolumeDialogInteractor);
mDialog.init(0, null);
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterKosmos.kt
index d56222e..b8b0060 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterKosmos.kt
@@ -45,5 +45,6 @@
logger = mediaUiEventLogger,
mediaFlags = mediaFlags,
mediaFilterRepository = mediaFilterRepository,
+ mediaLoadingLogger = mediaLoadingLogger,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaLoadingLoggerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaLoadingLoggerKosmos.kt
new file mode 100644
index 0000000..96886f7
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaLoadingLoggerKosmos.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.domain.pipeline
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.log.logcatLogBuffer
+import org.mockito.Mockito.mock
+
+val Kosmos.mediaLoadingLogger by
+ Kosmos.Fixture { MediaLoadingLogger(logcatLogBuffer("MediaLoadingLogBuffer")) }
+val Kosmos.mockMediaLoadingLogger by Kosmos.Fixture { mock(MediaLoadingLogger::class.java) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorKosmos.kt
index bcea983..00b788f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorKosmos.kt
@@ -18,6 +18,7 @@
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.util.mockito.mock
@@ -25,6 +26,7 @@
val Kosmos.shadeLockscreenInteractor by
Kosmos.Fixture {
ShadeLockscreenInteractorImpl(
+ mainDispatcher = testDispatcher,
backgroundScope = applicationCoroutineScope,
shadeInteractor = shadeInteractorImpl,
sceneInteractor = sceneInteractor,
diff --git a/services/autofill/java/com/android/server/autofill/FillResponseEventLogger.java b/services/autofill/java/com/android/server/autofill/FillResponseEventLogger.java
index a69e33a..2391268 100644
--- a/services/autofill/java/com/android/server/autofill/FillResponseEventLogger.java
+++ b/services/autofill/java/com/android/server/autofill/FillResponseEventLogger.java
@@ -36,6 +36,7 @@
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_CANCELLED;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_FAILURE;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_SESSION_DESTROYED;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_TRANSACTION_TOO_LARGE;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_SUCCESS;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_TIMEOUT;
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_UNKNOWN;
@@ -162,6 +163,8 @@
AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_CANCELLED;
public static final int RESPONSE_STATUS_FAILURE =
AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_FAILURE;
+ public static final int RESPONSE_STATUS_TRANSACTION_TOO_LARGE =
+ AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_TRANSACTION_TOO_LARGE;
public static final int RESPONSE_STATUS_SESSION_DESTROYED =
AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_SESSION_DESTROYED;
public static final int RESPONSE_STATUS_SUCCESS =
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index 7ceb3bb..07f5dcc 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -82,9 +82,7 @@
void onFillRequestSuccess(int requestId, @Nullable FillResponse response,
@NonNull String servicePackageName, int requestFlags);
- void onFillRequestFailure(int requestId, @Nullable CharSequence message);
-
- void onFillRequestTimeout(int requestId);
+ void onFillRequestFailure(int requestId, Throwable t);
void onSaveRequestSuccess(@NonNull String servicePackageName,
@Nullable IntentSender intentSender);
@@ -345,11 +343,12 @@
Slog.e(TAG, "Error calling on fill request", err);
if (err instanceof TimeoutException) {
dispatchCancellationSignal(cancellationSink.get());
- mCallbacks.onFillRequestTimeout(request.getId());
+ mCallbacks.onFillRequestFailure(request.getId(), err);
} else if (err instanceof CancellationException) {
+ // Cancellation is a part of the user flow - don't mark as failure
dispatchCancellationSignal(cancellationSink.get());
} else {
- mCallbacks.onFillRequestFailure(request.getId(), err.getMessage());
+ mCallbacks.onFillRequestFailure(request.getId(), err);
}
}
}));
@@ -413,11 +412,12 @@
Slog.e(TAG, "Error calling on fill request", err);
if (err instanceof TimeoutException) {
dispatchCancellationSignal(cancellationSink.get());
- mCallbacks.onFillRequestTimeout(request.getId());
+ mCallbacks.onFillRequestFailure(request.getId(), err);
} else if (err instanceof CancellationException) {
+ // Cancellation is a part of the user flow - don't mark as failure
dispatchCancellationSignal(cancellationSink.get());
} else {
- mCallbacks.onFillRequestFailure(request.getId(), err.getMessage());
+ mCallbacks.onFillRequestFailure(request.getId(), err);
}
}
}));
diff --git a/services/autofill/java/com/android/server/autofill/RequestId.java b/services/autofill/java/com/android/server/autofill/RequestId.java
new file mode 100644
index 0000000..29ad786
--- /dev/null
+++ b/services/autofill/java/com/android/server/autofill/RequestId.java
@@ -0,0 +1,94 @@
+/*
+ * 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.autofill;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+// Helper class containing various methods to deal with FillRequest Ids.
+// For authentication flows, there needs to be a way to know whether to retrieve the Fill
+// Response from the primary provider or the secondary provider from the requestId. A simple
+// way to achieve this is by assigning odd number request ids to secondary provider and
+// even numbers to primary provider.
+public class RequestId {
+
+ private AtomicInteger sIdCounter;
+
+ // Mainly used for tests
+ RequestId(int start) {
+ sIdCounter = new AtomicInteger(start);
+ }
+
+ public RequestId() {
+ this((int) (Math.floor(Math.random() * 0xFFFF)));
+ }
+
+ public static int getLastRequestIdIndex(List<Integer> requestIds) {
+ int lastId = -1;
+ int indexOfBiggest = -1;
+ // Biggest number is usually the latest request, since IDs only increase
+ // The only exception is when the request ID wraps around back to 0
+ for (int i = requestIds.size() - 1; i >= 0; i--) {
+ if (requestIds.get(i) > lastId) {
+ lastId = requestIds.get(i);
+ indexOfBiggest = i;
+ }
+ }
+
+ // 0xFFFE + 2 == 0x1 (for secondary)
+ // 0xFFFD + 2 == 0x0 (for primary)
+ // Wrap has occurred
+ if (lastId >= 0xFFFD) {
+ // Calculate the biggest size possible
+ // If list only has one kind of request ids - we need to multiple by 2
+ // (since they skip odd ints)
+ // Also subtract one from size because at least one integer exists pre-wrap
+ int calcSize = (requestIds.size()) * 2;
+ //Biggest possible id after wrapping
+ int biggestPossible = (lastId + calcSize) % 0xFFFF;
+ lastId = -1;
+ indexOfBiggest = -1;
+ for (int i = 0; i < requestIds.size(); i++) {
+ int currentId = requestIds.get(i);
+ if (currentId <= biggestPossible && currentId > lastId) {
+ lastId = currentId;
+ indexOfBiggest = i;
+ }
+ }
+ }
+
+ return indexOfBiggest;
+ }
+
+ public int nextId(boolean isSecondary) {
+ // For authentication flows, there needs to be a way to know whether to retrieve the Fill
+ // Response from the primary provider or the secondary provider from the requestId. A simple
+ // way to achieve this is by assigning odd number request ids to secondary provider and
+ // even numbers to primary provider.
+ int requestId;
+
+ do {
+ requestId = sIdCounter.incrementAndGet() % 0xFFFF;
+ sIdCounter.set(requestId);
+ } while (isSecondaryProvider(requestId) != isSecondary);
+ return requestId;
+ }
+
+ public static boolean isSecondaryProvider(int requestId) {
+ return requestId % 2 == 1;
+ }
+}
diff --git a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
index 044a064..a663896 100644
--- a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
+++ b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
@@ -75,12 +75,7 @@
}
@Override
- public void onFillRequestFailure(int requestId, @Nullable CharSequence message) {
-
- }
-
- @Override
- public void onFillRequestTimeout(int requestId) {
+ public void onFillRequestFailure(int requestId, Throwable t) {
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index cdae16b..494e956 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -66,6 +66,7 @@
import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_SESSION_DESTROYED;
import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_SUCCESS;
import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_TIMEOUT;
+import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_TRANSACTION_TOO_LARGE;
import static com.android.server.autofill.Helper.containsCharsInOrder;
import static com.android.server.autofill.Helper.createSanitizers;
import static com.android.server.autofill.Helper.getNumericValue;
@@ -137,6 +138,7 @@
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SystemClock;
+import android.os.TransactionTooLargeException;
import android.service.assist.classification.FieldClassificationRequest;
import android.service.assist.classification.FieldClassificationResponse;
import android.service.autofill.AutofillFieldClassificationService.Scores;
@@ -211,6 +213,7 @@
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
+import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -263,7 +266,7 @@
static final int AUGMENTED_AUTOFILL_REQUEST_ID = 1;
- private static AtomicInteger sIdCounter = new AtomicInteger(2);
+ private static RequestId mRequestId = new RequestId();
private static AtomicInteger sIdCounterForPcc = new AtomicInteger(2);
@@ -1333,7 +1336,7 @@
}
viewState.setState(newState);
- int requestId = getRequestId(isSecondary);
+ int requestId = mRequestId.nextId(isSecondary);
// Create a metrics log for the request
final int ordinal = mRequestLogs.size() + 1;
@@ -1415,25 +1418,6 @@
requestAssistStructureLocked(requestId, flags);
}
- private static int getRequestId(boolean isSecondary) {
- // For authentication flows, there needs to be a way to know whether to retrieve the Fill
- // Response from the primary provider or the secondary provider from the requestId. A simple
- // way to achieve this is by assigning odd number request ids to secondary provider and
- // even numbers to primary provider.
- int requestId;
- // TODO(b/158623971): Update this to prevent possible overflow
- if (isSecondary) {
- do {
- requestId = sIdCounter.getAndIncrement();
- } while (!isSecondaryProviderRequestId(requestId));
- } else {
- do {
- requestId = sIdCounter.getAndIncrement();
- } while (requestId == INVALID_REQUEST_ID || isSecondaryProviderRequestId(requestId));
- }
- return requestId;
- }
-
private boolean isRequestSupportFillDialog(int flags) {
return (flags & FLAG_SUPPORTS_FILL_DIALOG) != 0;
}
@@ -1441,7 +1425,7 @@
@GuardedBy("mLock")
private void requestAssistStructureForPccLocked(int flags) {
if (!mClassificationState.shouldTriggerRequest()) return;
- mFillRequestIdSnapshot = sIdCounter.get();
+ mFillRequestIdSnapshot = sIdCounterForPcc.get();
mClassificationState.updatePendingRequest();
// Get request id
int requestId;
@@ -2365,20 +2349,9 @@
// FillServiceCallbacks
@Override
@SuppressWarnings("GuardedBy")
- public void onFillRequestFailure(int requestId, @Nullable CharSequence message) {
- onFillRequestFailureOrTimeout(requestId, false, message);
- }
-
- // FillServiceCallbacks
- @Override
- @SuppressWarnings("GuardedBy")
- public void onFillRequestTimeout(int requestId) {
- onFillRequestFailureOrTimeout(requestId, true, null);
- }
-
- @SuppressWarnings("GuardedBy")
- private void onFillRequestFailureOrTimeout(int requestId, boolean timedOut,
- @Nullable CharSequence message) {
+ public void onFillRequestFailure(int requestId, Throwable t) {
+ CharSequence message = t.getMessage();
+ boolean timedOut = (t instanceof TimeoutException);
boolean showMessage = !TextUtils.isEmpty(message);
synchronized (mLock) {
@@ -2431,10 +2404,15 @@
}
}
- if (timedOut) {
+ if (t instanceof TimeoutException) {
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
NOT_SHOWN_REASON_REQUEST_TIMEOUT);
mFillResponseEventLogger.maybeSetResponseStatus(RESPONSE_STATUS_TIMEOUT);
+ } else if (t instanceof TransactionTooLargeException) {
+ mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
+ NOT_SHOWN_REASON_REQUEST_FAILED);
+ mFillResponseEventLogger.maybeSetResponseStatus(
+ RESPONSE_STATUS_TRANSACTION_TOO_LARGE);
} else {
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
NOT_SHOWN_REASON_REQUEST_FAILED);
@@ -2879,18 +2857,18 @@
// the auth UI.
Slog.w(TAG, "setAuthenticationResultLocked(" + authenticationId + "): no responses");
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
- AUTHENTICATION_RESULT_FAILURE);
+ AUTHENTICATION_RESULT_FAILURE);
mPresentationStatsEventLogger.logAndEndEvent();
removeFromService();
return;
}
- final FillResponse authenticatedResponse = isSecondaryProviderRequestId(requestId)
+ final FillResponse authenticatedResponse = mRequestId.isSecondaryProvider(requestId)
? mSecondaryResponses.get(requestId)
: mResponses.get(requestId);
if (authenticatedResponse == null || data == null) {
Slog.w(TAG, "no authenticated response");
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
- AUTHENTICATION_RESULT_FAILURE);
+ AUTHENTICATION_RESULT_FAILURE);
mPresentationStatsEventLogger.logAndEndEvent();
removeFromService();
return;
@@ -2905,7 +2883,7 @@
if (dataset == null) {
Slog.w(TAG, "no dataset with index " + datasetIdx + " on fill response");
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
- AUTHENTICATION_RESULT_FAILURE);
+ AUTHENTICATION_RESULT_FAILURE);
mPresentationStatsEventLogger.logAndEndEvent();
removeFromService();
return;
@@ -2946,7 +2924,7 @@
}
logAuthenticationStatusLocked(requestId, MetricsEvent.AUTOFILL_AUTHENTICATED);
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
- AUTHENTICATION_RESULT_SUCCESS);
+ AUTHENTICATION_RESULT_SUCCESS);
replaceResponseLocked(authenticatedResponse, (FillResponse) result, newClientState);
} else if (result instanceof GetCredentialResponse) {
if (sDebug) {
@@ -2980,9 +2958,10 @@
logAuthenticationStatusLocked(requestId,
MetricsEvent.AUTOFILL_DATASET_AUTHENTICATED);
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
- AUTHENTICATION_RESULT_SUCCESS);
+ AUTHENTICATION_RESULT_SUCCESS);
if (newClientState != null) {
- if (sDebug) Slog.d(TAG, "Updating client state from auth dataset");
+ if (sDebug)
+ Slog.d(TAG, "Updating client state from auth dataset");
mClientState = newClientState;
}
Dataset datasetFromResult = getEffectiveDatasetForAuthentication((Dataset) result);
@@ -2997,7 +2976,7 @@
logAuthenticationStatusLocked(requestId,
MetricsEvent.AUTOFILL_INVALID_DATASET_AUTHENTICATION);
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
- AUTHENTICATION_RESULT_FAILURE);
+ AUTHENTICATION_RESULT_FAILURE);
}
} else {
if (result != null) {
@@ -3006,15 +2985,11 @@
logAuthenticationStatusLocked(requestId,
MetricsEvent.AUTOFILL_INVALID_AUTHENTICATION);
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
- AUTHENTICATION_RESULT_FAILURE);
+ AUTHENTICATION_RESULT_FAILURE);
processNullResponseLocked(requestId, 0);
}
}
- private static boolean isSecondaryProviderRequestId(int requestId) {
- return requestId % 2 == 1;
- }
-
private Dataset getDatasetFromCredentialResponse(GetCredentialResponse result) {
if (result == null) {
return null;
@@ -6929,22 +6904,15 @@
@GuardedBy("mLock")
private int getLastResponseIndexLocked() {
- // The response ids are monotonically increasing so
- // we just find the largest id which is the last. We
- // do not rely on the internal ordering in sparse
- // array to avoid - wow this stopped working!?
- int lastResponseIdx = -1;
- int lastResponseId = -1;
if (mResponses != null) {
+ List<Integer> requestIdList = new ArrayList<>();
final int responseCount = mResponses.size();
for (int i = 0; i < responseCount; i++) {
- if (mResponses.keyAt(i) > lastResponseId) {
- lastResponseIdx = i;
- lastResponseId = mResponses.keyAt(i);
- }
+ requestIdList.add(mResponses.keyAt(i));
}
+ return mRequestId.getLastRequestIdIndex(requestIdList);
}
- return lastResponseIdx;
+ return -1;
}
private LogMaker newLogMaker(int category) {
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index e424ffa..6bd7445 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -775,7 +775,8 @@
this.mFGSLogger = new ForegroundServiceTypeLoggerModule();
this.mActiveServiceAnrTimer = new ProcessAnrTimer(service,
ActivityManagerService.SERVICE_TIMEOUT_MSG,
- "SERVICE_TIMEOUT");
+ "SERVICE_TIMEOUT",
+ new AnrTimer.Args().freeze(true));
this.mShortFGSAnrTimer = new ServiceAnrTimer(service,
ActivityManagerService.SERVICE_SHORT_FGS_ANR_TIMEOUT_MSG,
"SHORT_FGS_TIMEOUT");
@@ -7521,7 +7522,7 @@
}
}
if (timeout != null && mAm.mProcessList.isInLruListLOSP(proc)) {
- mActiveServiceAnrTimer.accept(proc);
+ final AutoCloseable timer = mActiveServiceAnrTimer.accept(proc);
Slog.w(TAG, "Timeout executing service: " + timeout);
StringWriter sw = new StringWriter();
PrintWriter pw = new FastPrintWriter(sw, false, 1024);
@@ -7534,7 +7535,7 @@
LAST_ANR_LIFETIME_DURATION_MSECS);
long waitedMillis = now - timeout.executingStart;
timeoutRecord = TimeoutRecord.forServiceExec(timeout.shortInstanceName,
- waitedMillis);
+ waitedMillis).setExpiredTimer(timer);
} else {
mActiveServiceAnrTimer.discard(proc);
final long delay = psr.shouldExecServicesFg()
@@ -7639,6 +7640,11 @@
super(Objects.requireNonNull(am).mHandler, msg, label);
}
+ ProcessAnrTimer(ActivityManagerService am, int msg, String label,
+ @NonNull AnrTimer.Args args) {
+ super(Objects.requireNonNull(am).mHandler, msg, label, args);
+ }
+
@Override
public int getPid(@NonNull ProcessRecord proc) {
return proc.getPid();
diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
index 935282b..178171d 100644
--- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
+++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
@@ -1337,7 +1337,7 @@
BroadcastAnrTimer(@NonNull Handler handler) {
super(Objects.requireNonNull(handler),
MSG_DELIVERY_TIMEOUT, "BROADCAST_TIMEOUT",
- new AnrTimer.Args().extend(true));
+ new AnrTimer.Args().extend(true).freeze(true));
}
@Override
@@ -1455,11 +1455,12 @@
if (deliveryState == BroadcastRecord.DELIVERY_TIMEOUT) {
r.anrCount++;
if (app != null && !app.isDebugging()) {
- mAnrTimer.accept(queue);
+ final AutoCloseable timer = mAnrTimer.accept(queue);
final String packageName = getReceiverPackageName(receiver);
final String className = getReceiverClassName(receiver);
- mService.appNotResponding(queue.app,
- TimeoutRecord.forBroadcastReceiver(r.intent, packageName, className));
+ TimeoutRecord tr = TimeoutRecord.forBroadcastReceiver(r.intent, packageName,
+ className).setExpiredTimer(timer);
+ mService.appNotResponding(queue.app, tr);
} else {
mAnrTimer.discard(queue);
}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 3b73e06..c9e0666 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -498,7 +498,8 @@
// Skip setting the process group for system_server, keep it as default.
return true;
}
- if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ final boolean traceEnabled = Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ if (traceEnabled) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setProcessGroup "
+ msg.obj + " to " + group);
}
@@ -509,7 +510,9 @@
Slog.w(TAG, "Failed setting process group of " + pid + " to " + group, e);
}
} finally {
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ if (traceEnabled) {
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ }
}
return true;
});
diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
index 76c5952..d4d4965 100644
--- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
@@ -60,6 +60,7 @@
import com.android.server.criticalevents.CriticalEventLog;
import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot;
import com.android.server.wm.WindowProcessController;
+import com.android.server.utils.AnrTimer;
import java.io.File;
import java.io.PrintWriter;
@@ -302,6 +303,9 @@
SparseBooleanArray lastPids = new SparseBooleanArray(20);
ActivityManagerService.VolatileDropboxEntryStates volatileDropboxEntriyStates = null;
+ // Release the expired timer preparatory to starting the dump or returning without dumping.
+ timeoutRecord.closeExpiredTimer();
+
if (mApp.isDebugging()) {
Slog.i(TAG, "Skipping debugged app ANR: " + this + " " + annotation);
return;
diff --git a/services/core/java/com/android/server/audio/AudioServerPermissionProvider.java b/services/core/java/com/android/server/audio/AudioServerPermissionProvider.java
index 76191bb..14eae8d 100644
--- a/services/core/java/com/android/server/audio/AudioServerPermissionProvider.java
+++ b/services/core/java/com/android/server/audio/AudioServerPermissionProvider.java
@@ -16,10 +16,20 @@
package com.android.server.audio;
+import static android.Manifest.permission.ACCESS_ULTRASOUND;
+import static android.Manifest.permission.BLUETOOTH_CONNECT;
import static android.Manifest.permission.CALL_AUDIO_INTERCEPTION;
+import static android.Manifest.permission.CAPTURE_AUDIO_HOTWORD;
+import static android.Manifest.permission.CAPTURE_AUDIO_OUTPUT;
+import static android.Manifest.permission.CAPTURE_MEDIA_OUTPUT;
+import static android.Manifest.permission.CAPTURE_TUNER_AUDIO_INPUT;
+import static android.Manifest.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT;
import static android.Manifest.permission.MODIFY_AUDIO_ROUTING;
+import static android.Manifest.permission.MODIFY_AUDIO_SETTINGS;
+import static android.Manifest.permission.MODIFY_DEFAULT_AUDIO_EFFECTS;
import static android.Manifest.permission.MODIFY_PHONE_STATE;
import static android.Manifest.permission.RECORD_AUDIO;
+import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
import android.annotation.Nullable;
import android.os.RemoteException;
@@ -52,10 +62,21 @@
static final String[] MONITORED_PERMS = new String[PermissionEnum.ENUM_SIZE];
static {
- MONITORED_PERMS[PermissionEnum.MODIFY_AUDIO_ROUTING] = MODIFY_AUDIO_ROUTING;
- MONITORED_PERMS[PermissionEnum.MODIFY_PHONE_STATE] = MODIFY_PHONE_STATE;
MONITORED_PERMS[PermissionEnum.RECORD_AUDIO] = RECORD_AUDIO;
+ MONITORED_PERMS[PermissionEnum.MODIFY_AUDIO_ROUTING] = MODIFY_AUDIO_ROUTING;
+ MONITORED_PERMS[PermissionEnum.MODIFY_AUDIO_SETTINGS] = MODIFY_AUDIO_SETTINGS;
+ MONITORED_PERMS[PermissionEnum.MODIFY_PHONE_STATE] = MODIFY_PHONE_STATE;
+ MONITORED_PERMS[PermissionEnum.MODIFY_DEFAULT_AUDIO_EFFECTS] = MODIFY_DEFAULT_AUDIO_EFFECTS;
+ MONITORED_PERMS[PermissionEnum.WRITE_SECURE_SETTINGS] = WRITE_SECURE_SETTINGS;
MONITORED_PERMS[PermissionEnum.CALL_AUDIO_INTERCEPTION] = CALL_AUDIO_INTERCEPTION;
+ MONITORED_PERMS[PermissionEnum.ACCESS_ULTRASOUND] = ACCESS_ULTRASOUND;
+ MONITORED_PERMS[PermissionEnum.CAPTURE_AUDIO_OUTPUT] = CAPTURE_AUDIO_OUTPUT;
+ MONITORED_PERMS[PermissionEnum.CAPTURE_MEDIA_OUTPUT] = CAPTURE_MEDIA_OUTPUT;
+ MONITORED_PERMS[PermissionEnum.CAPTURE_AUDIO_HOTWORD] = CAPTURE_AUDIO_HOTWORD;
+ MONITORED_PERMS[PermissionEnum.CAPTURE_TUNER_AUDIO_INPUT] = CAPTURE_TUNER_AUDIO_INPUT;
+ MONITORED_PERMS[PermissionEnum.CAPTURE_VOICE_COMMUNICATION_OUTPUT] =
+ CAPTURE_VOICE_COMMUNICATION_OUTPUT;
+ MONITORED_PERMS[PermissionEnum.BLUETOOTH_CONNECT] = BLUETOOTH_CONNECT;
}
private final Object mLock = new Object();
diff --git a/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java b/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java
index 077e8ee..9467d6f 100644
--- a/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java
+++ b/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java
@@ -690,9 +690,6 @@
|| !identifierMeetsSdkVersionRequirement(info.getPhysicallyTunedTo(), uid)) {
return false;
}
- if (info.getRelatedContent() == null) {
- return true;
- }
Iterator<ProgramSelector.Identifier> relatedContentIt = info.getRelatedContent().iterator();
while (relatedContentIt.hasNext()) {
if (!identifierMeetsSdkVersionRequirement(relatedContentIt.next(), uid)) {
diff --git a/services/core/java/com/android/server/hdmi/TEST_MAPPING b/services/core/java/com/android/server/hdmi/TEST_MAPPING
index 7245ec4..c0fa121 100644
--- a/services/core/java/com/android/server/hdmi/TEST_MAPPING
+++ b/services/core/java/com/android/server/hdmi/TEST_MAPPING
@@ -30,5 +30,25 @@
}
]
}
+ ],
+ // Postsubmit tests for TV devices
+ "tv-postsubmit": [
+ {
+ "name": "HdmiCecTests",
+ "options": [
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ },
+ {
+ "include-filter": "android.hardware.hdmi"
+ }
+ ],
+ "file_patterns": [
+ "(/|^)DeviceFeature[^/]*", "(/|^)Hdmi[^/]*"
+ ]
+ }
]
}
diff --git a/services/core/java/com/android/server/inputmethod/ImeTrackerService.java b/services/core/java/com/android/server/inputmethod/ImeTrackerService.java
index fff0e6e..56fa8c9 100644
--- a/services/core/java/com/android/server/inputmethod/ImeTrackerService.java
+++ b/services/core/java/com/android/server/inputmethod/ImeTrackerService.java
@@ -28,6 +28,7 @@
import android.view.inputmethod.ImeTracker;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.infra.AndroidFuture;
import com.android.internal.inputmethod.IImeTracker;
import com.android.internal.inputmethod.InputMethodDebug;
import com.android.internal.inputmethod.SoftInputShowHideReason;
@@ -174,10 +175,18 @@
@EnforcePermission(Manifest.permission.TEST_INPUT_METHOD)
@Override
- public void finishTrackingPendingImeVisibilityRequests() {
+ public void finishTrackingPendingImeVisibilityRequests(
+ @NonNull AndroidFuture completionSignal /* T=Void */) {
super.finishTrackingPendingImeVisibilityRequests_enforcePermission();
- synchronized (mLock) {
- mHistory.mLiveEntries.clear();
+ @SuppressWarnings("unchecked")
+ final AndroidFuture<Void> typedCompletionSignal = completionSignal;
+ try {
+ synchronized (mLock) {
+ mHistory.mLiveEntries.clear();
+ }
+ typedCompletionSignal.complete(null);
+ } catch (Throwable e) {
+ typedCompletionSignal.completeExceptionally(e);
}
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
index 69452310..60d647d 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
@@ -46,6 +46,7 @@
import android.view.inputmethod.InputMethod;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -84,6 +85,7 @@
@GuardedBy("ImfLock.class") @Nullable private IInputMethodInvoker mCurMethod;
@GuardedBy("ImfLock.class") private int mCurMethodUid = Process.INVALID_UID;
@GuardedBy("ImfLock.class") @Nullable private IBinder mCurToken;
+ @GuardedBy("ImfLock.class") @Nullable private InputMethodSubtype mCurrentSubtype;
@GuardedBy("ImfLock.class") private int mCurTokenDisplayId = INVALID_DISPLAY;
@GuardedBy("ImfLock.class") private int mCurSeq;
@GuardedBy("ImfLock.class") private boolean mVisibleBound;
@@ -217,6 +219,28 @@
}
/**
+ * The current {@link InputMethodSubtype} of the current input method.
+ *
+ * @return the current {@link InputMethodSubtype} of the current input method. {@code null}
+ * means that there is no {@link InputMethodSubtype} currently selected
+ */
+ @GuardedBy("ImfLock.class")
+ @Nullable
+ InputMethodSubtype getCurrentSubtype() {
+ return mCurrentSubtype;
+ }
+
+ /**
+ * Sets the current {@link InputMethodSubtype} of the current input method.
+ *
+ * @param currentSubtype the current {@link InputMethodSubtype} of the current input method
+ */
+ @GuardedBy("ImfLock.class")
+ void setCurrentSubtype(@Nullable InputMethodSubtype currentSubtype) {
+ mCurrentSubtype = currentSubtype;
+ }
+
+ /**
* Returns the displayId associated with {@link #getCurToken()}.
*
* @return the displayId associated with {@link #getCurToken()}. {@link Display#INVALID_DISPLAY}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index c4b1f40..3f296ca 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -569,12 +569,6 @@
EditorInfo mCurEditorInfo;
/**
- * The current subtype of the current input method.
- */
- @MultiUserUnawareField
- private InputMethodSubtype mCurrentSubtype;
-
- /**
* Map of window perceptible states indexed by their associated window tokens.
*
* The value {@code true} indicates that IME has not been mostly hidden via
@@ -1055,7 +1049,7 @@
// one now available?
changed = chooseNewDefaultIMELocked();
} else if (!changed && isPackageModified(curIm.getPackageName())) {
- // Even if the current input method is still available, mCurrentSubtype could
+ // Even if the current input method is still available, current subtype could
// be obsolete when the package is modified in practice.
changed = true;
}
@@ -3102,7 +3096,7 @@
notifyInputMethodSubtypeChangedLocked(userId, info, null);
return;
}
- final InputMethodSubtype oldSubtype = mCurrentSubtype;
+ final InputMethodSubtype oldSubtype = bindingController.getCurrentSubtype();
final InputMethodSubtype newSubtype;
if (subtypeId >= 0 && subtypeId < subtypeCount) {
newSubtype = info.getSubtypeAt(subtypeId);
@@ -4114,7 +4108,9 @@
if (!calledWithValidTokenLocked(token)) {
return false;
}
- final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
+ final int userId = mCurrentUserId;
+ final var bindingController = getInputMethodBindingController(userId);
+ final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
final Pair<String, String> lastIme = settings.getLastInputMethodAndSubtype();
final InputMethodInfo lastImi;
if (lastIme != null) {
@@ -4122,13 +4118,15 @@
} else {
lastImi = null;
}
+ final var currentSubtype = bindingController.getCurrentSubtype();
String targetLastImiId = null;
int subtypeId = NOT_A_SUBTYPE_ID;
if (lastIme != null && lastImi != null) {
- final boolean imiIdIsSame = lastImi.getId().equals(getSelectedMethodIdLocked());
+ final boolean imiIdIsSame = lastImi.getId().equals(
+ bindingController.getSelectedMethodId());
final int lastSubtypeHash = Integer.parseInt(lastIme.second);
- final int currentSubtypeHash = mCurrentSubtype == null ? NOT_A_SUBTYPE_ID
- : mCurrentSubtype.hashCode();
+ final int currentSubtypeHash = currentSubtype == null ? NOT_A_SUBTYPE_ID
+ : currentSubtype.hashCode();
// If the last IME is the same as the current IME and the last subtype is not
// defined, there is no need to switch to the last IME.
if (!imiIdIsSame || lastSubtypeHash != currentSubtypeHash) {
@@ -4138,7 +4136,7 @@
}
if (TextUtils.isEmpty(targetLastImiId)
- && !InputMethodUtils.canAddToLastInputMethod(mCurrentSubtype)) {
+ && !InputMethodUtils.canAddToLastInputMethod(currentSubtype)) {
// This is a safety net. If the currentSubtype can't be added to the history
// and the framework couldn't find the last ime, we will make the last ime be
// the most applicable enabled keyboard subtype of the system imes.
@@ -4146,11 +4144,11 @@
if (enabled != null) {
final int enabledCount = enabled.size();
final String locale;
- if (mCurrentSubtype != null
- && !TextUtils.isEmpty(mCurrentSubtype.getLocale())) {
- locale = mCurrentSubtype.getLocale();
+ if (currentSubtype != null
+ && !TextUtils.isEmpty(currentSubtype.getLocale())) {
+ locale = currentSubtype.getLocale();
} else {
- locale = SystemLocaleWrapper.get(mCurrentUserId).get(0).toString();
+ locale = SystemLocaleWrapper.get(userId).get(0).toString();
}
for (int i = 0; i < enabledCount; ++i) {
final InputMethodInfo imi = enabled.get(i);
@@ -4198,9 +4196,10 @@
@GuardedBy("ImfLock.class")
private boolean switchToNextInputMethodLocked(@Nullable IBinder token, boolean onlyCurrentIme) {
final int userId = mCurrentUserId;
- final var currentImi = getInputMethodBindingController(userId).getSelectedMethod();
+ final var bindingController = getInputMethodBindingController(userId);
+ final var currentImi = bindingController.getSelectedMethod();
final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(
- onlyCurrentIme, currentImi, mCurrentSubtype);
+ onlyCurrentIme, currentImi, bindingController.getCurrentSubtype());
if (nextSubtype == null) {
return false;
}
@@ -4216,9 +4215,10 @@
return false;
}
final int userId = mCurrentUserId;
- final var currentImi = getInputMethodBindingController(userId).getSelectedMethod();
+ final var bindingController = getInputMethodBindingController(userId);
+ final var currentImi = bindingController.getSelectedMethod();
final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(
- false /* onlyCurrentIme */, currentImi, mCurrentSubtype);
+ false /* onlyCurrentIme */, currentImi, bindingController.getCurrentSubtype());
return nextSubtype != null;
}
}
@@ -4650,12 +4650,14 @@
}
return;
}
- if (mCurrentUserId != mSwitchingController.getUserId()) {
+ final int userId = mCurrentUserId;
+ if (userId != mSwitchingController.getUserId()) {
return;
}
- final var imi = getInputMethodBindingController(mCurrentUserId).getSelectedMethod();
+ final var imi = getInputMethodBindingController(userId).getSelectedMethod();
if (imi != null) {
- mSwitchingController.onUserActionLocked(imi, mCurrentSubtype);
+ mSwitchingController.onUserActionLocked(imi,
+ getInputMethodBindingController(userId).getCurrentSubtype());
}
}
}
@@ -5442,9 +5444,11 @@
@GuardedBy("ImfLock.class")
private void setSelectedInputMethodAndSubtypeLocked(InputMethodInfo imi, int subtypeId,
boolean setSubtypeOnly) {
- final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
+ final int userId = mCurrentUserId;
+ final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
+ final var bindingController = getInputMethodBindingController(userId);
settings.saveCurrentInputMethodAndSubtypeToHistory(getSelectedMethodIdLocked(),
- mCurrentSubtype);
+ bindingController.getCurrentSubtype());
// Set Subtype here
final int newSubtypeHashcode;
@@ -5465,9 +5469,9 @@
newSubtype = getCurrentInputMethodSubtypeLocked();
}
}
- mCurrentSubtype = newSubtype;
settings.putSelectedSubtype(newSubtypeHashcode);
- notifyInputMethodSubtypeChangedLocked(settings.getUserId(), imi, mCurrentSubtype);
+ bindingController.setCurrentSubtype(newSubtype);
+ notifyInputMethodSubtypeChangedLocked(settings.getUserId(), imi, newSubtype);
if (!setSubtypeOnly) {
// Set InputMethod here
@@ -5555,9 +5559,11 @@
if (imi == null || imi.getSubtypeCount() == 0) {
return null;
}
- mCurrentSubtype = SubtypeUtils.getCurrentInputMethodSubtype(imi, settings,
- mCurrentSubtype);
- return mCurrentSubtype;
+ final var bindingController = getInputMethodBindingController(userId);
+ final var subtype = SubtypeUtils.getCurrentInputMethodSubtype(imi, settings,
+ bindingController.getCurrentSubtype());
+ bindingController.setCurrentSubtype(subtype);
+ return subtype;
}
/**
@@ -5623,14 +5629,16 @@
@GuardedBy("ImfLock.class")
private void switchKeyboardLayoutLocked(int direction) {
- final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
+ final int userId = mCurrentUserId;
+ final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
final InputMethodInfo currentImi = settings.getMethodMap().get(getSelectedMethodIdLocked());
if (currentImi == null) {
return;
}
+ final var bindingController = getInputMethodBindingController(userId);
final InputMethodSubtypeHandle currentSubtypeHandle =
- InputMethodSubtypeHandle.of(currentImi, mCurrentSubtype);
+ InputMethodSubtypeHandle.of(currentImi, bindingController.getCurrentSubtype());
final InputMethodSubtypeHandle nextSubtypeHandle =
mHardwareKeyboardShortcutController.onSubtypeSwitch(currentSubtypeHandle,
direction > 0);
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 4023e52..b436c8b 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -225,6 +225,7 @@
import android.content.pm.IPackageManager;
import android.content.pm.LauncherApps;
import android.content.pm.ModuleInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
@@ -4536,6 +4537,34 @@
}
@Override
+ public List<String> getPackagesBypassingDnd(int userId,
+ boolean includeConversationChannels) {
+ checkCallerIsSystem();
+
+ final ArraySet<String> packageNames = new ArraySet<>();
+
+ for (int user : mUm.getProfileIds(userId, false)) {
+ List<PackageInfo> pkgs = mPackageManagerClient.getInstalledPackagesAsUser(0, user);
+ for (PackageInfo pi : pkgs) {
+ String pkg = pi.packageName;
+ // If any NotificationChannel for this package is bypassing, the
+ // package is considered bypassing.
+ for (NotificationChannel channel : getNotificationChannelsBypassingDnd(pkg,
+ pi.applicationInfo.uid).getList()) {
+ // Skips non-demoted conversation channels.
+ if (!includeConversationChannels
+ && !TextUtils.isEmpty(channel.getConversationId())
+ && !channel.isDemoted()) {
+ continue;
+ }
+ packageNames.add(pkg);
+ }
+ }
+ }
+ return new ArrayList<String>(packageNames);
+ }
+
+ @Override
public boolean areChannelsBypassingDnd() {
if (android.app.Flags.modesApi()) {
return mZenModeHelper.getConsolidatedNotificationPolicy().allowPriorityChannels()
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
index 06595ac..7e27407 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -411,7 +411,7 @@
FgThread.getHandler().post(() -> {
synchronized (mLock) {
boolean shouldCleanup = false;
- if (powerhintThreadCleanup()) {
+ if (mPowerHalVersion >= 4 && powerhintThreadCleanup()) {
int prevProcState = mProcStatesCache.get(uid, Integer.MAX_VALUE);
shouldCleanup =
prevProcState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
diff --git a/services/core/java/com/android/server/utils/AnrTimer.java b/services/core/java/com/android/server/utils/AnrTimer.java
index c605a47..153bb91 100644
--- a/services/core/java/com/android/server/utils/AnrTimer.java
+++ b/services/core/java/com/android/server/utils/AnrTimer.java
@@ -19,6 +19,7 @@
import static android.text.TextUtils.formatSimple;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
@@ -26,6 +27,7 @@
import android.text.TextUtils;
import android.text.format.TimeMigrationUtils;
import android.util.ArrayMap;
+import android.util.CloseGuard;
import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.LongSparseArray;
@@ -93,7 +95,7 @@
* tracks give a sense of handler latency: the time between timer expiration and ANR
* collection.
*/
- private final static String TRACK = "AnrTimer";
+ private final static String TRACK = "AnrTimerTrack";
/**
* Enable debug messages.
@@ -128,12 +130,23 @@
}
/**
+ * Return true if freezing is enabled. This has no effect if the service is not enabled.
+ */
+ private static boolean anrTimerFreezerEnabled() {
+ return Flags.anrTimerFreezer();
+ }
+
+ /**
* This class allows test code to provide instance-specific overrides.
*/
static class Injector {
boolean anrTimerServiceEnabled() {
return AnrTimer.anrTimerServiceEnabled();
}
+
+ boolean anrTimerFreezerEnabled() {
+ return AnrTimer.anrTimerFreezerEnabled();
+ }
}
/** The default injector. */
@@ -150,6 +163,9 @@
/** Grant timer extensions when the system is heavily loaded. */
private boolean mExtend = false;
+ /** Freeze ANR'ed processes. */
+ boolean mFreeze = false;
+
// This is only used for testing, so it is limited to package visibility.
Args injector(@NonNull Injector injector) {
mInjector = injector;
@@ -160,6 +176,58 @@
mExtend = flag;
return this;
}
+
+ public Args freeze(boolean enable) {
+ mFreeze = enable;
+ return this;
+ }
+ }
+
+ /**
+ * A target process may be modified when its timer expires. The modification (if any) will be
+ * undone if the expiration is discarded, but is persisted if the expiration is accepted. If
+ * the expiration is accepted, then a TimerLock is returned to the client. The client must
+ * close the TimerLock to complete the state machine.
+ */
+ private class TimerLock implements AutoCloseable {
+ // Detect failures to close.
+ private final CloseGuard mGuard = new CloseGuard();
+
+ // A lock to ensure closing is thread-safe.
+ private final Object mLock = new Object();
+
+ // Allow multiple calls to close().
+ private boolean mClosed = false;
+
+ // The native timer ID that must be closed. This may be zero.
+ final int mTimerId;
+
+ TimerLock(int timerId) {
+ mTimerId = timerId;
+ mGuard.open("AnrTimer.release");
+ }
+
+ @Override
+ public void close() {
+ synchronized (mLock) {
+ if (!mClosed) {
+ AnrTimer.this.release(this);
+ mGuard.close();
+ mClosed = true;
+ }
+ }
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ // Note that guard could be null if the constructor threw.
+ if (mGuard != null) mGuard.warnIfOpen();
+ close();
+ } finally {
+ super.finalize();
+ }
+ }
}
/**
@@ -334,6 +402,7 @@
final String label =
formatSimple("%s(%d,%d,%d,%s,%d)", op, timerId, pid, uid, mLabel, milliseconds);
Trace.instantForTrack(TRACE_TAG, TRACK, label);
+ if (DEBUG) Log.i(TAG, label);
}
/**
@@ -342,6 +411,16 @@
private void trace(String op, int timerId) {
final String label = formatSimple("%s(%d)", op, timerId);
Trace.instantForTrack(TRACE_TAG, TRACK, label);
+ if (DEBUG) Log.i(TAG, label);
+ }
+
+ /**
+ * Generate a trace point with a pid and uid but no timer ID.
+ */
+ private static void trace(String op, int pid, int uid) {
+ final String label = formatSimple("%s(%d,%d)", op, pid, uid);
+ Trace.instantForTrack(TRACE_TAG, TRACK, label);
+ if (DEBUG) Log.i(TAG, label);
}
/**
@@ -353,10 +432,13 @@
abstract boolean cancel(@NonNull V arg);
- abstract boolean accept(@NonNull V arg);
+ @Nullable
+ abstract TimerLock accept(@NonNull V arg);
abstract boolean discard(@NonNull V arg);
+ abstract void release(@NonNull TimerLock timer);
+
abstract boolean enabled();
abstract void dump(IndentingPrintWriter pw, boolean verbose);
@@ -385,8 +467,9 @@
/** accept() is a no-op when the feature is disabled. */
@Override
- boolean accept(@NonNull V arg) {
- return true;
+ @Nullable
+ TimerLock accept(@NonNull V arg) {
+ return null;
}
/** discard() is a no-op when the feature is disabled. */
@@ -395,6 +478,11 @@
return true;
}
+ /** release() is a no-op when the feature is disabled. */
+ @Override
+ void release(@NonNull TimerLock timer) {
+ }
+
/** The feature is not enabled. */
@Override
boolean enabled() {
@@ -441,9 +529,11 @@
@GuardedBy("mLock")
private int mTotalRestarted = 0;
- /** Fetch the native tag (an integer) for the given label. */
+ /** Create the native AnrTimerService that will host all timers from this instance. */
FeatureEnabled() {
- mNative = nativeAnrTimerCreate(mLabel, mArgs.mExtend);
+ mNative = nativeAnrTimerCreate(mLabel,
+ mArgs.mExtend,
+ mArgs.mFreeze && mArgs.mInjector.anrTimerFreezerEnabled());
if (mNative == 0) throw new IllegalArgumentException("unable to create native timer");
synchronized (sAnrTimerList) {
sAnrTimerList.put(mNative, new WeakReference(AnrTimer.this));
@@ -494,19 +584,26 @@
/**
* Accept a timer in the framework-level handler. The timeout has been accepted and the
- * timeout handler is executing.
+ * client's timeout handler is executing. If the function returns a non-null TimerLock then
+ * the associated process may have been paused (or otherwise modified in preparation for
+ * debugging). The TimerLock must be closed to allow the process to continue, or to be
+ * dumped in an AnrReport.
*/
@Override
- boolean accept(@NonNull V arg) {
+ @Nullable
+ TimerLock accept(@NonNull V arg) {
synchronized (mLock) {
Integer timer = removeLocked(arg);
if (timer == null) {
notFoundLocked("accept", arg);
- return false;
+ return null;
}
- nativeAnrTimerAccept(mNative, timer);
+ boolean accepted = nativeAnrTimerAccept(mNative, timer);
trace("accept", timer);
- return true;
+ // If "accepted" is true then the native layer has pending operations against this
+ // timer. Wrap the timer ID in a TimerLock and return it to the caller. If
+ // "accepted" is false then the native later does not have any pending operations.
+ return accepted ? new TimerLock(timer) : null;
}
}
@@ -529,6 +626,21 @@
}
}
+ /**
+ * Unfreeze an app that was frozen because its timer had expired. This method catches
+ * errors that might be thrown by the unfreeze method. This method does nothing if
+ * freezing is not enabled or if the AnrTimer never froze the timer. Note that the native
+ * release method returns false only if the timer's process was frozen, is still frozen,
+ * and could not be unfrozen.
+ */
+ @Override
+ void release(@NonNull TimerLock t) {
+ if (t.mTimerId == 0) return;
+ if (!nativeAnrTimerRelease(mNative, t.mTimerId)) {
+ Log.e(TAG, "failed to release id=" + t.mTimerId, new Exception(TAG));
+ }
+ }
+
/** The feature is enabled. */
@Override
boolean enabled() {
@@ -616,16 +728,20 @@
/**
* Accept the expired timer associated with arg. This indicates that the caller considers the
* timer expiration to be a true ANR. (See {@link #discard} for an alternate response.) The
- * function returns true if an expired timer was found and false if a running timer was found or
- * if no timer was found. After this call, the timer does not exist. It is an error to accept
- * a running timer, however, the running timer will be canceled.
+ * function returns a {@link TimerLock} if an expired timer was found and null otherwise.
+ * After this call, the timer does not exist. It is an error to accept a running timer,
+ * however, the running timer will be canceled.
*
- * Note: the return value is always true if the feature is not enabled.
+ * If a non-null TimerLock is returned, the TimerLock must be closed before the target process
+ * is dumped (for an ANR report) or continued.
+ *
+ * Note: the return value is always null if the feature is not enabled.
*
* @param arg The key by which the timer is known. This is never examined or modified.
- * @return True if an expired timer was accepted.
+ * @return A TimerLock if an expired timer was accepted.
*/
- public boolean accept(@NonNull V arg) {
+ @Nullable
+ public TimerLock accept(@NonNull V arg) {
return mFeature.accept(arg);
}
@@ -647,6 +763,13 @@
}
/**
+ * Release an expired timer.
+ */
+ private void release(@NonNull TimerLock t) {
+ mFeature.release(t);
+ }
+
+ /**
* The notifier that a timer has fired. The timerId and original pid/uid are supplied. The
* elapsed time is the actual time since the timer was scheduled, which may be different from
* the original timeout if the timer was extended or if other delays occurred. This method
@@ -826,7 +949,7 @@
* Unlike the other methods, this is an instance method: the "this" parameter is passed into
* the native layer.
*/
- private native long nativeAnrTimerCreate(String name, boolean extend);
+ private native long nativeAnrTimerCreate(String name, boolean extend, boolean freeze);
/** Release the native resources. No further operations are premitted. */
private static native int nativeAnrTimerClose(long service);
@@ -840,12 +963,24 @@
*/
private static native boolean nativeAnrTimerCancel(long service, int timerId);
- /** Accept an expired timer by ID. Return true if the timer was found. */
+ /**
+ * Accept an expired timer by ID. Return true if the timer must be released. Return false if
+ * the native layer is completely finished with this timer.
+ */
private static native boolean nativeAnrTimerAccept(long service, int timerId);
/** Discard an expired timer by ID. Return true if the timer was found. */
private static native boolean nativeAnrTimerDiscard(long service, int timerId);
+ /**
+ * Release (unfreeze) the process associated with the timer, if the process was previously
+ * frozen by the service. The function returns false if three conditions are true: the timer
+ * does exist, the timer's process was frozen, and the timer's process could not be unfrozen.
+ * Otherwise, the function returns true. In other words, a return value of value means there
+ * is a process that is unexpectedly stuck in the frozen state.
+ */
+ private static native boolean nativeAnrTimerRelease(long service, int timerId);
+
/** Retrieve runtime dump information from the native layer. */
private static native String[] nativeAnrTimerDump(long service);
}
diff --git a/services/core/java/com/android/server/utils/flags.aconfig b/services/core/java/com/android/server/utils/flags.aconfig
index 6f37837..00ebb66 100644
--- a/services/core/java/com/android/server/utils/flags.aconfig
+++ b/services/core/java/com/android/server/utils/flags.aconfig
@@ -8,3 +8,12 @@
description: "Feature flag for the ANR timer service"
bug: "282428924"
}
+
+flag {
+ name: "anr_timer_freezer"
+ namespace: "system_performance"
+ is_fixed_read_only: true
+ description: "Enable freezing of a process when an ANR is triggered"
+ bug: "325594551"
+}
+
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 2f23955..4a59fc2 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -128,6 +128,7 @@
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.BackgroundThread;
import com.android.internal.policy.ForceShowNavBarSettingsObserver;
import com.android.internal.policy.GestureNavigationSettingsObserver;
import com.android.internal.policy.ScreenDecorationsUtils;
@@ -673,6 +674,7 @@
mService.mHighRefreshRateDenylist);
mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(mHandler,
+ BackgroundThread.getHandler(),
mContext, () -> {
synchronized (mLock) {
onConfigurationChanged();
diff --git a/services/core/java/com/android/server/wm/SafeActivityOptions.java b/services/core/java/com/android/server/wm/SafeActivityOptions.java
index f2dc55f..b452131 100644
--- a/services/core/java/com/android/server/wm/SafeActivityOptions.java
+++ b/services/core/java/com/android/server/wm/SafeActivityOptions.java
@@ -140,7 +140,9 @@
}
private ActivityOptions cloneLaunchingOptions(ActivityOptions options) {
- return options == null ? null : ActivityOptions.makeBasic()
+ if (options == null) return null;
+
+ final ActivityOptions cloneOptions = ActivityOptions.makeBasic()
.setLaunchTaskDisplayArea(options.getLaunchTaskDisplayArea())
.setLaunchDisplayId(options.getLaunchDisplayId())
.setCallerDisplayId(options.getCallerDisplayId())
@@ -150,6 +152,8 @@
.setPendingIntentCreatorBackgroundActivityStartMode(
options.getPendingIntentCreatorBackgroundActivityStartMode())
.setRemoteTransition(options.getRemoteTransition());
+ cloneOptions.setLaunchWindowingMode(options.getLaunchWindowingMode());
+ return cloneOptions;
}
/**
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 63ca469..bc45c70 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -2816,6 +2816,9 @@
final Rect parentBounds = parent.getBounds();
change.setEndRelOffset(bounds.left - parentBounds.left,
bounds.top - parentBounds.top);
+ if (Flags.activityEmbeddingOverlayPresentationFlag()) {
+ change.setEndParentSize(parentBounds.width(), parentBounds.height());
+ }
int endRotation = target.getWindowConfiguration().getRotation();
if (activityRecord != null) {
// TODO(b/227427984): Shell needs to aware letterbox.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index b814ccd..2b375e1 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2027,7 +2027,9 @@
// Otherwise, look at the package
final ApplicationInfo appInfo = mPmInternal.getApplicationInfo(
packageName, 0 /* flags */, SYSTEM_UID, UserHandle.getUserId(callingUid));
- if (appInfo == null || appInfo.uid != callingUid) {
+ if (appInfo == null
+ || !mPmInternal.isSameApp(
+ packageName, callingUid, UserHandle.getUserId(callingUid))) {
throw new SecurityException("Package " + packageName + " not in UID "
+ callingUid);
}
diff --git a/services/core/jni/com_android_server_utils_AnrTimer.cpp b/services/core/jni/com_android_server_utils_AnrTimer.cpp
index f0bd037..2edf129 100644
--- a/services/core/jni/com_android_server_utils_AnrTimer.cpp
+++ b/services/core/jni/com_android_server_utils_AnrTimer.cpp
@@ -18,6 +18,7 @@
#include <pthread.h>
#include <sys/timerfd.h>
#include <inttypes.h>
+#include <sys/stat.h>
#include <algorithm>
#include <list>
@@ -27,17 +28,20 @@
#include <vector>
#define LOG_TAG "AnrTimerService"
+#define ATRACE_TAG ATRACE_TAG_ACTIVITY_MANAGER
+#define ANR_TIMER_TRACK "AnrTimerTrack"
#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "core_jni_helpers.h"
+#include <processgroup/processgroup.h>
+#include <utils/Log.h>
#include <utils/Mutex.h>
#include <utils/Timers.h>
+#include <utils/Trace.h>
-#include <utils/Log.h>
-#include <utils/Timers.h>
#include <android-base/logging.h>
#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
@@ -81,13 +85,55 @@
// A local debug flag that gates a set of log messages for debug only. This is normally const
// false so the debug statements are not included in the image. The flag can be set true in a
// unit test image to debug test failures.
-const bool DEBUG = false;
+const bool DEBUG_TIMER = false;
+
+// A local debug flag to debug the timer thread itself.
+const bool DEBUG_TICKER = false;
+
+// Enable error logging.
+const bool DEBUG_ERROR = true;
// Return the current time in nanoseconds. This time is relative to system boot.
nsecs_t now() {
return systemTime(SYSTEM_TIME_MONOTONIC);
}
+// Return true if the process exists and false if we cannot know.
+bool processExists(pid_t pid) {
+ char path[PATH_MAX];
+ snprintf(path, sizeof(path), "/proc/%d", pid);
+ struct stat buff;
+ return stat(path, &buff) == 0;
+}
+
+// Return the name of the process whose pid is the input. If the process does not exist, the
+// name will "notfound".
+std::string getProcessName(pid_t pid) {
+ char buffer[PATH_MAX];
+ snprintf(buffer, sizeof(buffer), "/proc/%d/cmdline", pid);
+ int fd = ::open(buffer, O_RDONLY);
+ if (fd >= 0) {
+ size_t pos = 0;
+ ssize_t result;
+ while (pos < sizeof(buffer)-1) {
+ result = ::read(fd, buffer + pos, (sizeof(buffer) - pos) - 1);
+ if (result <= 0) {
+ break;
+ }
+ }
+ ::close(fd);
+
+ if (result >= 0) {
+ buffer[pos] = 0;
+ } else {
+ snprintf(buffer, sizeof(buffer), "err: %s", strerror(errno));
+ }
+ } else {
+ snprintf(buffer, sizeof(buffer), "notfound");
+ }
+ return std::string(buffer);
+}
+
/**
* This class encapsulates the anr timer service. The service manages a list of individual
* timers. A timer is either Running or Expired. Once started, a timer may be canceled or
@@ -128,10 +174,11 @@
/**
* Create a timer service. The service is initialized with a name used for logging. The
* constructor is also given the notifier callback, and two cookies for the callback: the
- * traditional void* and an int.
+ * traditional void* and Java object pointer. The remaining parameters are
+ * configuration options.
*/
AnrTimerService(char const* label, notifier_t notifier, void* cookie, jweak jtimer, Ticker*,
- bool extend);
+ bool extend, bool freeze);
// Delete the service and clean up memory.
~AnrTimerService();
@@ -147,10 +194,9 @@
// returns false.
bool cancel(timer_id_t timerId);
- // Accept a timer and remove it from all lists. This is called when the upper layers accept
- // that a timer has expired. If the timer was Expired, the function returns true. The
- // other possibilities are tha the timer was Running or non-existing; in both cases, the
- // function returns false.
+ // Accept a timer. This is called when the upper layers accept that a timer has expired.
+ // If the timer was Expired and its process was frozen, the timer is pushed to the expired
+ // list and 'true' is returned. Otherwise the function returns false.
bool accept(timer_id_t timerId);
// Discard a timer without collecting any statistics. This is called when the upper layers
@@ -162,6 +208,9 @@
// A timer has expired.
void expire(timer_id_t);
+ // Release a timer. The timer must be in the expired list.
+ bool release(timer_id_t);
+
// Return the Java object associated with this instance.
jweak jtimer() const {
return notifierObject_;
@@ -172,16 +221,23 @@
private:
// The service cannot be copied.
- AnrTimerService(AnrTimerService const &) = delete;
+ AnrTimerService(AnrTimerService const&) = delete;
// Insert a timer into the running list. The lock must be held by the caller.
- void insert(const Timer&);
+ void insertLocked(const Timer&);
// Remove a timer from the lists and return it. The lock must be held by the caller.
- Timer remove(timer_id_t timerId);
+ Timer removeLocked(timer_id_t timerId);
+
+ // Add a timer to the expired list.
+ void addExpiredLocked(Timer const&);
+
+ // Scrub the expired list by removing all entries for non-existent processes. The expired
+ // lock must be held by the caller.
+ void scrubExpiredLocked();
// Return a string representation of a status value.
- static char const *statusString(Status);
+ static const char* statusString(Status);
// The name of this service, for logging.
std::string const label_;
@@ -196,12 +252,18 @@
// True if extensions can be granted to expired timers.
const bool extend_;
+ // True if the service should freeze anr'ed processes.
+ const bool freeze_;
+
// The global lock
mutable Mutex lock_;
// The list of all timers that are still running. This is sorted by ID for fast lookup.
std::set<Timer> running_;
+ // The list of all expired timers that are awaiting release.
+ std::set<Timer> expired_;
+
// The maximum number of active timers.
size_t maxRunning_;
@@ -214,6 +276,7 @@
size_t discarded;
size_t expired;
size_t extended;
+ size_t released;
// The number of times there were zero active timers.
size_t drained;
@@ -281,6 +344,7 @@
int const uid;
nsecs_t const timeout;
bool const extend;
+ bool const freeze;
// The state of this timer.
Status status;
@@ -294,6 +358,9 @@
// True if this timer has been extended.
bool extended;
+ // True if the process has been frozen.
+ bool frozen;
+
// Bookkeeping for extensions. The initial state of the process. This is collected only if
// the timer is extensible.
ProcessStats initial;
@@ -306,10 +373,12 @@
uid(0),
timeout(0),
extend(false),
+ freeze(false),
status(Invalid),
started(0),
scheduled(0),
- extended(false) {
+ extended(false),
+ frozen(false) {
}
// This constructor creates a timer with the specified id. This can be used as the argument
@@ -320,40 +389,51 @@
uid(0),
timeout(0),
extend(false),
+ freeze(false),
status(Invalid),
started(0),
scheduled(0),
- extended(false) {
+ extended(false),
+ frozen(false) {
}
// Create a new timer. This starts the timer.
- Timer(int pid, int uid, nsecs_t timeout, bool extend) :
+ Timer(int pid, int uid, nsecs_t timeout, bool extend, bool freeze) :
id(nextId()),
pid(pid),
uid(uid),
timeout(timeout),
extend(extend),
+ freeze(pid != 0 && freeze),
status(Running),
started(now()),
scheduled(started + timeout),
- extended(false) {
+ extended(false),
+ frozen(false) {
if (extend && pid != 0) {
initial.fill(pid);
}
+ // A zero-pid is odd but it means the upper layers will never ANR the process. Freezing
+ // is always disabled. (It won't work anyway, but disabling it avoids error messages.)
+ ALOGI_IF(DEBUG_ERROR && pid == 0, "error: zero-pid %s", toString().c_str());
}
- // Cancel a timer. Return the headroom (which may be negative). This does not, as yet,
- // account for extensions.
+ // Start a timer. This interface exists to generate log messages, if enabled.
+ void start() {
+ event("start", /* verbose= */ true);
+ }
+
+ // Cancel a timer.
void cancel() {
- ALOGW_IF(DEBUG && status != Running, "cancel %s", toString().c_str());
+ ALOGW_IF(DEBUG_ERROR && status != Running, "error: canceling %s", toString().c_str());
status = Canceled;
+ event("cancel");
}
// Expire a timer. Return true if the timer is expired and false otherwise. The function
// returns false if the timer is eligible for extension. If the function returns false, the
// scheduled time is updated.
bool expire() {
- ALOGI_IF(DEBUG, "expire %s", toString().c_str());
nsecs_t extension = 0;
if (extend && !extended) {
// Only one extension is permitted.
@@ -366,18 +446,37 @@
}
if (extension == 0) {
status = Expired;
+ maybeFreezeProcess();
+ event("expire");
} else {
scheduled += extension;
+ event("extend");
}
return status == Expired;
}
- // Accept a timeout.
+ // Accept a timeout. This does nothing other than log the state machine change.
void accept() {
+ event("accept");
}
// Discard a timeout.
void discard() {
+ maybeUnfreezeProcess();
+ status = Canceled;
+ event("discard");
+ }
+
+ // Release the timer.
+ void release() {
+ // If timer represents a frozen process, unfreeze it at this time.
+ maybeUnfreezeProcess();
+ event("release");
+ }
+
+ // Return true if this timer corresponds to a running process.
+ bool alive() const {
+ return processExists(pid);
}
// Timers are sorted by id, which is unique. This provides fast lookups.
@@ -390,13 +489,14 @@
}
std::string toString() const {
- return StringPrintf("timer id=%d pid=%d status=%s", id, pid, statusString(status));
+ return StringPrintf("id=%d pid=%d uid=%d status=%s",
+ id, pid, uid, statusString(status));
}
std::string toString(nsecs_t now) const {
uint32_t ms = nanoseconds_to_milliseconds(now - scheduled);
- return StringPrintf("timer id=%d pid=%d status=%s scheduled=%ums",
- id, pid, statusString(status), -ms);
+ return StringPrintf("id=%d pid=%d uid=%d status=%s scheduled=%ums",
+ id, pid, uid, statusString(status), -ms);
}
static int maxId() {
@@ -404,6 +504,56 @@
}
private:
+ /**
+ * Collect the name of the process.
+ */
+ std::string getName() const {
+ return getProcessName(pid);
+ }
+
+ /**
+ * Freeze the process identified here. Failures are not logged, as they are primarily due
+ * to a process having died (therefore failed to respond).
+ */
+ void maybeFreezeProcess() {
+ if (!freeze || !alive()) return;
+
+ // Construct a unique event ID. The id*2 spans from the beginning of the freeze to the
+ // end of the freeze. The id*2+1 spans the period inside the freeze/unfreeze
+ // operations.
+ const uint32_t cookie = id << 1;
+
+ char tag[PATH_MAX];
+ snprintf(tag, sizeof(tag), "freeze(pid=%d,uid=%d)", pid, uid);
+ ATRACE_ASYNC_FOR_TRACK_BEGIN(ANR_TIMER_TRACK, tag, cookie);
+ if (SetProcessProfiles(uid, pid, {"Frozen"})) {
+ ALOGI("freeze %s name=%s", toString().c_str(), getName().c_str());
+ frozen = true;
+ ATRACE_ASYNC_FOR_TRACK_BEGIN(ANR_TIMER_TRACK, "frozen", cookie+1);
+ } else {
+ ALOGE("error: freezing %s name=%s error=%s",
+ toString().c_str(), getName().c_str(), strerror(errno));
+ ATRACE_ASYNC_FOR_TRACK_END(ANR_TIMER_TRACK, cookie);
+ }
+ }
+
+ void maybeUnfreezeProcess() {
+ if (!freeze || !frozen) return;
+
+ // See maybeFreezeProcess for an explanation of the cookie.
+ const uint32_t cookie = id << 1;
+
+ ATRACE_ASYNC_FOR_TRACK_END(ANR_TIMER_TRACK, cookie+1);
+ if (SetProcessProfiles(uid, pid, {"Unfrozen"})) {
+ ALOGI("unfreeze %s name=%s", toString().c_str(), getName().c_str());
+ frozen = false;
+ } else {
+ ALOGE("error: unfreezing %s name=%s error=%s",
+ toString().c_str(), getName().c_str(), strerror(errno));
+ }
+ ATRACE_ASYNC_FOR_TRACK_END(ANR_TIMER_TRACK, cookie);
+ }
+
// Get the next free ID. NOTIMER is never returned.
static timer_id_t nextId() {
timer_id_t id = idGen.fetch_add(1);
@@ -413,6 +563,22 @@
return id;
}
+ // Log an event, non-verbose.
+ void event(char const* tag) {
+ event(tag, false);
+ }
+
+ // Log an event, guarded by the debug flag.
+ void event(char const* tag, bool verbose) {
+ if (verbose) {
+ char name[PATH_MAX];
+ ALOGI_IF(DEBUG_TIMER, "event %s %s name=%s",
+ tag, toString().c_str(), getName().c_str());
+ } else {
+ ALOGI_IF(DEBUG_TIMER, "event %s id=%u", tag, id);
+ }
+ }
+
// IDs start at 1. A zero ID is invalid.
static std::atomic<timer_id_t> idGen;
};
@@ -494,6 +660,7 @@
timer_id_t front = headTimerId();
auto found = running_.find(key);
if (found != running_.end()) running_.erase(found);
+ if (running_.empty()) drained_++;
}
// Remove every timer associated with the service.
@@ -536,7 +703,7 @@
// A simple wrapper that meets the requirements of pthread_create.
static void* run(void* arg) {
reinterpret_cast<Ticker*>(arg)->monitor();
- ALOGI("monitor exited");
+ ALOGI_IF(DEBUG_TICKER, "monitor exited");
return 0;
}
@@ -591,7 +758,7 @@
};
timer_settime(timerFd_, 0, &setting, nullptr);
restarted_++;
- ALOGI_IF(DEBUG, "restarted timerfd for %ld.%09ld", sec, ns);
+ ALOGI_IF(DEBUG_TICKER, "restarted timerfd for %ld.%09ld", sec, ns);
} else {
const struct itimerspec setting = {
.it_interval = { 0, 0 },
@@ -599,7 +766,7 @@
};
timer_settime(timerFd_, 0, &setting, nullptr);
drained_++;
- ALOGI_IF(DEBUG, "drained timer list");
+ ALOGI_IF(DEBUG_TICKER, "drained timer list");
}
}
@@ -641,19 +808,20 @@
AnrTimerService::AnrTimerService(char const* label, notifier_t notifier, void* cookie,
- jweak jtimer, Ticker* ticker, bool extend) :
+ jweak jtimer, Ticker* ticker, bool extend, bool freeze) :
label_(label),
notifier_(notifier),
notifierCookie_(cookie),
notifierObject_(jtimer),
extend_(extend),
+ freeze_(freeze),
ticker_(ticker) {
// Zero the statistics
maxRunning_ = 0;
memset(&counters_, 0, sizeof(counters_));
- ALOGI_IF(DEBUG, "initialized %s", label);
+ ALOGI_IF(DEBUG_TIMER, "initialized %s", label);
}
AnrTimerService::~AnrTimerService() {
@@ -661,7 +829,7 @@
ticker_->remove(this);
}
-char const *AnrTimerService::statusString(Status s) {
+const char* AnrTimerService::statusString(Status s) {
switch (s) {
case Invalid: return "invalid";
case Running: return "running";
@@ -672,21 +840,18 @@
}
AnrTimerService::timer_id_t AnrTimerService::start(int pid, int uid, nsecs_t timeout) {
- ALOGI_IF(DEBUG, "starting");
AutoMutex _l(lock_);
- Timer t(pid, uid, timeout, extend_);
- insert(t);
+ Timer t(pid, uid, timeout, extend_, freeze_);
+ insertLocked(t);
+ t.start();
counters_.started++;
-
- ALOGI_IF(DEBUG, "started timer %u timeout=%zu", t.id, static_cast<size_t>(timeout));
return t.id;
}
bool AnrTimerService::cancel(timer_id_t timerId) {
- ALOGI_IF(DEBUG, "canceling %u", timerId);
if (timerId == NOTIMER) return false;
AutoMutex _l(lock_);
- Timer timer = remove(timerId);
+ Timer timer = removeLocked(timerId);
bool result = timer.status == Running;
if (timer.status != Invalid) {
@@ -695,32 +860,32 @@
counters_.error++;
}
counters_.canceled++;
- ALOGI_IF(DEBUG, "canceled timer %u", timerId);
return result;
}
bool AnrTimerService::accept(timer_id_t timerId) {
- ALOGI_IF(DEBUG, "accepting %u", timerId);
if (timerId == NOTIMER) return false;
AutoMutex _l(lock_);
- Timer timer = remove(timerId);
+ Timer timer = removeLocked(timerId);
- bool result = timer.status == Expired;
+ bool result = false;
if (timer.status == Expired) {
timer.accept();
+ if (timer.frozen) {
+ addExpiredLocked(timer);
+ result = true;
+ }
} else {
counters_.error++;
}
counters_.accepted++;
- ALOGI_IF(DEBUG, "accepted timer %u", timerId);
return result;
}
bool AnrTimerService::discard(timer_id_t timerId) {
- ALOGI_IF(DEBUG, "discarding %u", timerId);
if (timerId == NOTIMER) return false;
AutoMutex _l(lock_);
- Timer timer = remove(timerId);
+ Timer timer = removeLocked(timerId);
bool result = timer.status == Expired;
if (timer.status == Expired) {
@@ -729,14 +894,48 @@
counters_.error++;
}
counters_.discarded++;
- ALOGI_IF(DEBUG, "discarded timer %u", timerId);
return result;
}
+bool AnrTimerService::release(timer_id_t id) {
+ if (id == NOTIMER) return true;
+
+ Timer key(id);
+ bool okay = false;
+ AutoMutex _l(lock_);
+ std::set<Timer>::iterator found = expired_.find(key);
+ if (found != expired_.end()) {
+ Timer t = *found;
+ t.release();
+ counters_.released++;
+ expired_.erase(found);
+ okay = true;
+ } else {
+ ALOGI_IF(DEBUG_ERROR, "error: unable to release (%u)", id);
+ counters_.error++;
+ }
+ scrubExpiredLocked();
+ return okay;
+}
+
+void AnrTimerService::addExpiredLocked(Timer const& timer) {
+ scrubExpiredLocked();
+ expired_.insert(timer);
+}
+
+void AnrTimerService::scrubExpiredLocked() {
+ for (auto i = expired_.begin(); i != expired_.end(); ) {
+ if (!i->alive()) {
+ i = expired_.erase(i);
+ } else {
+ i++;
+ }
+ }
+}
+
// Hold the lock in order to manage the running list.
// the listener.
void AnrTimerService::expire(timer_id_t timerId) {
- ALOGI_IF(DEBUG, "expiring %u", timerId);
// Save the timer attributes for the notification
int pid = 0;
int uid = 0;
@@ -744,15 +943,15 @@
bool expired = false;
{
AutoMutex _l(lock_);
- Timer t = remove(timerId);
+ Timer t = removeLocked(timerId);
expired = t.expire();
if (t.status == Invalid) {
- ALOGW_IF(DEBUG, "error: expired invalid timer %u", timerId);
+ ALOGW_IF(DEBUG_ERROR, "error: expired invalid timer %u", timerId);
return;
} else {
// The timer is either Running (because it was extended) or expired (and is awaiting an
// accept or discard).
- insert(t);
+ insertLocked(t);
}
pid = t.pid;
uid = t.uid;
@@ -771,13 +970,12 @@
AutoMutex _l(lock_);
// Notification failed, which means the listener will never call accept() or
// discard(). Do not reinsert the timer.
- remove(timerId);
+ discard(timerId);
}
}
- ALOGI_IF(DEBUG, "expired timer %u", timerId);
}
-void AnrTimerService::insert(const Timer& t) {
+void AnrTimerService::insertLocked(const Timer& t) {
running_.insert(t);
if (t.status == Running) {
// Only forward running timers to the ticker. Expired timers are handled separately.
@@ -786,7 +984,7 @@
maxRunning_ = std::max(maxRunning_, running_.size());
}
-AnrTimerService::Timer AnrTimerService::remove(timer_id_t timerId) {
+AnrTimerService::Timer AnrTimerService::removeLocked(timer_id_t timerId) {
Timer key(timerId);
auto found = running_.find(key);
if (found != running_.end()) {
@@ -814,6 +1012,9 @@
counters_.error,
running_.size(),
maxRunning_));
+ r.push_back(StringPrintf("released:%zu releasing:%zu",
+ counters_.released,
+ expired_.size()));
r.push_back(StringPrintf("ticker:%zu ticking:%zu maxTicking:%zu",
ticker_->id(),
ticker_->running(),
@@ -867,7 +1068,8 @@
return nativeSupportEnabled;
}
-jlong anrTimerCreate(JNIEnv* env, jobject jtimer, jstring jname, jboolean extend) {
+jlong anrTimerCreate(JNIEnv* env, jobject jtimer, jstring jname,
+ jboolean extend, jboolean freeze) {
if (!nativeSupportEnabled) return 0;
AutoMutex _l(gAnrLock);
if (gAnrArgs.ticker == nullptr) {
@@ -877,7 +1079,7 @@
ScopedUtfChars name(env, jname);
jobject timer = env->NewWeakGlobalRef(jtimer);
AnrTimerService* service = new AnrTimerService(name.c_str(),
- anrNotify, &gAnrArgs, timer, gAnrArgs.ticker, extend);
+ anrNotify, &gAnrArgs, timer, gAnrArgs.ticker, extend, freeze);
return reinterpret_cast<jlong>(service);
}
@@ -917,6 +1119,11 @@
return toService(ptr)->discard(timerId);
}
+jboolean anrTimerRelease(JNIEnv* env, jclass, jlong ptr, jint timerId) {
+ if (!nativeSupportEnabled) return false;
+ return toService(ptr)->release(timerId);
+}
+
jobjectArray anrTimerDump(JNIEnv *env, jclass, jlong ptr) {
if (!nativeSupportEnabled) return nullptr;
std::vector<std::string> stats = toService(ptr)->getDump();
@@ -930,12 +1137,13 @@
static const JNINativeMethod methods[] = {
{"nativeAnrTimerSupported", "()Z", (void*) anrTimerSupported},
- {"nativeAnrTimerCreate", "(Ljava/lang/String;Z)J", (void*) anrTimerCreate},
+ {"nativeAnrTimerCreate", "(Ljava/lang/String;ZZ)J", (void*) anrTimerCreate},
{"nativeAnrTimerClose", "(J)I", (void*) anrTimerClose},
{"nativeAnrTimerStart", "(JIIJ)I", (void*) anrTimerStart},
{"nativeAnrTimerCancel", "(JI)Z", (void*) anrTimerCancel},
{"nativeAnrTimerAccept", "(JI)Z", (void*) anrTimerAccept},
{"nativeAnrTimerDiscard", "(JI)Z", (void*) anrTimerDiscard},
+ {"nativeAnrTimerRelease", "(JI)Z", (void*) anrTimerRelease},
{"nativeAnrTimerDump", "(J)[Ljava/lang/String;", (void*) anrTimerDump},
};
diff --git a/services/devicepolicy/Android.bp b/services/devicepolicy/Android.bp
index da965bb..32b571a 100644
--- a/services/devicepolicy/Android.bp
+++ b/services/devicepolicy/Android.bp
@@ -17,8 +17,10 @@
java_library_static {
name: "services.devicepolicy",
defaults: ["platform_service_defaults"],
- srcs: [":services.devicepolicy-sources"],
-
+ srcs: [
+ ":services.devicepolicy-sources",
+ ":statslog-devicepolicy-java-gen",
+ ],
libs: [
"services.core",
"app-compat-annotations",
@@ -27,3 +29,11 @@
"androidx.annotation_annotation",
],
}
+
+genrule {
+ name: "statslog-devicepolicy-java-gen",
+ tools: ["stats-log-api-gen"],
+ cmd: "$(location stats-log-api-gen) --java $(out) --module devicepolicy" +
+ " --javaPackage com.android.server.devicepolicy --javaClass DevicePolicyStatsLog",
+ out: ["com/android/server/devicepolicy/DevicePolicyStatsLog.java"],
+}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index be1a52d..43a2a93 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -109,6 +109,7 @@
import static android.app.AppOpsManager.OPSTR_SYSTEM_EXEMPT_FROM_SUSPENSION;
import static android.app.AppOpsManager.OP_RUN_ANY_IN_BACKGROUND;
import static android.app.AppOpsManager.OP_RUN_IN_BACKGROUND;
+import static android.app.StatsManager.PULL_SUCCESS;
import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_AFFILIATED;
import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER;
import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED;
@@ -265,12 +266,26 @@
import static android.security.keystore.AttestationUtils.USE_INDIVIDUAL_ATTESTATION;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PROVISIONING_ENTRY_POINT_ADB;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_ADAPTIVE_AUTH_REQUEST;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
import static com.android.server.SystemTimeZone.TIME_ZONE_CONFIDENCE_HIGH;
import static com.android.server.am.ActivityManagerService.STOCK_PM_FLAGS;
import static com.android.server.devicepolicy.DevicePolicyEngine.DEFAULT_POLICY_SIZE_LIMIT;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_MANAGEMENT_MODE;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__COPE;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__DEVICE_OWNER;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__DEVICE_OWNER_FINANCED;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__MANAGEMENT_MODE_UNSPECIFIED;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__PROFILE_OWNER;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_STATE;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_HIGH;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_LEGACY;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_LOW;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_MEDIUM;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_NONE;
+import static com.android.server.devicepolicy.DevicePolicyStatsLog.DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_UNSPECIFIED;
import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_DEVICE_OWNER;
import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_PROFILE_OWNER;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
@@ -305,6 +320,7 @@
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.app.StatsManager;
import android.app.StatusBarManager;
import android.app.admin.AccountTypePolicyKey;
import android.app.admin.BooleanPolicyValue;
@@ -477,6 +493,7 @@
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.StatsEvent;
import android.util.Xml;
import android.view.IWindowManager;
import android.view.accessibility.AccessibilityManager;
@@ -804,11 +821,11 @@
public static final long EXPLICIT_WIPE_BEHAVIOUR = 242193913L;
/**
- * Apps targetting U+ should now expect that attempts to grant sensor permissions without
+ * Apps targeting V+ should now expect that attempts to grant sensor permissions without
* authorisation will result in a security exception.
*/
@ChangeId
- @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ @EnabledSince(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
public static final long THROW_SECURITY_EXCEPTION_FOR_SENSOR_PERMISSIONS = 277035314L;
/**
@@ -3348,6 +3365,9 @@
synchronized (getLockObject()) {
mDevicePolicyEngine.reapplyAllPoliciesOnBootLocked();
}
+ if (Flags.managementModePolicyMetrics()) {
+ registerStatsCallbacks();
+ }
break;
case SystemService.PHASE_ACTIVITY_MANAGER_READY:
synchronized (getLockObject()) {
@@ -3487,6 +3507,121 @@
return true;
}
+ /** Register callbacks for statsd pulled atoms. */
+ private void registerStatsCallbacks() {
+ final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
+ if (statsManager == null) {
+ Slog.wtf(LOG_TAG, "StatsManager system service not found.");
+ return;
+ }
+ statsManager.setPullAtomCallback(
+ DEVICE_POLICY_MANAGEMENT_MODE,
+ null, // use defaultPullAtomMetadata values
+ DIRECT_EXECUTOR,
+ this::onPullManagementModeAtom);
+ statsManager.setPullAtomCallback(
+ DEVICE_POLICY_STATE,
+ null, // use defaultPullAtomMetadata values
+ DIRECT_EXECUTOR,
+ this::onPullPolicyStateAtom);
+ }
+
+ /** Writes the pulled atoms. */
+ private int onPullManagementModeAtom(int atomTag, List<StatsEvent> statsEvents) {
+ synchronized (getLockObject()) {
+ statsEvents.add(DevicePolicyStatsLog.buildStatsEvent(
+ DEVICE_POLICY_MANAGEMENT_MODE,
+ getStatsManagementModeLocked().managementMode()));
+ return PULL_SUCCESS;
+ }
+ }
+
+ /** Writes the pulled atoms. */
+ private int onPullPolicyStateAtom(int atomTag, List<StatsEvent> statsEvents) {
+ synchronized (getLockObject()) {
+ StatsManagementMode statsManagementMode = getStatsManagementModeLocked();
+ if (statsManagementMode.admin() != null) {
+ statsEvents.add(DevicePolicyStatsLog.buildStatsEvent(DEVICE_POLICY_STATE,
+ getRequiredPasswordComplexityStatsLocked(statsManagementMode.admin()),
+ statsManagementMode.managementMode()
+ ));
+ } else {
+ statsEvents.add(DevicePolicyStatsLog.buildStatsEvent(DEVICE_POLICY_STATE,
+ DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_NONE,
+ DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__MANAGEMENT_MODE_UNSPECIFIED
+ ));
+ }
+ return PULL_SUCCESS;
+ }
+ }
+
+ private StatsManagementMode getStatsManagementModeLocked() {
+ int managementMode =
+ DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__MANAGEMENT_MODE_UNSPECIFIED;
+ ActiveAdmin admin = getDeviceOwnerAdminLocked();
+ if (admin != null) {
+ managementMode = getDeviceOwnerTypeLocked(
+ getDeviceOwnerComponent(false).getPackageName())
+ != DEVICE_OWNER_TYPE_FINANCED
+ ? DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__DEVICE_OWNER
+ : DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__DEVICE_OWNER_FINANCED;
+ } else {
+ // Find the first user with managing_app.
+ for (Integer profileUserId : mOwners.getProfileOwnerKeys()) {
+ if (isManagedProfile(profileUserId)) {
+ admin = getProfileOwnerAdminLocked(profileUserId);
+ managementMode = mOwners.isProfileOwnerOfOrganizationOwnedDevice(
+ profileUserId)
+ ? DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__COPE
+ : DEVICE_POLICY_MANAGEMENT_MODE__MANAGEMENT_MODE__PROFILE_OWNER;
+ break;
+ }
+ }
+ }
+ return new StatsManagementMode(managementMode, admin);
+ }
+
+ private record StatsManagementMode(int managementMode, ActiveAdmin admin) {
+ }
+
+ @GuardedBy("getLockObject()")
+ private int getRequiredPasswordComplexityStatsLocked(ActiveAdmin admin) {
+ int userId = admin.getUserHandle().getIdentifier();
+ EnforcingAdmin enforcingAdmin = EnforcingAdmin.createEnterpriseEnforcingAdmin(
+ admin.info.getComponent(),
+ userId,
+ admin);
+
+ Integer passwordComplexity = mDevicePolicyEngine.getLocalPolicySetByAdmin(
+ PolicyDefinition.PASSWORD_COMPLEXITY,
+ enforcingAdmin,
+ userId);
+ if (passwordComplexity == null) {
+ return admin.mPasswordPolicy.quality != PASSWORD_QUALITY_UNSPECIFIED
+ ? DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_LEGACY
+ : DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_UNSPECIFIED;
+ }
+ switch (passwordComplexity) {
+ case PASSWORD_COMPLEXITY_NONE -> {
+ return DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_NONE;
+ }
+ case PASSWORD_COMPLEXITY_LOW -> {
+ return DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_LOW;
+ }
+ case PASSWORD_COMPLEXITY_MEDIUM -> {
+ return DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_MEDIUM;
+ }
+ case PASSWORD_COMPLEXITY_HIGH -> {
+ return DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_HIGH;
+ }
+ default -> {
+ Slogf.wtf(LOG_TAG, "Unhandled password complexity: " + passwordComplexity);
+ // The following line is unreachable as Slogf.wtf crashes the process.
+ // But we need this to avoid compilation error missing return statement.
+ return DEVICE_POLICY_STATE__PASSWORD_COMPLEXITY__COMPLEXITY_UNSPECIFIED;
+ }
+ }
+ }
private void applyManagedSubscriptionsPolicyIfRequired() {
int copeProfileUserId = getOrganizationOwnedProfileUserId();
@@ -16736,7 +16871,7 @@
caller.getUserId());
if (SENSOR_PERMISSIONS.contains(permission)
&& grantState == PERMISSION_GRANT_STATE_GRANTED
- && (!canAdminGrantSensorsPermissions() || isCallerDelegate(caller))) {
+ && !canAdminGrantSensorsPermissions()) {
if (mInjector.isChangeEnabled(THROW_SECURITY_EXCEPTION_FOR_SENSOR_PERMISSIONS,
caller.getPackageName(), caller.getUserId())) {
throw new SecurityException(
@@ -16759,6 +16894,20 @@
|| isFinancedDeviceOwner(caller)))
|| (caller.hasPackage() && isCallerDelegate(caller,
DELEGATION_PERMISSION_GRANT)));
+ if (SENSOR_PERMISSIONS.contains(permission)
+ && grantState == PERMISSION_GRANT_STATE_GRANTED
+ && !canAdminGrantSensorsPermissions()) {
+ if (mInjector.isChangeEnabled(THROW_SECURITY_EXCEPTION_FOR_SENSOR_PERMISSIONS,
+ caller.getPackageName(), caller.getUserId())) {
+ throw new SecurityException(
+ "Caller not permitted to grant sensor permissions.");
+ } else {
+ Slogf.e(LOG_TAG, "Caller attempted to grant sensor permissions but denied");
+ // This is to match the legacy behaviour.
+ callback.sendResult(Bundle.EMPTY);
+ return;
+ }
+ }
synchronized (getLockObject()) {
long ident = mInjector.binderClearCallingIdentity();
try {
diff --git a/services/tests/servicestests/src/com/android/server/autofill/RequestIdTest.java b/services/tests/servicestests/src/com/android/server/autofill/RequestIdTest.java
new file mode 100644
index 0000000..6d56c41
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/autofill/RequestIdTest.java
@@ -0,0 +1,185 @@
+/*
+ * 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.autofill;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(JUnit4.class)
+public class RequestIdTest {
+
+ List<Integer> datasetPrimaryNoWrap = new ArrayList<>();
+ List<Integer> datasetPrimaryWrap = new ArrayList<>();
+ List<Integer> datasetSecondaryNoWrap = new ArrayList<>();
+ List<Integer> datasetSecondaryWrap = new ArrayList<>();
+ List<Integer> datasetMixedNoWrap = new ArrayList<>();
+ List<Integer> datasetMixedWrap = new ArrayList<>();
+
+ @Before
+ public void setup() throws Exception {
+ int datasetSize = 300;
+
+ { // Generate primary only ids that do not wrap
+ RequestId requestId = new RequestId(0);
+ for (int i = 0; i < datasetSize; i++) {
+ datasetPrimaryNoWrap.add(requestId.nextId(false));
+ }
+ }
+
+ { // Generate primary only ids that wrap
+ RequestId requestId = new RequestId(0xff00);
+ for (int i = 0; i < datasetSize; i++) {
+ datasetPrimaryWrap.add(requestId.nextId(false));
+ }
+ }
+
+ { // Generate SECONDARY only ids that do not wrap
+ RequestId requestId = new RequestId(0);
+ for (int i = 0; i < datasetSize; i++) {
+ datasetSecondaryNoWrap.add(requestId.nextId(true));
+ }
+ }
+
+ { // Generate SECONDARY only ids that wrap
+ RequestId requestId = new RequestId(0xff00);
+ for (int i = 0; i < datasetSize; i++) {
+ datasetSecondaryWrap.add(requestId.nextId(true));
+ }
+ }
+
+ { // Generate MIXED only ids that do not wrap
+ RequestId requestId = new RequestId(0);
+ for (int i = 0; i < datasetSize; i++) {
+ datasetMixedNoWrap.add(requestId.nextId(i % 2 != 0));
+ }
+ }
+
+ { // Generate MIXED only ids that wrap
+ RequestId requestId = new RequestId(0xff00);
+ for (int i = 0; i < datasetSize; i++) {
+ datasetMixedWrap.add(requestId.nextId(i % 2 != 0));
+ }
+ }
+ }
+
+ @Test
+ public void testRequestIdLists() {
+ for (int id : datasetPrimaryNoWrap) {
+ assertThat(RequestId.isSecondaryProvider(id)).isFalse();
+ assertThat(id >= 0).isTrue();
+ assertThat(id < 0xffff).isTrue();
+ }
+
+ for (int id : datasetPrimaryWrap) {
+ assertThat(RequestId.isSecondaryProvider(id)).isFalse();
+ assertThat(id >= 0).isTrue();
+ assertThat(id < 0xffff).isTrue();
+ }
+
+ for (int id : datasetSecondaryNoWrap) {
+ assertThat(RequestId.isSecondaryProvider(id)).isTrue();
+ assertThat(id >= 0).isTrue();
+ assertThat(id < 0xffff).isTrue();
+ }
+
+ for (int id : datasetSecondaryWrap) {
+ assertThat(RequestId.isSecondaryProvider(id)).isTrue();
+ assertThat(id >= 0).isTrue();
+ assertThat(id < 0xffff).isTrue();
+ }
+ }
+
+ @Test
+ public void testRequestIdGeneration() {
+ RequestId requestId = new RequestId(0);
+
+ // Large Primary
+ for (int i = 0; i < 100000; i++) {
+ int y = requestId.nextId(false);
+ assertThat(RequestId.isSecondaryProvider(y)).isFalse();
+ assertThat(y >= 0).isTrue();
+ assertThat(y < 0xffff).isTrue();
+ }
+
+ // Large Secondary
+ requestId = new RequestId(0);
+ for (int i = 0; i < 100000; i++) {
+ int y = requestId.nextId(true);
+ assertThat(RequestId.isSecondaryProvider(y)).isTrue();
+ assertThat(y >= 0).isTrue();
+ assertThat(y < 0xffff).isTrue();
+ }
+
+ // Large Mixed
+ requestId = new RequestId(0);
+ for (int i = 0; i < 50000; i++) {
+ int y = requestId.nextId(i % 2 != 0);
+ assertThat(RequestId.isSecondaryProvider(y)).isEqualTo(i % 2 == 0);
+ assertThat(y >= 0).isTrue();
+ assertThat(y < 0xffff).isTrue();
+ }
+ }
+
+ @Test
+ public void testGetLastRequestId() {
+ // In this test, request ids are generated FIFO, so the last entry is also the last
+ // request
+
+ { // Primary no wrap
+ int lastIdIndex = datasetPrimaryNoWrap.size() - 1;
+ int lastComputedIdIndex = RequestId.getLastRequestIdIndex(datasetPrimaryNoWrap);
+ assertThat(lastIdIndex).isEqualTo(lastComputedIdIndex);
+ }
+
+ { // Primary wrap
+ int lastIdIndex = datasetPrimaryWrap.size() - 1;
+ int lastComputedIdIndex = RequestId.getLastRequestIdIndex(datasetPrimaryWrap);
+ assertThat(lastIdIndex).isEqualTo(lastComputedIdIndex);
+ }
+
+ { // Secondary no wrap
+ int lastIdIndex = datasetSecondaryNoWrap.size() - 1;
+ int lastComputedIdIndex = RequestId.getLastRequestIdIndex(datasetSecondaryNoWrap);
+ assertThat(lastIdIndex).isEqualTo(lastComputedIdIndex);
+ }
+
+ { // Secondary wrap
+ int lastIdIndex = datasetSecondaryWrap.size() - 1;
+ int lastComputedIdIndex = RequestId.getLastRequestIdIndex(datasetSecondaryWrap);
+ assertThat(lastIdIndex).isEqualTo(lastComputedIdIndex);
+ }
+
+ { // Mixed no wrap
+ int lastIdIndex = datasetMixedNoWrap.size() - 1;
+ int lastComputedIdIndex = RequestId.getLastRequestIdIndex(datasetMixedNoWrap);
+ assertThat(lastIdIndex).isEqualTo(lastComputedIdIndex);
+ }
+
+ { // Mixed wrap
+ int lastIdIndex = datasetMixedWrap.size() - 1;
+ int lastComputedIdIndex = RequestId.getLastRequestIdIndex(datasetMixedWrap);
+ assertThat(lastIdIndex).isEqualTo(lastComputedIdIndex);
+ }
+
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
index 32c429e..bf47816 100644
--- a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
@@ -46,6 +46,8 @@
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.hardware.power.ChannelConfig;
import android.hardware.power.IPower;
import android.hardware.power.SessionConfig;
@@ -131,6 +133,7 @@
makeWorkDuration(2L, 13L, 2L, 0L, 6L),
makeWorkDuration(2L, 13L, 2L, 8L, 0L),
};
+ private static final String TEST_APP_NAME = "com.android.test.app";
@Mock
private Context mContext;
@@ -140,12 +143,15 @@
private IPower mIPowerMock;
@Mock
private ActivityManagerInternal mAmInternalMock;
+ @Mock
+ private PackageManager mMockPackageManager;
@Rule
public final CheckFlagsRule mCheckFlagsRule =
DeviceFlagsValueProvider.createCheckFlagsRule();
private HintManagerService mService;
private ChannelConfig mConfig;
+ private ApplicationInfo mApplicationInfo;
private static Answer<Long> fakeCreateWithConfig(Long ptr, Long sessionId) {
return new Answer<Long>() {
@@ -162,6 +168,12 @@
mConfig = new ChannelConfig();
mConfig.readFlagBitmask = 1;
mConfig.writeFlagBitmask = 2;
+ mApplicationInfo = new ApplicationInfo();
+ mApplicationInfo.category = ApplicationInfo.CATEGORY_GAME;
+ when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockPackageManager.getNameForUid(anyInt())).thenReturn(TEST_APP_NAME);
+ when(mMockPackageManager.getApplicationInfo(eq(TEST_APP_NAME), anyInt()))
+ .thenReturn(mApplicationInfo);
when(mNativeWrapperMock.halGetHintSessionPreferredRate())
.thenReturn(DEFAULT_HINT_PREFERRED_RATE);
when(mNativeWrapperMock.halCreateHintSession(eq(TGID), eq(UID), eq(SESSION_TIDS_A),
@@ -560,6 +572,44 @@
@Test
@RequiresFlagsEnabled(Flags.FLAG_POWERHINT_THREAD_CLEANUP)
+ public void testNoCleanupDeadThreadsForPrevPowerHalVersion() throws Exception {
+ reset(mIPowerMock);
+ when(mIPowerMock.getInterfaceVersion()).thenReturn(3);
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+ int threadCount = 2;
+
+ // session 1 has 2 non-isolated tids
+ long sessionPtr1 = 111;
+ CountDownLatch stopLatch1 = new CountDownLatch(1);
+ int[] tids1 = createThreads(threadCount, stopLatch1);
+ when(mNativeWrapperMock.halCreateHintSessionWithConfig(eq(TGID), eq(UID), eq(tids1),
+ eq(DEFAULT_TARGET_DURATION), anyInt(), any(SessionConfig.class)))
+ .thenReturn(sessionPtr1);
+ AppHintSession session1 = (AppHintSession) service.getBinderServiceInstance()
+ .createHintSessionWithConfig(token, tids1, DEFAULT_TARGET_DURATION,
+ SessionTag.OTHER, new SessionConfig());
+ assertNotNull(session1);
+
+ // trigger UID state change by making the process foreground->background, but because the
+ // power hal version is too low, this should result in no cleanup as setThreads don't fire.
+ service.mUidObserver.onUidStateChanged(UID,
+ ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0, 0);
+ service.mUidObserver.onUidStateChanged(UID,
+ ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND, 0, 0);
+ LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(500) + TimeUnit.MILLISECONDS.toNanos(
+ CLEAN_UP_UID_DELAY_MILLIS));
+ verify(mNativeWrapperMock, never()).halSetThreads(eq(sessionPtr1), any());
+ reset(mNativeWrapperMock);
+ // this should resume but not update the threads as no cleanup was performed
+ service.mUidObserver.onUidStateChanged(UID,
+ ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0, 0);
+ verify(mNativeWrapperMock, never()).halSetThreads(eq(sessionPtr1), any());
+ }
+
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_POWERHINT_THREAD_CLEANUP)
public void testCleanupDeadThreads() throws Exception {
HintManagerService service = createService();
IBinder token = new Binder();
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index f07e5bc..398dc281 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -208,6 +208,7 @@
import android.content.pm.IPackageManager;
import android.content.pm.LauncherApps;
import android.content.pm.ModuleInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
@@ -12072,6 +12073,127 @@
}
@Test
+ public void testGetPackagesBypassingDnd_empty() throws RemoteException {
+ mService.setPreferencesHelper(mPreferencesHelper);
+ List<String> result = mBinderService.getPackagesBypassingDnd(mUserId, true);
+ assertThat(result).isEmpty();
+ }
+
+ @Test
+ public void testGetPackagesBypassingDnd_excludeConversationChannels() throws RemoteException {
+ mService.setPreferencesHelper(mPreferencesHelper);
+
+ // Set packages
+ PackageInfo pkg0 = new PackageInfo();
+ pkg0.packageName = "pkg0";
+ pkg0.applicationInfo = new ApplicationInfo();
+ pkg0.applicationInfo.uid = mUid;
+ PackageInfo pkg1 = new PackageInfo();
+ pkg1.packageName = "pkg1";
+ pkg1.applicationInfo = new ApplicationInfo();
+ pkg1.applicationInfo.uid = mUid;
+ PackageInfo pkg2 = new PackageInfo();
+ pkg2.packageName = "pkg2";
+ pkg2.applicationInfo = new ApplicationInfo();
+ pkg2.applicationInfo.uid = mUid;
+
+ when(mPackageManagerClient.getInstalledPackagesAsUser(0, mUserId))
+ .thenReturn(List.of(pkg0, pkg1, pkg2));
+
+ // Conversation channels
+ NotificationChannel nc0 = new NotificationChannel("id0", "id0",
+ NotificationManager.IMPORTANCE_HIGH);
+ nc0.setConversationId("parentChannel", "conversationId");
+
+ // Demoted conversation channel
+ NotificationChannel nc1 = new NotificationChannel("id1", "id1",
+ NotificationManager.IMPORTANCE_HIGH);
+ nc1.setConversationId("parentChannel", "conversationId");
+ nc1.setDemoted(true);
+
+ // Non-conversation channels
+ NotificationChannel nc2 = new NotificationChannel("id2", "id2",
+ NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel nc3 = new NotificationChannel("id3", "id3",
+ NotificationManager.IMPORTANCE_HIGH);
+
+ ParceledListSlice<NotificationChannel> pls0 =
+ new ParceledListSlice(ImmutableList.of(nc0));
+ ParceledListSlice<NotificationChannel> pls1 =
+ new ParceledListSlice(ImmutableList.of(nc1));
+ ParceledListSlice<NotificationChannel> pls2 =
+ new ParceledListSlice(ImmutableList.of(nc2, nc3));
+
+ when(mPreferencesHelper.getNotificationChannelsBypassingDnd("pkg0", mUid))
+ .thenReturn(pls0);
+ when(mPreferencesHelper.getNotificationChannelsBypassingDnd("pkg1", mUid))
+ .thenReturn(pls1);
+ when(mPreferencesHelper.getNotificationChannelsBypassingDnd("pkg2", mUid))
+ .thenReturn(pls2);
+
+ List<String> result = mBinderService.getPackagesBypassingDnd(mUserId, false);
+
+ assertThat(result).containsExactly("pkg1", "pkg2");
+ }
+
+ @Test
+ public void testGetPackagesBypassingDnd_includeConversationChannels() throws RemoteException {
+ mService.setPreferencesHelper(mPreferencesHelper);
+
+ // Set packages
+ PackageInfo pkg0 = new PackageInfo();
+ pkg0.packageName = "pkg0";
+ pkg0.applicationInfo = new ApplicationInfo();
+ pkg0.applicationInfo.uid = mUid;
+ PackageInfo pkg1 = new PackageInfo();
+ pkg1.packageName = "pkg1";
+ pkg1.applicationInfo = new ApplicationInfo();
+ pkg1.applicationInfo.uid = mUid;
+ PackageInfo pkg2 = new PackageInfo();
+ pkg2.packageName = "pkg2";
+ pkg2.applicationInfo = new ApplicationInfo();
+ pkg2.applicationInfo.uid = mUid;
+
+ when(mPackageManagerClient.getInstalledPackagesAsUser(0, mUserId))
+ .thenReturn(List.of(pkg0, pkg1, pkg2));
+
+ // Conversation channels
+ NotificationChannel nc0 = new NotificationChannel("id0", "id0",
+ NotificationManager.IMPORTANCE_HIGH);
+ nc0.setConversationId("parentChannel", "conversationId");
+
+ // Demoted conversation channel
+ NotificationChannel nc1 = new NotificationChannel("id1", "id1",
+ NotificationManager.IMPORTANCE_HIGH);
+ nc1.setConversationId("parentChannel", "conversationId");
+ nc1.setDemoted(true);
+
+ // Non-conversation channels
+ NotificationChannel nc2 = new NotificationChannel("id2", "id2",
+ NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel nc3 = new NotificationChannel("id3", "id3",
+ NotificationManager.IMPORTANCE_HIGH);
+
+ ParceledListSlice<NotificationChannel> pls0 =
+ new ParceledListSlice(ImmutableList.of(nc0));
+ ParceledListSlice<NotificationChannel> pls1 =
+ new ParceledListSlice(ImmutableList.of(nc1));
+ ParceledListSlice<NotificationChannel> pls2 =
+ new ParceledListSlice(ImmutableList.of(nc2, nc3));
+
+ when(mPreferencesHelper.getNotificationChannelsBypassingDnd("pkg0", mUid))
+ .thenReturn(pls0);
+ when(mPreferencesHelper.getNotificationChannelsBypassingDnd("pkg1", mUid))
+ .thenReturn(pls1);
+ when(mPreferencesHelper.getNotificationChannelsBypassingDnd("pkg2", mUid))
+ .thenReturn(pls2);
+
+ List<String> result = mBinderService.getPackagesBypassingDnd(mUserId, true);
+
+ assertThat(result).containsExactly("pkg0", "pkg1", "pkg2");
+ }
+
+ @Test
public void testMatchesCallFilter_noPermissionShouldThrow() throws Exception {
// set the testable NMS to not system uid/appid
mService.isSystemUid = false;