diff options
623 files changed, 8499 insertions, 3620 deletions
diff --git a/Android.bp b/Android.bp index 9d8c8a69fc18..9d3b64d7335b 100644 --- a/Android.bp +++ b/Android.bp @@ -529,11 +529,7 @@ java_library { ], }, jarjar_prefix: "com.android.internal.hidden_from_bootclasspath", - - jarjar_shards: select(release_flag("RELEASE_USE_SHARDED_JARJAR_ON_FRAMEWORK_MINUS_APEX"), { - true: "10", - default: "1", - }), + jarjar_shards: "10", } java_library { diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 15ae79e34061..937a9ffaf210 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -2224,7 +2224,7 @@ package android.app.contentsuggestions { package android.app.contextualsearch { - @FlaggedApi("android.app.contextualsearch.flags.enable_service") public final class CallbackToken implements android.os.Parcelable { + public final class CallbackToken implements android.os.Parcelable { ctor public CallbackToken(); method public int describeContents(); method public void getContextualSearchState(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.app.contextualsearch.ContextualSearchState,java.lang.Throwable>); @@ -2232,7 +2232,7 @@ package android.app.contextualsearch { field @NonNull public static final android.os.Parcelable.Creator<android.app.contextualsearch.CallbackToken> CREATOR; } - @FlaggedApi("android.app.contextualsearch.flags.enable_service") public final class ContextualSearchManager { + public final class ContextualSearchManager { method @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXTUAL_SEARCH) public void startContextualSearch(int); field public static final String ACTION_LAUNCH_CONTEXTUAL_SEARCH = "android.app.contextualsearch.action.LAUNCH_CONTEXTUAL_SEARCH"; field public static final int ENTRYPOINT_LONG_PRESS_HOME = 2; // 0x2 @@ -2250,7 +2250,7 @@ package android.app.contextualsearch { field public static final String EXTRA_VISIBLE_PACKAGE_NAMES = "android.app.contextualsearch.extra.VISIBLE_PACKAGE_NAMES"; } - @FlaggedApi("android.app.contextualsearch.flags.enable_service") public final class ContextualSearchState implements android.os.Parcelable { + public final class ContextualSearchState implements android.os.Parcelable { ctor public ContextualSearchState(@Nullable android.app.assist.AssistStructure, @Nullable android.app.assist.AssistContent, @NonNull android.os.Bundle); method public int describeContents(); method @Nullable public android.app.assist.AssistContent getContent(); @@ -3774,7 +3774,7 @@ package android.content { field public static final String CLOUDSEARCH_SERVICE = "cloudsearch"; field public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions"; field public static final String CONTEXTHUB_SERVICE = "contexthub"; - field @FlaggedApi("android.app.contextualsearch.flags.enable_service") public static final String CONTEXTUAL_SEARCH_SERVICE = "contextual_search"; + field public static final String CONTEXTUAL_SEARCH_SERVICE = "contextual_search"; field @FlaggedApi("android.permission.flags.enhanced_confirmation_mode_apis_enabled") public static final String ECM_ENHANCED_CONFIRMATION_SERVICE = "ecm_enhanced_confirmation"; field public static final String ETHERNET_SERVICE = "ethernet"; field public static final String EUICC_CARD_SERVICE = "euicc_card"; @@ -15450,6 +15450,8 @@ package android.telephony { field public static final int CONDITIONAL_IE_ERROR = 100; // 0x64 field public static final int DESTINATION_OUT_OF_ORDER = 27; // 0x1b field @FlaggedApi("com.android.internal.telephony.flags.use_oem_domain_selection_service") public static final int EMERGENCY_PERM_FAILURE = 326; // 0x146 + field @FlaggedApi("com.android.internal.telephony.flags.add_ims_redial_codes_for_emergency_calls") public static final int EMERGENCY_REDIAL_ON_IMS = 3001; // 0xbb9 + field @FlaggedApi("com.android.internal.telephony.flags.add_ims_redial_codes_for_emergency_calls") public static final int EMERGENCY_REDIAL_ON_VOWIFI = 3002; // 0xbba field @FlaggedApi("com.android.internal.telephony.flags.use_oem_domain_selection_service") public static final int EMERGENCY_TEMP_FAILURE = 325; // 0x145 field public static final int ERROR_UNSPECIFIED = 65535; // 0xffff field public static final int FACILITY_REJECTED = 29; // 0x1d diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 0126db70296c..f06bd48a8cd8 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -809,7 +809,7 @@ package android.app.contentsuggestions { package android.app.contextualsearch { - @FlaggedApi("android.app.contextualsearch.flags.enable_service") public final class CallbackToken implements android.os.Parcelable { + public final class CallbackToken implements android.os.Parcelable { method @NonNull public android.os.IBinder getToken(); } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 2cfba4b8468f..7b9ec4a7821e 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -7061,7 +7061,7 @@ public final class ActivityThread extends ClientTransactionHandler Slog.w(TAG, "Low overhead tracing feature is not enabled"); break; } - VMDebug.startLowOverheadTrace(); + VMDebug.startLowOverheadTraceForAllMethods(); break; default: try { diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index fbe5b9449b00..fcb817ede6b3 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -11932,7 +11932,7 @@ public class Notification implements Parcelable } /** - * Finds steps and points fill color with sufficient contrast over bg (1.3:1) that + * Finds steps and points fill color with sufficient contrast over bg (3:1) that * has the same hue as the original color, but is lightened or darkened depending on * whether the background is dark or light. * @@ -11945,7 +11945,7 @@ public class Notification implements Parcelable return Builder.ensureColorContrast( Color.alpha(color) == 0 ? defaultColor : color, bg, - 1.3); + 3); } /** diff --git a/core/java/android/app/appfunctions/AppFunctionManager.java b/core/java/android/app/appfunctions/AppFunctionManager.java index a731e5085466..6fd8db995368 100644 --- a/core/java/android/app/appfunctions/AppFunctionManager.java +++ b/core/java/android/app/appfunctions/AppFunctionManager.java @@ -42,12 +42,13 @@ import java.util.Objects; import java.util.concurrent.Executor; /** - * Provides access to app functions. + * Provides access to App Functions. App Functions is currently a + * beta/experimental preview feature. * * <p>An app function is a piece of functionality that apps expose to the system for cross-app * orchestration. * - * <p>**Building App Functions:** + * <h3>Building App Functions</h3> * * <p>Most developers should build app functions through the AppFunctions SDK. This SDK library * offers a more convenient and type-safe way to build app functions. The SDK provides predefined @@ -56,7 +57,7 @@ import java.util.concurrent.Executor; * these data classes into {@link ExecuteAppFunctionRequest#getParameters()} and {@link * ExecuteAppFunctionResponse#getResultDocument()}. * - * <p>**Discovering App Functions:** + * <h3>Discovering App Functions</h3> * * <p>When there is a package change or the device starts up, the metadata of available functions is * indexed on-device by {@link AppSearchManager}. AppSearch stores the indexed information as an @@ -66,7 +67,7 @@ import java.util.concurrent.Executor; * document is based on the packages that have visibility to the app providing the app functions. * AppFunction SDK provides a convenient way to achieve this and is the preferred method. * - * <p>**Executing App Functions:** + * <h3>Executing App Functions</h3> * * <p>To execute an app function, the caller app can retrieve the {@code functionIdentifier} from * the {@code AppFunctionStaticMetadata} document and use it to build an {@link @@ -76,7 +77,7 @@ import java.util.concurrent.Executor; * apps. An app can always execute its own app functions and doesn't need these permissions. * AppFunction SDK provides a convenient way to achieve this and is the preferred method. * - * <p>**Example:** + * <h3>Example</h3> * * <p>An assistant app is trying to fulfill the user request "Save XYZ into my note". The assistant * app should first list all available app functions as {@code AppFunctionStaticMetadata} documents diff --git a/core/java/android/app/appfunctions/OWNERS b/core/java/android/app/appfunctions/OWNERS index 6a69e15d00dd..822242de1a81 100644 --- a/core/java/android/app/appfunctions/OWNERS +++ b/core/java/android/app/appfunctions/OWNERS @@ -5,3 +5,4 @@ tonymak@google.com mingweiliao@google.com anothermark@google.com utkarshnigam@google.com +yaraabdullatif@google.com diff --git a/core/java/android/app/contextualsearch/CallbackToken.java b/core/java/android/app/contextualsearch/CallbackToken.java index 94cdc73fcd1d..c0ea1cd3a9de 100644 --- a/core/java/android/app/contextualsearch/CallbackToken.java +++ b/core/java/android/app/contextualsearch/CallbackToken.java @@ -44,7 +44,6 @@ import java.util.concurrent.Executor; * * @hide */ -@FlaggedApi(Flags.FLAG_ENABLE_SERVICE) @SystemApi public final class CallbackToken implements Parcelable { private static final boolean DEBUG = true; diff --git a/core/java/android/app/contextualsearch/ContextualSearchManager.java b/core/java/android/app/contextualsearch/ContextualSearchManager.java index ad43f271a910..2ce431dcb32d 100644 --- a/core/java/android/app/contextualsearch/ContextualSearchManager.java +++ b/core/java/android/app/contextualsearch/ContextualSearchManager.java @@ -43,7 +43,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@FlaggedApi(Flags.FLAG_ENABLE_SERVICE) public final class ContextualSearchManager { /** diff --git a/core/java/android/app/contextualsearch/ContextualSearchState.java b/core/java/android/app/contextualsearch/ContextualSearchState.java index f01ae55d05b6..e1731bf525bf 100644 --- a/core/java/android/app/contextualsearch/ContextualSearchState.java +++ b/core/java/android/app/contextualsearch/ContextualSearchState.java @@ -38,7 +38,6 @@ import androidx.annotation.NonNull; * * @hide */ -@FlaggedApi(Flags.FLAG_ENABLE_SERVICE) @SystemApi public final class ContextualSearchState implements Parcelable { private final @NonNull Bundle mExtras; diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 7abf5600d659..8d54673df74c 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -5593,7 +5593,6 @@ public abstract class Context { * @hide * @see #getSystemService(String) */ - @FlaggedApi(android.app.contextualsearch.flags.Flags.FLAG_ENABLE_SERVICE) @SystemApi public static final String CONTEXTUAL_SEARCH_SERVICE = "contextual_search"; diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java index 53813012b4b3..71d0a04760ac 100644 --- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java +++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java @@ -541,9 +541,9 @@ public class ApkLiteParseUtils { case TAG_USES_SDK_LIBRARY: String usesSdkLibName = parser.getAttributeValue( ANDROID_RES_NAMESPACE, "name"); - // TODO(b/379219371): Due to a bug in bundletool, some apps can use - // versionMajor as string. Until it is resolved, we are adding a - // workaround here. + // TODO(b/391604666): Due to a bug in bundletool, old apps could be + // using versionMajor as string. Do not remove this workaround until + // b/391604666 is resolved. String usesSdkLibVersionMajorString = parser.getAttributeValue( ANDROID_RES_NAMESPACE, "versionMajor"); long usesSdkLibVersionMajor = XmlUtils.convertValueToInt( diff --git a/core/java/android/hardware/display/AmbientDisplayConfiguration.java b/core/java/android/hardware/display/AmbientDisplayConfiguration.java index 7361d4f6b882..063f5545dd71 100644 --- a/core/java/android/hardware/display/AmbientDisplayConfiguration.java +++ b/core/java/android/hardware/display/AmbientDisplayConfiguration.java @@ -44,7 +44,7 @@ public class AmbientDisplayConfiguration { private final Context mContext; private final boolean mAlwaysOnByDefault; private final boolean mPickupGestureEnabledByDefault; - private final boolean mScreenOffUdfpsEnabledByDefault; + private final boolean mScreenOffUdfpsAvailable; /** Copied from android.provider.Settings.Secure since these keys are hidden. */ private static final String[] DOZE_SETTINGS = { @@ -72,7 +72,7 @@ public class AmbientDisplayConfiguration { mAlwaysOnByDefault = mContext.getResources().getBoolean(R.bool.config_dozeAlwaysOnEnabled); mPickupGestureEnabledByDefault = mContext.getResources().getBoolean(R.bool.config_dozePickupGestureEnabled); - mScreenOffUdfpsEnabledByDefault = + mScreenOffUdfpsAvailable = mContext.getResources().getBoolean(R.bool.config_screen_off_udfps_enabled); } @@ -152,7 +152,8 @@ public class AmbientDisplayConfiguration { /** @hide */ public boolean screenOffUdfpsEnabled(int user) { return !TextUtils.isEmpty(udfpsLongPressSensorType()) - && ((mScreenOffUdfpsEnabledByDefault && Flags.screenOffUnlockUdfps()) + && ((mScreenOffUdfpsAvailable && Flags.screenOffUnlockUdfps()) + && mContext.getResources().getBoolean(R.bool.config_screen_off_udfps_default_on) ? boolSettingDefaultOn(SCREEN_OFF_UNLOCK_UDFPS_ENABLED, user) : boolSettingDefaultOff(SCREEN_OFF_UNLOCK_UDFPS_ENABLED, user)); } diff --git a/core/java/android/inputmethodservice/NavigationBarController.java b/core/java/android/inputmethodservice/NavigationBarController.java index 38be8d9f772d..019ba0045916 100644 --- a/core/java/android/inputmethodservice/NavigationBarController.java +++ b/core/java/android/inputmethodservice/NavigationBarController.java @@ -16,6 +16,9 @@ package android.inputmethodservice; +import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; +import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; +import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; import static android.view.WindowInsets.Type.captionBar; import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS; @@ -23,7 +26,6 @@ import android.animation.ValueAnimator; import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.Nullable; -import android.app.StatusBarManager; import android.graphics.Color; import android.graphics.Insets; import android.graphics.Rect; @@ -241,10 +243,9 @@ final class NavigationBarController { if (navigationBarView != null) { // TODO(b/213337792): Support InputMethodService#setBackDisposition(). // TODO(b/213337792): Set NAVIGATION_HINT_IME_SHOWN only when necessary. - final int hints = StatusBarManager.NAVIGATION_HINT_BACK_ALT + final int hints = NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN | (mShouldShowImeSwitcherWhenImeIsShown - ? StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN - : 0); + ? NAVIGATION_HINT_IME_SWITCHER_SHOWN : 0); navigationBarView.setNavigationIconHints(hints); navigationBarView.prepareNavButtons(this); } @@ -512,13 +513,14 @@ final class NavigationBarController { } final NavigationBarView navigationBarView = mNavigationBarFrame.findViewByPredicate( NavigationBarView.class::isInstance); - if (navigationBarView == null) { - return; + if (navigationBarView != null) { + // TODO(b/213337792): Support InputMethodService#setBackDisposition(). + // TODO(b/213337792): Set NAVIGATION_HINT_IME_SHOWN only when necessary. + final int hints = NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN + | (mShouldShowImeSwitcherWhenImeIsShown + ? NAVIGATION_HINT_IME_SWITCHER_SHOWN : 0); + navigationBarView.setNavigationIconHints(hints); } - final int hints = StatusBarManager.NAVIGATION_HINT_BACK_ALT - | (shouldShowImeSwitcherWhenImeIsShown - ? StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN : 0); - navigationBarView.setNavigationIconHints(hints); } else { uninstallNavigationBarFrameIfNecessary(); } diff --git a/core/java/android/inputmethodservice/navigationbar/NavigationBarView.java b/core/java/android/inputmethodservice/navigationbar/NavigationBarView.java index 209f323d7b34..e7e46a9482c8 100644 --- a/core/java/android/inputmethodservice/navigationbar/NavigationBarView.java +++ b/core/java/android/inputmethodservice/navigationbar/NavigationBarView.java @@ -290,7 +290,7 @@ public final class NavigationBarView extends FrameLayout { final boolean oldBackAlt = (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0; if (newBackAlt != oldBackAlt) { - //onImeVisibilityChanged(newBackAlt); + //onBackAltChanged(newBackAlt); } if (DEBUG) { diff --git a/core/java/android/os/CombinedMessageQueue/MessageQueue.java b/core/java/android/os/CombinedMessageQueue/MessageQueue.java index 3026609ed5cb..50b621c46778 100644 --- a/core/java/android/os/CombinedMessageQueue/MessageQueue.java +++ b/core/java/android/os/CombinedMessageQueue/MessageQueue.java @@ -1474,54 +1474,11 @@ public final class MessageQueue { Iterator<MessageNode> queueIter = mPriorityQueue.iterator(); MessageNode queueNode = iterateNext(queueIter); - if (queueNode != null && queueNode.isBarrier()) { - long now = SystemClock.uptimeMillis(); - - /* Look for a deliverable async node. If one exists we are not blocked. */ - Iterator<MessageNode> asyncQueueIter = mAsyncPriorityQueue.iterator(); - MessageNode asyncNode = iterateNext(asyncQueueIter); - if (asyncNode != null && now >= asyncNode.getWhen()) { - return false; - } - /* - * Look for a deliverable sync node. In this case, if one exists we are blocked - * since the barrier prevents delivery of the Message. - */ - while (queueNode != null && queueNode.isBarrier()) { - queueNode = iterateNext(queueIter); - } - if (queueNode != null && now >= queueNode.getWhen()) { - return true; - } - } + return (queueNode != null && queueNode.isBarrier()); } else { Message msg = mMessages; - if (msg != null && msg.target == null) { - Message iter = msg; - /* Look for a deliverable async node */ - do { - iter = iter.next; - } while (iter != null && !iter.isAsynchronous()); - - long now = SystemClock.uptimeMillis(); - if (iter != null && now >= iter.when) { - return false; - } - /* - * Look for a deliverable sync node. In this case, if one exists we are blocked - * since the barrier prevents delivery of the Message. - */ - iter = msg; - do { - iter = iter.next; - } while (iter != null && (iter.target == null || iter.isAsynchronous())); - - if (iter != null && now >= iter.when) { - return true; - } - } + return msg != null && msg.target == null; } - return false; } private static final class MatchHandlerWhatAndObject extends MessageCompare { diff --git a/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java b/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java index d7d8e4199b33..80da487a1358 100644 --- a/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java +++ b/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java @@ -16,7 +16,6 @@ package android.os; -import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -1122,27 +1121,7 @@ public final class MessageQueue { Iterator<MessageNode> queueIter = mPriorityQueue.iterator(); MessageNode queueNode = iterateNext(queueIter); - if (queueNode != null && queueNode.isBarrier()) { - long now = SystemClock.uptimeMillis(); - - /* Look for a deliverable async node. If one exists we are not blocked. */ - Iterator<MessageNode> asyncQueueIter = mAsyncPriorityQueue.iterator(); - MessageNode asyncNode = iterateNext(asyncQueueIter); - if (asyncNode != null && now >= asyncNode.getWhen()) { - return false; - } - /* - * Look for a deliverable sync node. In this case, if one exists we are blocked - * since the barrier prevents delivery of the Message. - */ - while (queueNode != null && queueNode.isBarrier()) { - queueNode = iterateNext(queueIter); - } - if (queueNode != null && now >= queueNode.getWhen()) { - return true; - } - } - return false; + return queueNode != null && queueNode.isBarrier(); } private StateNode getStateNode(StackNode node) { diff --git a/core/java/android/os/LegacyMessageQueue/MessageQueue.java b/core/java/android/os/LegacyMessageQueue/MessageQueue.java index d12d99a71251..cde2ba56fcba 100644 --- a/core/java/android/os/LegacyMessageQueue/MessageQueue.java +++ b/core/java/android/os/LegacyMessageQueue/MessageQueue.java @@ -820,33 +820,10 @@ public final class MessageQueue { */ boolean isBlockedOnSyncBarrier() { throwIfNotTest(); - Message msg = mMessages; - if (msg != null && msg.target == null) { - Message iter = msg; - /* Look for a deliverable async node */ - do { - iter = iter.next; - } while (iter != null && !iter.isAsynchronous()); - - long now = SystemClock.uptimeMillis(); - if (iter != null && now >= iter.when) { - return false; - } - /* - * Look for a deliverable sync node. In this case, if one exists we are blocked - * since the barrier prevents delivery of the Message. - */ - iter = msg; - do { - iter = iter.next; - } while (iter != null && (iter.target == null || iter.isAsynchronous())); - - if (iter != null && now >= iter.when) { - return true; - } - return false; + synchronized (this) { + Message msg = mMessages; + return msg != null && msg.target == null; } - return false; } boolean hasMessages(Handler h, int what, Object object) { diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index c6a63a7ef238..3c4139d39762 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -50,7 +50,6 @@ import com.android.internal.util.ArrayUtils; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; -import dalvik.annotation.optimization.NeverInline; import libcore.util.SneakyThrow; @@ -629,19 +628,6 @@ public final class Parcel { } } - @NeverInline - private void errorUsedWhileRecycling() { - String error = "Parcel used while recycled. " - + Log.getStackTraceString(new Throwable()) - + " Original recycle call (if DEBUG_RECYCLE): ", mStack; - Log.wtf(TAG, error); - // TODO(b/381155347): harder error - } - - private void assertNotRecycled() { - if (mRecycled) errorUsedWhileRecycling(); - } - /** * Set a {@link ReadWriteHelper}, which can be used to avoid having duplicate strings, for * example. @@ -1194,7 +1180,6 @@ public final class Parcel { * growing dataCapacity() if needed. */ public final void writeInt(int val) { - assertNotRecycled(); int err = nativeWriteInt(mNativePtr, val); if (err != OK) { nativeSignalExceptionForError(err); @@ -3297,7 +3282,6 @@ public final class Parcel { * Read an integer value from the parcel at the current dataPosition(). */ public final int readInt() { - assertNotRecycled(); return nativeReadInt(mNativePtr); } @@ -4639,9 +4623,11 @@ public final class Parcel { object = readValue(type, loader, clazz, itemTypes); int actual = dataPosition() - start; if (actual != length) { - Slog.wtfStack(TAG, - "Unparcelling of " + object + " of type " + Parcel.valueTypeToString(type) - + " consumed " + actual + " bytes, but " + length + " expected."); + String error = "Unparcelling of " + object + " of type " + + Parcel.valueTypeToString(type) + " consumed " + actual + + " bytes, but " + length + " expected."; + Slog.wtfStack(TAG, error); + throw new BadParcelableException(error); } } else { object = readValue(type, loader, clazz, itemTypes); diff --git a/core/java/android/os/TestLooperManager.java b/core/java/android/os/TestLooperManager.java index 289b98c9b1d4..d451109554fa 100644 --- a/core/java/android/os/TestLooperManager.java +++ b/core/java/android/os/TestLooperManager.java @@ -129,9 +129,6 @@ public class TestLooperManager { /** * Checks whether the Looper is currently blocked on a sync barrier. - * - * A Looper is blocked on a sync barrier if there is a Message in the Looper's - * queue that is ready for execution but is behind a sync barrier */ @FlaggedApi(Flags.FLAG_MESSAGE_QUEUE_TESTABILITY) public boolean isBlockedOnSyncBarrier() { diff --git a/core/java/android/security/FileIntegrityManager.java b/core/java/android/security/FileIntegrityManager.java index 478435b1ac5e..9e02ecd19aee 100644 --- a/core/java/android/security/FileIntegrityManager.java +++ b/core/java/android/security/FileIntegrityManager.java @@ -170,11 +170,6 @@ public final class FileIntegrityManager { @Deprecated public boolean isAppSourceCertificateTrusted(@NonNull X509Certificate certificate) throws CertificateEncodingException { - try { - return mService.isAppSourceCertificateTrusted( - certificate.getEncoded(), mContext.getOpPackageName()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return false; } } diff --git a/core/java/android/security/IFileIntegrityService.aidl b/core/java/android/security/IFileIntegrityService.aidl index ddb662ad42cb..c6def239d59a 100644 --- a/core/java/android/security/IFileIntegrityService.aidl +++ b/core/java/android/security/IFileIntegrityService.aidl @@ -25,7 +25,6 @@ import android.os.IInstalld; */ interface IFileIntegrityService { boolean isApkVeritySupported(); - boolean isAppSourceCertificateTrusted(in byte[] certificateBytes, in String packageName); IInstalld.IFsveritySetupAuthToken createAuthToken(in ParcelFileDescriptor authFd); diff --git a/core/java/android/view/autofill/AutofillFeatureFlags.java b/core/java/android/view/autofill/AutofillFeatureFlags.java index 206e47f13890..0814e23eea87 100644 --- a/core/java/android/view/autofill/AutofillFeatureFlags.java +++ b/core/java/android/view/autofill/AutofillFeatureFlags.java @@ -21,6 +21,7 @@ import static android.service.autofill.Flags.improveFillDialogAconfig; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.provider.DeviceConfig; +import android.service.autofill.Flags; import android.text.TextUtils; import android.util.ArraySet; import android.view.View; @@ -348,6 +349,14 @@ public class AutofillFeatureFlags { // END AUTOFILL REMOVE PRE_TRIGGER FLAGS /** + * Whether per Session FillEventHistory is enabled. + * + * @hide + */ + public static final String DEVICE_CONFIG_SESSION_FILL_EVENT_HISTORY = + "session_fill_event_history"; + + /** * Define the max input length for autofill to show suggesiton UI * * E.g. if flag is set to 3, autofill will only show suggestions when user inputs less than 3 @@ -409,6 +418,13 @@ public class AutofillFeatureFlags { // END AUTOFILL REMOVE PRE_TRIGGER FLAGS DEFAULTS /** + * Default for whether per Session FillEventHistory is enabled + * + * @hide + */ + public static final boolean DEFAULT_SESSION_FILL_EVENT_HISTORY_ENABLED = false; + + /** * @hide */ public static final int DEFAULT_MAX_INPUT_LENGTH_FOR_AUTOFILL = 3; @@ -697,4 +713,20 @@ public class AutofillFeatureFlags { DEVICE_CONFIG_FILL_DIALOG_MIN_WAIT_AFTER_IME_ANIMATION_END_MS, DEFAULT_FILL_DIALOG_MIN_WAIT_AFTER_IME_ANIMATION_END_MS); } + + /** + * Whether tracking FillEventHistory per Session is enabled + * + * @hide + */ + public static boolean isMultipleFillEventHistoryEnabled() { + if (!Flags.multipleFillHistory()) { + return false; + } + + return DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_AUTOFILL, + DEVICE_CONFIG_SESSION_FILL_EVENT_HISTORY, + DEFAULT_SESSION_FILL_EVENT_HISTORY_ENABLED); + } } diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig index c2e305d72dd0..9f6ea42c6fc4 100644 --- a/core/java/android/window/flags/windowing_frontend.aconfig +++ b/core/java/android/window/flags/windowing_frontend.aconfig @@ -180,6 +180,16 @@ flag { } flag { + name: "app_handle_no_relayout_on_exclusion_change" + namespace: "windowing_frontend" + description: "Remove unnecessary relayouts for app handle when exclusion regions change" + bug: "383672263" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "respect_non_top_visible_fixed_orientation" namespace: "windowing_frontend" description: "If top activity is not opaque, respect the fixed orientation of activity behind it" diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 555374a05592..ec3975205542 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -214,6 +214,11 @@ oneway interface IStatusBar void onDisplayReady(int displayId); /** + * Notifies System UI that the system decorations should be removed from the display. + */ + void onDisplayRemoveSystemDecorations(int displayId); + + /** * Notifies System UI side of system bar attribute change on the specified display. * * @param displayId the ID of the display to notify. @@ -395,4 +400,7 @@ oneway interface IStatusBar * @param displayId the id of the current display. */ void moveFocusedTaskToDesktop(int displayId); + + /** Set whether the display should have a navigation bar. */ + void setHasNavigationBar(int displayId, boolean hasNavigationBar); } diff --git a/core/res/res/color-night/resolver_profile_tab_text.xml b/core/res/res/color-night/resolver_profile_tab_text.xml deleted file mode 100644 index 61a5140582d0..000000000000 --- a/core/res/res/color-night/resolver_profile_tab_text.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2022 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<selector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/textColorPrimaryInverse" android:state_selected="true"/> - <item android:color="?androidprv:attr/textColorSecondary"/> -</selector> diff --git a/core/res/res/color/resolver_profile_tab_text.xml b/core/res/res/color/resolver_profile_tab_text.xml index 6b8c42d70cdf..13bdd14e0280 100644 --- a/core/res/res/color/resolver_profile_tab_text.xml +++ b/core/res/res/color/resolver_profile_tab_text.xml @@ -13,8 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <item android:color="?androidprv:attr/textColorPrimary" android:state_selected="true"/> - <item android:color="?androidprv:attr/textColorSecondary"/> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@color/materialColorOnPrimary" android:state_selected="true"/> + <item android:color="@color/materialColorOnSurface"/> </selector> diff --git a/core/res/res/drawable/inset_resolver_profile_tab_bg.xml b/core/res/res/drawable/inset_resolver_profile_tab_bg.xml new file mode 100644 index 000000000000..8c7b2c09e0f6 --- /dev/null +++ b/core/res/res/drawable/inset_resolver_profile_tab_bg.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright 2025 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/resolver_profile_tab_bg" + android:insetLeft="0dp" + android:insetRight="0dp" + android:insetTop="6dp" + android:insetBottom="6dp" /> diff --git a/core/res/res/drawable/resolver_profile_tab_bg.xml b/core/res/res/drawable/resolver_profile_tab_bg.xml index bc9634580007..e36ccc692c6b 100644 --- a/core/res/res/drawable/resolver_profile_tab_bg.xml +++ b/core/res/res/drawable/resolver_profile_tab_bg.xml @@ -29,14 +29,14 @@ <item android:state_selected="false"> <shape android:shape="rectangle"> <corners android:radius="12dp" /> - <solid android:color="?androidprv:attr/colorSurface" /> + <solid android:color="@color/materialColorSurfaceBright" /> </shape> </item> <item android:state_selected="true"> <shape android:shape="rectangle"> <corners android:radius="12dp" /> - <solid android:color="@color/resolver_profile_tab_selected_bg" /> + <solid android:color="@android:color/materialColorPrimary" /> </shape> </item> </selector> diff --git a/core/res/res/layout/resolver_profile_tab_button.xml b/core/res/res/layout/resolver_profile_tab_button.xml index fd168e6414f1..7404dc33be7f 100644 --- a/core/res/res/layout/resolver_profile_tab_button.xml +++ b/core/res/res/layout/resolver_profile_tab_button.xml @@ -18,11 +18,10 @@ <Button xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dp" - android:layout_height="36dp" + android:layout_height="48dp" android:layout_weight="1" - android:layout_marginVertical="6dp" android:layout_marginHorizontal="@dimen/resolver_profile_tab_margin" - android:background="@drawable/resolver_profile_tab_bg" + android:background="@drawable/inset_resolver_profile_tab_bg" android:textColor="@color/resolver_profile_tab_text" android:textSize="@dimen/resolver_tab_text_size" android:textAppearance="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle" diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 59414771c36c..1c7ce89dc0ad 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Appinhoud is weens sekuriteit van skermdeling verberg"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Outomaties aan satelliet gekoppel"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Jy kan boodskappe stuur en ontvang sonder ’n selfoon- of wi-fi-netwerk"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Jy kan boodskappe stuur en ontvang en beperkte data via satelliet gebruik"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Gebruik satellietboodskappe?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Stuur en ontvang boodskappe sonder ’n selfoon- of wi-fi-netwerk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Maak Boodskappe oop"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 0ca5ab4a338d..0f5fee4cf9da 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"ለደኅንነት ሲባል የመተግበሪያ ይዘት ከማያ ገጽ ማጋራት ተደብቋል"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"ከሳተላይት ጋር በራስ-ሰር ተገናኝቷል"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"ያለ ሞባይል ወይም የWi-Fi አውታረ መረብ መልዕክቶችን መላክ እና መቀበል ይችላሉ"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"በሳተላይት መልዕክቶችን መላክ እና መቀበል እና የተገደበ ውሂብ መጠቀም ይችላሉ"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"የሳተላይት መልዕክት መላላክን ይጠቀማሉ?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"ያለ ሞባይል ወይም የWi-Fi አውታረ መረብ መልዕክቶችን ይላኩ እና ይቀበሉ"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"መልዕክቶች ይክፈቱ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index cb765e71b801..1fdbe8c35f3e 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -2463,8 +2463,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"تم إخفاء محتوى التطبيق بعد تفعيل ميزة \"مشاركة الشاشة\" للحفاظ على أمانك"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"تم الاتصال تلقائيًا بالقمر الصناعي"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"يمكنك إرسال الرسائل واستلامها بدون شبكة الجوّال أو شبكة Wi-Fi."</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"يمكنك إرسال الرسائل وتلقّيها واستخدام بيانات محدودة عبر القمر الصناعي"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"هل تريد المراسلة عبر القمر الصناعي؟"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"يمكنك إرسال الرسائل واستلامها بدون شبكة الجوّال أو شبكة Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"فتح تطبيق \"الرسائل\""</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 0a4597ec589e..9084407b1c6d 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Tətbiq kontenti güvənlik məsələlərinə görə ekran paylaşımından gizlədildi"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Peykə avtomatik qoşulub"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil və ya Wi-Fi şəbəkəsi olmadan mesaj göndərə və qəbul edə bilərsiniz"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Peyk vasitəsilə mesaj göndərə və qəbul edə, eləcə də məhdud datadan istifadə edə bilərsiniz"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Peyk mesajlaşmasından istifadə edilsin?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Mobil və ya Wi-Fi şəbəkəsi olmadan mesajlar göndərin və qəbul edin"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mesajı 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 5fb744ee2fa9..2abb7f4da9af 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Sadržaj aplikacije je skriven za deljenje sadržaja ekrana zbog bezbednosti"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatski povezano sa satelitom"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete da šaljete i primate poruke bez mobilne ili WiFi mreže"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Možete da šaljete i primate poruke, kao i da koristite ograničenu količinu podataka preko satelita"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Želite da koristite satelitsku razmenu poruka?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Šaljite i primajte poruke bez mobilne ili WiFi mreže"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvori Messages"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 74c0b46a8045..7f57c8747e23 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -2461,8 +2461,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Змесціва праграмы выключана з абагульвання экрана ў мэтах бяспекі"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Аўтаматычна падключана да сістэм спадарожнікавай сувязі"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Вы можаце адпраўляць і атрымліваць паведамленні без доступу да мабільнай сеткі або Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"З дапамогай спадарожнікавай сувязі вы можаце адпраўляць і атрымліваць паведамленні, а таксама выкарыстоўваць абмежаваную колькасць мабільных даных"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Выкарыстоўваць абмен паведамленнямі па спадарожнікавай сувязі?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Вы можаце адпраўляць і атрымліваць паведамленні, калі падключэнне да мабільнай сеткі або сеткі Wi-Fi адсутнічае"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Адкрыць Паведамленні"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index b857fb52b418..6bff361516e5 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Съдържанието на приложението е скрито от функцията за споделяне на екрана от съображения за сигурност"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Автоматично установена връзка със сателит"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Можете да изпращате и получавате съобщения без мобилна или Wi-Fi мрежа"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Можете да изпращате и получавате съобщения и да използвате ограничени данни чрез сателит"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Да се използват ли сателитни съобщения?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Изпращайте и получавайте съобщения без мобилна или Wi-Fi мрежа"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отваряне на Messages"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 8da67849c84d..82d1da312905 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"নিরাপত্তার জন্য স্ক্রিন শেয়ার করা থেকে লুকানো অ্যাপের কন্টেন্ট"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"স্যাটেলাইটের সাথে অটোমেটিক কানেক্ট করা হয়েছে"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"আপনি কোনও মেবাইল বা ওয়াই-ফাই নেটওয়ার্ক ছাড়াই মেসেজ পাঠাতে ও পেতে পারবেন"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"আপনি স্যাটেলাইটের মাধ্যমে মেসেজ পাঠাতে ও পেতে এবং সীমিত ডেটা ব্যবহার করতে পারেন"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"\'স্যাটেলাইট মেসেজিং\' ব্যবহার করবেন?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"কোনও মেবাইল বা ওয়াই-ফাই নেটওয়ার্ক ছাড়াই মেসেজ পাঠান ও রিসিভ করুন"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages খুলুন"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 639972915f76..d055f762858b 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Sadržaj aplikacije je sakriven od dijeljenja ekrana radi sigurnosti"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatski je povezano sa satelitom"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete slati i primati poruke bez mobilne ili WiFi mreže"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Možete slati i primati poruke te koristiti ograničeni prenos podataka putem satelita"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Koristiti satelitsku razmjenu poruka?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Šaljite i primajte poruke bez mobilne ili WiFi mreže"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvorite Messages"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 49d80c25cbfc..2b0e6fca8caa 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Contingut de l\'aplicació amagat de la compartició de pantalla per seguretat"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"S\'ha connectat automàticament a un satèl·lit"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Pots enviar i rebre missatges sense una xarxa mòbil o Wi‑Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Pots enviar i rebre missatges i utilitzar dades limitades per satèl·lit"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Vols utilitzar els missatges per satèl·lit?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Envia i rep missatges sense una xarxa mòbil o Wi‑Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Obre Missatges"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 8b45d72f9131..e8f75f3b957f 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -304,8 +304,7 @@ <string name="notification_channel_network_alerts" msgid="6312366315654526528">"Síťová upozornění"</string> <string name="notification_channel_network_available" msgid="6083697929214165169">"K dispozici je síť"</string> <string name="notification_channel_vpn" msgid="1628529026203808999">"Stav sítě VPN"</string> - <!-- no translation found for notification_channel_system_time (1660313368058030441) --> - <skip /> + <string name="notification_channel_system_time" msgid="1660313368058030441">"Čas a časová pásma"</string> <string name="notification_channel_device_admin" msgid="6384932669406095506">"Upozornění od vašeho administrátora IT"</string> <string name="notification_channel_alerts" msgid="5070241039583668427">"Upozornění"</string> <string name="notification_channel_retail_mode" msgid="3732239154256431213">"Prodejní ukázka"</string> @@ -313,8 +312,7 @@ <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Aplikace je spuštěna"</string> <string name="notification_channel_foreground_service" msgid="7102189948158885178">"Aplikace spotřebovávají baterii"</string> <string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Zvětšení"</string> - <!-- no translation found for notification_channel_accessibility_hearing_device (7816963856388758952) --> - <skip /> + <string name="notification_channel_accessibility_hearing_device" msgid="7816963856388758952">"Naslouchátko"</string> <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Využití přístupnosti"</string> <string name="notification_channel_display" msgid="6905032605735615090">"Displej"</string> <string name="foreground_service_app_in_background" msgid="1439289699671273555">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> využívá baterii"</string> @@ -1412,10 +1410,8 @@ <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"Stáhnout aplikaci"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"Byla vložena nová SIM karta"</string> <string name="carrier_app_notification_text" msgid="6567057546341958637">"Klepnutím zahájíte nastavení"</string> - <!-- no translation found for time_zone_change_notification_title (5232503069219193218) --> - <skip /> - <!-- no translation found for time_zone_change_notification_body (6135793674904665585) --> - <skip /> + <string name="time_zone_change_notification_title" msgid="5232503069219193218">"Vaše časové pásmo se změnilo"</string> + <string name="time_zone_change_notification_body" msgid="6135793674904665585">"Jste v časovém pásmu <xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"Nastavit čas"</string> <string name="date_picker_dialog_title" msgid="5030520449243071926">"Nastavení data"</string> <string name="date_time_set" msgid="4603445265164486816">"Nastavit"</string> @@ -1803,18 +1799,12 @@ <string name="accessibility_gesture_instructional_text" msgid="4133877896011098550">"Funkce se otevře při příštím použití této zkratky. Přejeďte dvěma prsty nahoru ze spodní části obrazovky a rychle je zvedněte."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="1124458279366968154">"Funkce se otevře při příštím použití této zkratky. Přejeďte třemi prsty nahoru ze spodní části obrazovky a rychle je zvedněte."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Zvětšení"</string> - <!-- no translation found for hearing_device_switch_phone_mic_notification_title (6645178038359708836) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_title (4612074852145289569) --> - <skip /> - <!-- no translation found for hearing_device_switch_phone_mic_notification_text (1332426273666077412) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_text (8288368365767284208) --> - <skip /> - <!-- no translation found for hearing_device_notification_switch_button (3619524619430941300) --> - <skip /> - <!-- no translation found for hearing_device_notification_settings_button (6673651052880279178) --> - <skip /> + <string name="hearing_device_switch_phone_mic_notification_title" msgid="6645178038359708836">"Přepnout na mikrofon telefonu?"</string> + <string name="hearing_device_switch_hearing_mic_notification_title" msgid="4612074852145289569">"Přepnout na mikrofon naslouchátka?"</string> + <string name="hearing_device_switch_phone_mic_notification_text" msgid="1332426273666077412">"Pro lepší zvuk, nebo pokud je baterie naslouchátka téměř vybitá. Mikrofon se přepne jen během hovoru."</string> + <string name="hearing_device_switch_hearing_mic_notification_text" msgid="8288368365767284208">"K handsfree telefonování můžete použít mikrofon naslouchátka. Mikrofon se přepne jen během hovoru."</string> + <string name="hearing_device_notification_switch_button" msgid="3619524619430941300">"Přepnout"</string> + <string name="hearing_device_notification_settings_button" msgid="6673651052880279178">"Nastavení"</string> <string name="user_switched" msgid="7249833311585228097">"Aktuální uživatel je <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"Přepínání na uživatele <xliff:g id="NAME">%1$s</xliff:g>…"</string> <string name="user_logging_out_message" msgid="7216437629179710359">"Odhlašování uživatele <xliff:g id="NAME">%1$s</xliff:g>…"</string> @@ -2471,8 +2461,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Obsah aplikace je z bezpečnostních důvodů při sdílení obrazovky skryt"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automaticky připojeno k satelitu"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Zprávy můžete odesílat a přijímat bez mobilní sítě nebo sítě Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Můžete dostávat a odesílat zprávy a používat omezená data přes satelit"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Použít satelitní zprávy?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Odesílejte a přijímejte zprávy bez mobilní sítě nebo Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otevřít Zprávy"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index edd910c9fe6d..288053ee1632 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Af sikkerhedsmæssige årsager vises appindhold ikke ved skærmdeling"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Der blev automatisk oprettet forbindelse til satellit"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan sende og modtage beskeder uden et mobil- eller Wi-Fi-netværk"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Du kan sende og modtage beskeder samt bruge en begrænset mængde data via satellit"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Vil du bruge satellitbeskeder?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Send og modtag beskeder uden et mobil- eller Wi-Fi-netværk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Åbn Beskeder"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 5262da98d277..10659eb7e42e 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Aus Sicherheitsgründen werden bei der Bildschirmfreigabe App-Inhalte ausgeblendet"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatisch mit Satellit verbunden"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kannst Nachrichten ohne Mobilfunknetz oder WLAN senden und empfangen"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Du kannst Nachrichten senden und empfangen und begrenzte Datenmengen per Satellit nutzen"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Nachrichten per Satellit verwenden?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Du kannst ohne Mobilgerät oder WLAN Nachrichten senden und empfangen"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages öffnen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 1d194f4e3b22..77a13ed65700 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Για λόγους ασφάλειας, έγινε απόκρυψη του περιεχομένου της εφαρμογής από την κοινή χρήση οθόνης"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Συνδέθηκε αυτόματα με δορυφόρο"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Μπορείτε να στέλνετε και να λαμβάνετε μηνύματα χωρίς δίκτυο κινητής τηλεφωνίας ή Wi-Fi."</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Μπορείτε να στέλνετε και να λαμβάνετε μηνύματα και να χρησιμοποιείτε περιορισμένα δεδομένα μέσω δορυφόρου"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Χρήση της ανταλλαγής μηνυμάτων μέσω δορυφόρου;"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Αποστολή και λήψη μηνυμάτων χωρίς δίκτυο κινητής τηλεφωνίας ή Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Άνοιγμα Messages"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 75432f8b59a6..667f978701f9 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"App content hidden from screen share for security"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Auto-connected to satellite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"You can send and receive messages and use limited data by satellite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Use satellite messaging?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Send and receive messages without a mobile or Wi-Fi network"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 7d642b71028d..4dcece1eb448 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"App content hidden from screen share for security"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Auto-connected to satellite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"You can send and receive messages and use limited data by satellite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Use satellite messaging?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Send and receive messages without a mobile or Wi-Fi network"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index dd8e69550fff..a1f6f7615aba 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"App content hidden from screen share for security"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Auto-connected to satellite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"You can send and receive messages and use limited data by satellite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Use satellite messaging?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Send and receive messages without a mobile or Wi-Fi network"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 3451d58fe747..f34aa97b424a 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Se ocultó el contenido de la app durante el uso compartido de la pantalla por motivos de seguridad"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Conexión automática a satélite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Puedes enviar y recibir mensajes incluso si no tienes conexión a una red móvil o Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Puedes enviar y recibir mensajes, y usar datos limitados por satélite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"¿Quieres usar la mensajería satelital?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Envía y recibe mensajes sin una red móvil ni Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir Mensajes"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 7b9dd4675800..612d86f14ef8 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Contenido de la aplicación oculto en pantalla compartida por seguridad"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Conectado automáticamente al satélite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Puedes enviar y recibir mensajes sin una red móvil o Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Puedes enviar y recibir mensajes y usar datos limitados por satélite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"¿Usar mensajes por satélite?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Envía y recibe mensajes sin una red móvil ni Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abre Mensajes"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index cf875408ed14..6d5448908b02 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Rakenduse sisu on ekraani jagamisel turvalisuse huvides peidetud"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Satelliidiga loodi automaatselt ühendus"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Teil on võimalik sõnumeid saata ja vastu võtta ilma mobiilside- ja WiFi-võrguta"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Saate sõnumeid vahetada ja kasutada piiratud andmeid satelliidi kaudu"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Kas soovite kasutada satelliidipõhist sõnumsidet?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Sõnumite saatmine ja vastuvõtmine ilma mobiilside- või WiFi-võrguta"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ava rakendus Messages"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 8e689594ea2a..9f62847bb710 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Aplikazioko edukia ezkutatu egin da pantaila partekatzeko eginbidetik, segurtasuna bermatzeko"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatikoki konektatu da satelitera"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Mezuak bidal eta jaso ditzakezu sare mugikorrik edo wifi-sarerik gabe"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Satelite bidez mezuak bidali eta jasotzeko nahiz datuak muga batekin erabiltzeko aukera duzu"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Satelite bidezko mezularitza erabili nahi duzu?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Bidali eta jaso mezuak sare mugikorrik edo wifi-sarerik gabe"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ireki Mezuak"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 9f2c7bb43c69..397e9a3ef5b9 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"بهدلایل امنیتی، محتوای برنامه پساز همرسانی صفحهنمایش پنهان میشود"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"بهطور خودکار به ماهواره متصل شد"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"میتوانید بدون شبکه تلفن همراه یا Wi-Fi پیام ارسال و دریافت کنید"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"ازطریق ماهواره میتوانید پیام ارسال و دریافت کنید و از دادههای محدود استفاده کنید"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"از «پیامرسانی ماهوارهای» استفاده شود؟"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"ارسال و دریافت پیام بدون شبکه تلفن همراه یا Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"باز کردن «پیامنگار»"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 0b65ee2c5403..5da5844cd9c3 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Sovelluksen sisältö piilotettu näytön jakamiselta turvallisuussyistä"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Yhdistetty automaattisesti satelliittiin"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Voit lähettää ja vastaanottaa viestejä ilman mobiili‑ tai Wi-Fi-verkkoa"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Voit lähettää ja vastaanottaa viestejä ja käyttää rajoitetusti dataa satelliitin kautta"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Käytetäänkö satelliittiviestintää?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Lähetä ja vastaanota viestejä ilman mobiili- tai Wi-Fi-verkkoa"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Avaa Messages"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index e9331bb826c4..9d81f4f978bd 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Le contenu de l\'appli est masqué du Partage d\'écran par mesure de sécurité"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Connecté au satellite automatiquement"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Vous pouvez envoyer et recevoir des messages sans avoir recours à un appareil mobile ou à un réseau Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Vous pouvez envoyer et recevoir des messages, et utiliser des données limitées par satellite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Utiliser la messagerie par satellite?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Envoyez et recevez des messages sans réseau cellulaire ou Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ouvrir Messages"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index cbcc961f309a..9ef2758b4eee 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Le contenu de l\'appli est masqué lors du partage d\'écran par mesure de sécurité"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Connecté automatiquement au réseau satellite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Vous pouvez envoyer et recevoir des messages sans connexion au réseau mobile ou Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Vous pouvez envoyer ou recevoir des messages et utiliser une certaine quantité de données par satellite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Utiliser la messagerie par satellite ?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Envoyer et recevoir des messages sans réseau mobile ou Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ouvrir Messages"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 25aac2cd0615..d775f448d2ce 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Por seguranza, ocultouse o contido da aplicación na pantalla compartida"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Conexión automática ao satélite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Podes enviar e recibir mensaxes sen unha rede de telefonía móbil ou wifi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Podes enviar e recibir mensaxes, ademais de usar datos limitados por satélite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Queres usar a mensaxaría por satélite?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Envía e recibe mensaxes sen ter acceso a redes de telefonía móbil ou wifi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir Mensaxes"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index c38768dc3e30..f4d6099fffe8 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"સુરક્ષા માટે સ્ક્રીન શેર કરતી વખતે ઍપનું કન્ટેન્ટ છુપાવેલું છે"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"સેટેલાઇટ સાથે ઑટોમૅટિક રીતે કનેક્ટેડ"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"તમે મોબાઇલ અથવા વાઇ-ફાઇ નેટવર્ક વિના મેસેજ મોકલી અને પ્રાપ્ત કરી શકો છો"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"તમે મેસેજ મોકલી અને પ્રાપ્ત કરી શકો છો અને સૅટલાઇટ દ્વારા મર્યાદિત ડેટાનો ઉપયોગ કરી શકો છો"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"શું સૅટલાઇટ મેસેજિંગનો ઉપયોગ કરીએ?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"મોબાઇલ કે વાઇ-ફાઇ નેટવર્ક વિના મેસેજ મોકલો અને મેળવો"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ખોલો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 6199c806d5e2..d750b39a0e41 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -291,7 +291,7 @@ <string name="status_bar_notification_info_overflow" msgid="3330152558746563475">"999+"</string> <string name="notification_compact_heads_up_reply" msgid="2425293958371284340">"जवाब दें"</string> <string name="notification_hidden_text" msgid="2835519769868187223">"नई सूचना"</string> - <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"सामान्य कीबोर्ड"</string> + <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"फ़िज़िकल कीबोर्ड"</string> <string name="notification_channel_security" msgid="8516754650348238057">"सुरक्षा"</string> <string name="notification_channel_car_mode" msgid="2123919247040988436">"कार मोड"</string> <string name="notification_channel_account" msgid="6436294521740148173">"खाते की स्थिति"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 5b3dc7c86658..b5fc19a3e961 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Sadržaj aplikacije sakriven je od dijeljenja zaslona radi sigurnosti"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatski povezano sa satelitom"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete slati i primati poruke bez mobilne mreže ili Wi-Fi mreže"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Možete slati i primati poruke te koristiti ograničene podatke putem satelita"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Želite li slati poruke putem satelita?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Šaljite i primajte poruke kad nije dostupna mobilna ili Wi-Fi mreža"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvori Poruke"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 117509955341..f42567ed1fe6 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Apptartalom elrejtve a megosztástól a biztonság érdekében"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatikusan csatlakozva a műholdhoz"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Küldhet és fogadhat üzeneteket mobil- és Wi-Fi-hálózat nélkül is"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Küldhet és fogadhat üzeneteket, valamint korlátozott mennyiségű adatot használhat műholdon keresztül"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Műholdas üzenetváltást szeretne használni?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Küldhet és fogadhat üzeneteket mobil- és Wi-Fi-hálózat nélkül is"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"A Messages megnyitása"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index c89544823314..e3fa611ce135 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Անվտանգության նկատառումներով՝ բովանդակությունը թաքցվել է ցուցադրումից"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Ավտոմատ միացել է արբանյակին"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Դուք կարող եք հաղորդագրություններ ուղարկել և ստանալ առանց բջջային կամ Wi-Fi կապի"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Դուք կարող եք արբանյակի միջոցով ուղարկել և ստանալ հաղորդագրություններ և օգտագործել սահմանափակ ծավալի ինտերնետ թրաֆիկ"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Օգտագործե՞լ արբանյակային հաղորդագրումը"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Ուղարկեք և ստացեք հաղորդագրություններ առանց բջջային կամ Wi-Fi ցանցի"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Բացել Messages-ը"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 26a79e0b53a9..5f60ba2de8e4 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Konten aplikasi disembunyikan dari berbagi layar karena alasan keamanan"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Menghubungkan otomatis ke satelit"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Anda dapat mengirim dan menerima pesan tanpa jaringan seluler atau Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Anda dapat mengirim dan menerima pesan serta menggunakan data terbatas melalui satelit"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Gunakan fitur pesan satelit?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Mengirim dan menerima pesan tanpa jaringan seluler atau Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Buka Message"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index f6d043b170ed..92567427b0b9 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Efni forrits falið í skjádeilingu af öryggisástæðum"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Tengdist sjálfkrafa við gervihnött"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Þú getur sent og móttekið skilaboð án tengingar við farsímakerfi eða Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Þú getur sent og móttekið skilaboð og notað takmörkuð gögn gegnum gervihnött"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Nota skilaboð í gegnum gervihnött?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Senda og fá skilaboð án tengingar við farsímakerfi eða Wi-Fi-net"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Opna Messages"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 96075003f0b2..34b179fae4ed 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Contenuti dell\'app nascosti dalla condivisione schermo per sicurezza"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Connessione automatica al satellite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Puoi inviare e ricevere messaggi senza una rete mobile o Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Puoi inviare e ricevere messaggi e utilizzare dati limitati via satellite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Utilizzare i messaggi via satellite?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Invia e ricevi messaggi senza una rete mobile o Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Apri Messaggi"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index d25cf01602e4..ffca8688ac51 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -303,8 +303,7 @@ <string name="notification_channel_network_alerts" msgid="6312366315654526528">"התראות רשת"</string> <string name="notification_channel_network_available" msgid="6083697929214165169">"יש רשת זמינה"</string> <string name="notification_channel_vpn" msgid="1628529026203808999">"סטטוס ה-VPN"</string> - <!-- no translation found for notification_channel_system_time (1660313368058030441) --> - <skip /> + <string name="notification_channel_system_time" msgid="1660313368058030441">"זמן ואזורי זמן"</string> <string name="notification_channel_device_admin" msgid="6384932669406095506">"התראות ממנהל ה-IT"</string> <string name="notification_channel_alerts" msgid="5070241039583668427">"התראות"</string> <string name="notification_channel_retail_mode" msgid="3732239154256431213">"הדגמה לקמעונאים"</string> @@ -312,8 +311,7 @@ <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"אפליקציה פועלת"</string> <string name="notification_channel_foreground_service" msgid="7102189948158885178">"אפליקציות שמרוקנות את הסוללה"</string> <string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"הגדלה"</string> - <!-- no translation found for notification_channel_accessibility_hearing_device (7816963856388758952) --> - <skip /> + <string name="notification_channel_accessibility_hearing_device" msgid="7816963856388758952">"מכשיר שמיעה"</string> <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"שימוש בנגישות"</string> <string name="notification_channel_display" msgid="6905032605735615090">"מסך"</string> <string name="foreground_service_app_in_background" msgid="1439289699671273555">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> משתמשת בסוללה"</string> @@ -1411,10 +1409,8 @@ <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"להורדת האפליקציה"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"ה-SIM החדש הוכנס"</string> <string name="carrier_app_notification_text" msgid="6567057546341958637">"יש ללחוץ כדי להגדיר"</string> - <!-- no translation found for time_zone_change_notification_title (5232503069219193218) --> - <skip /> - <!-- no translation found for time_zone_change_notification_body (6135793674904665585) --> - <skip /> + <string name="time_zone_change_notification_title" msgid="5232503069219193218">"אזור הזמן שלך השתנה"</string> + <string name="time_zone_change_notification_body" msgid="6135793674904665585">"אזור הזמן הנוכחי שלך הוא <xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"הגדרת שעה"</string> <string name="date_picker_dialog_title" msgid="5030520449243071926">"הגדרת תאריך"</string> <string name="date_time_set" msgid="4603445265164486816">"הגדרה"</string> @@ -1463,7 +1459,7 @@ <string name="select_input_method" msgid="3971267998568587025">"בחירה של שיטת הזנה"</string> <string name="input_method_language_settings" msgid="8069089418056819437">"הגדרות שפה"</string> <string name="show_ime" msgid="6406112007347443383">"להשאיר במסך בזמן שהמקלדת הפיזית פעילה"</string> - <string name="hardware" msgid="3611039921284836033">"שימוש במקלדת שמופיעה במסך"</string> + <string name="hardware" msgid="3611039921284836033">"שימוש במקלדת הווירטואלית"</string> <string name="select_keyboard_layout_notification_title" msgid="5823199895322205589">"הגדרה של <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="select_multiple_keyboards_layout_notification_title" msgid="6999491025126641938">"הגדרת מקלדות פיזיות"</string> <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"יש ללחוץ כדי לבחור שפה ופריסה"</string> @@ -1802,18 +1798,12 @@ <string name="accessibility_gesture_instructional_text" msgid="4133877896011098550">"התכונה תיפתח בפעם הבאה שייעשה שימוש במקש הקיצור הזה. צריך להחליק למעלה עם 2 אצבעות מהחלק התחתון של המסך ולשחרר במהירות."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="1124458279366968154">"התכונה תיפתח בפעם הבאה שייעשה שימוש במקש הקיצור הזה. צריך להחליק למעלה עם 3 אצבעות מהחלק התחתון של המסך ולשחרר במהירות."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"הגדלה"</string> - <!-- no translation found for hearing_device_switch_phone_mic_notification_title (6645178038359708836) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_title (4612074852145289569) --> - <skip /> - <!-- no translation found for hearing_device_switch_phone_mic_notification_text (1332426273666077412) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_text (8288368365767284208) --> - <skip /> - <!-- no translation found for hearing_device_notification_switch_button (3619524619430941300) --> - <skip /> - <!-- no translation found for hearing_device_notification_settings_button (6673651052880279178) --> - <skip /> + <string name="hearing_device_switch_phone_mic_notification_title" msgid="6645178038359708836">"להחליף למיקרופון של הטלפון?"</string> + <string name="hearing_device_switch_hearing_mic_notification_title" msgid="4612074852145289569">"להחליף למיקרופון של מכשיר השמיעה?"</string> + <string name="hearing_device_switch_phone_mic_notification_text" msgid="1332426273666077412">"כדי לשמוע טוב יותר או אם הסוללה של מכשיר השמיעה נחלשת. במצב הזה המיקרופון מוחלף רק במהלך השיחה."</string> + <string name="hearing_device_switch_hearing_mic_notification_text" msgid="8288368365767284208">"אפשר לשוחח במצב דיבורית באמצעות המיקרופון של מכשיר השמיעה. במצב הזה המיקרופון מוחלף רק במהלך השיחה."</string> + <string name="hearing_device_notification_switch_button" msgid="3619524619430941300">"החלפה"</string> + <string name="hearing_device_notification_settings_button" msgid="6673651052880279178">"הגדרות"</string> <string name="user_switched" msgid="7249833311585228097">"המשתמש הנוכחי <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"מעבר אל <xliff:g id="NAME">%1$s</xliff:g>…"</string> <string name="user_logging_out_message" msgid="7216437629179710359">"מתבצע ניתוק של <xliff:g id="NAME">%1$s</xliff:g>…"</string> @@ -2470,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"תוכן האפליקציה מוסתר משיתוף המסך מטעמי אבטחה"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"חיבור אוטומטי ללוויין"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"אפשר לשלוח ולקבל הודעות ללא רשת סלולרית או רשת Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"אפשר לשלוח ולקבל הודעות ולהשתמש בחבילת הגלישה באופן מוגבל באמצעות לוויין"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"רוצה לשלוח הודעות באמצעות תקשורת לוויינית?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"אפשר לשלוח ולקבל הודעות ללא רשת סלולרית או Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"לפתיחת Messages"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index e1fd8d1a8d82..3f3881b0d598 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Қауіпсіздік мақсатында қолданба контенті экранды көрсету кезінде жасырылды."</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Жерсерік қызметіне автоматты түрде қосылды"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Мобильдік не Wi-Fi желісіне қосылмастан хабар жібере аласыз және ала аласыз."</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Жерсерік арқылы хабар жіберуге және алуға, деректерді шектеулі көлемде пайдалануға болады."</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Жерсерік арқылы хабар алмасасыз ба?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Хабарландыруларды мобильдік желіге немесе Wi-Fi желісіне қосылмай жіберіңіз және алыңыз."</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages қолданбасын ашу"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 190693976be1..0ad4f09d1cfa 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"បានលាក់ខ្លឹមសារកម្មវិធីពីការបង្ហាញអេក្រង់ដើម្បីសុវត្ថិភាព"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"ភ្ជាប់ដោយស្វ័យប្រវត្តិទៅផ្កាយរណប"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"អ្នកអាចផ្ញើ និងទទួលសារដោយមិនប្រើបណ្តាញទូរសព្ទចល័ត ឬ Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"អ្នកអាចផ្ញើ និងទទួលសារ ព្រមទាំងប្រើទិន្នន័យមានកំណត់តាមរយៈផ្កាយរណប"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"ប្រើការផ្ញើសារតាមផ្កាយរណបឬ?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"ផ្ញើ និងទទួលសារដោយគ្មានបណ្ដាញ Wi-Fi ឬបណ្ដាញទូរសព្ទចល័ត"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"បើកកម្មវិធី Messages"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 9c11160f502d..c65dd276be8d 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"ಭದ್ರತೆಗಾಗಿ ಸ್ಕ್ರೀನ್ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯಲ್ಲಿ ಆ್ಯಪ್ ಕಂಟೆಂಟ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"ಸ್ಯಾಟಲೈಟ್ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"ನೀವು ಮೊಬೈಲ್ ಅಥವಾ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ ಇಲ್ಲದೆಯೇ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಮತ್ತು ಸ್ವೀಕರಿಸಬಹುದು"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"ನೀವು ಸ್ಯಾಟಲೈಟ್ ಮೂಲಕ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಮತ್ತು ಸ್ವೀಕರಿಸಬಹುದು ಹಾಗೂ ಸೀಮಿತ ಡೇಟಾವನ್ನು ಬಳಸಬಹುದು"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"ಸ್ಯಾಟಲೈಟ್ ಮೆಸೇಜಿಂಗ್ ಅನ್ನು ಬಳಸಬೇಕೆ?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"ಮೊಬೈಲ್ ಅಥವಾ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ ಇಲ್ಲದೆಯೇ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ಸ್ವೀಕರಿಸಿ"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ಅನ್ನು ತೆರೆಯಿರಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 1b302e633fa7..a52da3c6b91e 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"보안을 위해 화면 공유에서 앱 콘텐츠가 숨겨집니다."</string> <string name="satellite_notification_title" msgid="4026338973463121526">"위성에 자동 연결됨"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"모바일 또는 Wi-Fi 네트워크 없이 메시지를 주고 받을 수 있습니다"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"위성으로 메시지를 주고받을 수 있으며 데이터를 제한적으로 사용할 수도 있습니다."</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"위성 메시지를 사용하시겠습니까?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"모바일 또는 Wi-Fi 네트워크 없이 메시지 주고받기"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"메시지 열기"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 58a6d8486caf..ff743fc42bd3 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Коопсуздук үчүн колдонмодогу контент бөлүшүлгөн экрандан жашырылды"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Спутникке автоматтык түрдө туташтырылган"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Сиз мобилдик же Wi-Fi тармагы жок эле билдирүүлөрдү жөнөтүп, ала аласыз"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Спутник аркылуу билдирүүлөрдү жөнөтүп жана алып, чектелген трафикти колдоно аласыз"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Спутник аркылуу байланышасызбы?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Мобилдик же Wi-Fi тармагына туташпай эле билдирүүлөрдү жөнөтүп, алыңыз"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Жазышуулар колдонмосун ачуу"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 3c3c58ba281a..6f32d875c2c8 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"ເນື້ອຫາແອັບຖືກເຊື່ອງໄວ້ຈາກການແບ່ງປັນໜ້າຈໍເພື່ອຄວາມປອດໄພ"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"ເຊື່ອມຕໍ່ກັບດາວທຽມໂດຍອັດຕະໂນມັດ"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"ທ່ານສາມາດສົ່ງ ແລະ ຮັບຂໍ້ຄວາມໂດຍບໍ່ຕ້ອງໃຊ້ເຄືອຂ່າຍມືຖື ຫຼື Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"ທ່ານສາມາດສົ່ງ ແລະ ຮັບຂໍ້ຄວາມ ແລະ ໃຊ້ຂໍ້ມູນທີ່ບໍ່ຈໍາກັດຜ່ານດາວທຽມ"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"ໃຊ້ການຮັບສົ່ງຂໍ້ຄວາມຜ່ານດາວທຽມບໍ?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"ຮັບ ແລະ ສົ່ງຂໍ້ຄວາມໂດຍບໍ່ຕ້ອງໃຊ້ເຄືອຂ່າຍໂທລະສັບມືຖື ຫຼື Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"ເປີດ Messages"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3c56808d883e..1035fed764f4 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -2461,8 +2461,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Programos turinys paslėptas bendrinant ekraną saugumo sumetimais"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatiškai prisijungta prie palydovinio ryšio"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Galite siųsti ir gauti pranešimus be mobiliojo ryšio ar „Wi-Fi“ tinklo"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Galite siųsti ir gauti pranešimus bei naudoti ribotus duomenis per palydovą"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Naudoti susirašinėjimą palydoviniais pranešimais?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Siųskite ir gaukite pranešimus be mobiliojo ryšio ar „Wi-Fi“ tinklo"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Atidaryti programą „Messages“"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 1870883fcc5e..a643b9861312 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Drošības nolūkos lietotnes saturs kopīgotajā ekrānā ir paslēpts"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automātiski izveidots savienojums ar satelītu"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Varat sūtīt un saņemt ziņojumus bez mobilā vai Wi-Fi tīkla."</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Varat sūtīt un saņemt ziņojumus un izmantot ierobežotu datu apjomu, lietojot satelītu."</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Vai izmantot satelīta ziņojumapmaiņu?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Sūtiet un saņemiet ziņojumus bez mobilā vai Wi‑Fi tīkla."</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Atvērt lietotni Ziņojumi"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 1c9e022ca3aa..774e4edc1cd6 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Од безбедносни причини, содржините на апликацијата се скриени од споделувањето екран"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Поврзано со сателит автоматски"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Може да испраќате и примате пораки без мобилна или Wi-Fi мрежа"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Може да испраќате и да примате пораки и да користите ограничен интернет преку сателит"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Да се користи „Сателитска размена на пораки“?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Испраќајте и примајте пораки без мобилна или Wi-Fi мрежа"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отворете ја Messages"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index e70a95ce77d2..9dbfc1e58e89 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Аюулгүй байдлын үүднээс аппын контентыг дэлгэц хуваалцахаас нуусан"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Хиймэл дагуулд автоматаар холбогдсон"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Та мобайл эсвэл Wi-Fi сүлжээгүйгээр мессеж илгээх болон хүлээн авах боломжтой"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Та хиймэл дагуулаар мессеж илгээх, хүлээн авах, хязгаарлагдмал дата ашиглах боломжтой"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Хиймэл дагуулаар дамжин мессеж бичихийг ашиглах уу?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Хөдөлгөөнт холбооны эсвэл Wi-Fi сүлжээгүйгээр мессеж илгээх болон хүлээн авах"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Мессежийг нээх"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index cbe6b979d1d8..750988a242b7 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"स्क्रीन शेअर करताना सुरक्षेसाठी अॅपमधील आशय लपवला आहे"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"उपग्रहाशी आपोआप कनेक्ट केलेले आहे"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"तुम्ही मोबाइल किंवा वाय-फाय नेटवर्कशिवाय मेसेज पाठवू आणि मिळवू शकता"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"तुम्ही उपग्रहाद्वारे मेसेज पाठवू आणि मिळवू शकता व मर्यादित डेटा वापरू शकता"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"सॅटेलाइट मेसेजिंग वापरायचे आहे का?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"मोबाइल किंवा वाय-फाय नेटवर्कशिवाय मेसेज पाठवणे आणि मिळवणे"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages उघडा"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 432f7f9c6aa0..76086336514f 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"လုံခြုံရေးအတွက် အက်ပ်အကြောင်းအရာကို ဖန်သားပြင် မျှဝေခြင်းတွင် ဖျောက်ထားသည်"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"ဂြိုဟ်တုနှင့် အလိုအလျောက် ချိတ်ဆက်ထားသည်"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"မိုဘိုင်း (သို့) Wi-Fi ကွန်ရက်မရှိဘဲ မက်ဆေ့ဂျ်များကို ပို့နိုင်၊ လက်ခံနိုင်သည်"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"ဂြိုဟ်တုဖြင့် မက်ဆေ့ဂျ်များ ပေးပို့လက်ခံနိုင်ပြီး အကန့်အသတ်ဖြင့် ဒေတာသုံးနိုင်သည်"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"ဂြိုဟ်တုမှတစ်ဆင့် မက်ဆေ့ဂျ်ပို့ခြင်း သုံးမလား။"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"မိုဘိုင်း (သို့) Wi-Fi ကွန်ရက်မရှိဘဲ မက်ဆေ့ဂျ်များ ပို့နိုင်၊ လက်ခံနိုင်သည်"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ဖွင့်ရန်"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index c80a9605fcde..6bd4598709e6 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Av sikkerhetsgrunner er appinnholdet skjult for skjermdelingen"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatisk tilkoblet satellitt"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan sende og motta meldinger uten mobil- eller wifi-nettverk"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Du kan sende og motta meldinger og bruke begrensede data via satellitt"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Vil du bruke satellittmeldinger?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Send og motta meldinger uten mobil- eller wifi-nettverk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Åpne Meldinger"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index bf7bbaf872be..b94c2f618d6b 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"स्क्रिन सेयर गर्दा सुरक्षाका लागि एपमा भएको सामग्री लुकाइएको छ"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"स्याटलाइटमा स्वतः कनेक्ट गरियो"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"तपाईं मोबाइल वा Wi-Fi नेटवर्कविनै म्यासेज पठाउन र प्राप्त गर्न सक्नुहुन्छ"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"तपाईं स्याटलाइटमार्फत म्यासेजहरू पठाउन तथा प्राप्त गर्न र सीमित डेटा प्रयोग गर्न सक्नुहुन्छ"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"स्याटलाइटमार्फत म्यासेज पठाउने सुविधा प्रयोग गर्ने हो?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"मोबाइल वा Wi-Fi नेटवर्कविनै म्यासेजहरू पठाउनुहोस् र प्राप्त गर्नुहोस्"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages खोल्नुहोस्"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 695a706dcdb4..52d9106cebfd 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Vanwege beveiligingsrisico\'s is app-content verborgen voor scherm delen"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatisch verbonden met satelliet"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Je kunt berichten sturen en krijgen zonder een mobiel of wifi-netwerk"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Je kunt berichten sturen en krijgen en beperkte data via satelliet gebruiken"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Satellietberichten gebruiken?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Stuur en krijg berichten zonder mobiel of wifi-netwerk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Berichten openen"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index de95a033ec20..ba2560f66ae5 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1408,7 +1408,7 @@ <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"ଆପ୍ ଡାଉନଲୋଡ କରନ୍ତୁ"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"ନୂଆ SIM କାର୍ଡ ଭର୍ତ୍ତି କରାଗଲା"</string> <string name="carrier_app_notification_text" msgid="6567057546341958637">"ଏହା ସେଟଅପ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string> - <string name="time_zone_change_notification_title" msgid="5232503069219193218">"ଆପଣଙ୍କର ଟାଇମ ଜୋନ ବଦଳିଛି"</string> + <string name="time_zone_change_notification_title" msgid="5232503069219193218">"ଆପଣଙ୍କ ଟାଇମ ଜୋନ ପରିବର୍ତ୍ତନ ହୋଇଛି"</string> <string name="time_zone_change_notification_body" msgid="6135793674904665585">"ଆପଣ ବର୍ତ୍ତମାନ <xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)ରେ ଅଛନ୍ତି"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"ସମୟ ସେଟ୍ କରନ୍ତୁ"</string> <string name="date_picker_dialog_title" msgid="5030520449243071926">"ତାରିଖ ସେଟ୍ କରନ୍ତୁ"</string> @@ -1799,9 +1799,9 @@ <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ମେଗ୍ନିଫିକେସନ"</string> <string name="hearing_device_switch_phone_mic_notification_title" msgid="6645178038359708836">"ଫୋନ ମାଇକକୁ ସୁଇଚ କରିବେ?"</string> <string name="hearing_device_switch_hearing_mic_notification_title" msgid="4612074852145289569">"ଶ୍ରବଣ ଯନ୍ତ୍ର ମାଇକକୁ ସୁଇଚ କରିବେ?"</string> - <string name="hearing_device_switch_phone_mic_notification_text" msgid="1332426273666077412">"ଭଲ ସାଉଣ୍ଡ ପାଇଁ କିମ୍ବା ଯଦି ଆପଣଙ୍କର ଶ୍ରବଣ ଯନ୍ତ୍ର ବ୍ୟାଟେରୀ କମ ଥିଲେ। କଲ ସମୟରେ ଏହା କେବଳ ଆପଣଙ୍କର ମାଇକ ସୁଇଚ କରିଥାଏ।"</string> - <string name="hearing_device_switch_hearing_mic_notification_text" msgid="8288368365767284208">"ହେଣ୍ଡସ-ଫ୍ରି କଲିଂ ପାଇଁ ଆପଣ ଆପଣଙ୍କର ଶ୍ରବଣ ଯନ୍ତ୍ର ମାଇକ୍ରୋଫୋନ ବ୍ୟବହାର କରିପାରିବେ। କଲ ସମୟରେ ଏହା କେବଳ ଆପଣଙ୍କର ମାଇକ ସୁଇଚ କରିଥାଏ।"</string> - <string name="hearing_device_notification_switch_button" msgid="3619524619430941300">"ସ୍ୱିଚ କରନ୍ତୁ"</string> + <string name="hearing_device_switch_phone_mic_notification_text" msgid="1332426273666077412">"ଭଲ ସାଉଣ୍ଡ ପାଇଁ କିମ୍ବା ଯଦି ଆପଣଙ୍କର ଶ୍ରବଣ ଯନ୍ତ୍ର ବେଟେରୀ କମ ଥିଲେ। କଲ ସମୟରେ ଏହା କେବଳ ଆପଣଙ୍କର ମାଇକକୁ ସୁଇଚ କରିଥାଏ।"</string> + <string name="hearing_device_switch_hearing_mic_notification_text" msgid="8288368365767284208">"ହେଣ୍ଡସ-ଫ୍ରି କଲିଂ ପାଇଁ ଆପଣ ଆପଣଙ୍କର ଶ୍ରବଣ ଯନ୍ତ୍ର ମାଇକ୍ରୋଫୋନ ବ୍ୟବହାର କରିପାରିବେ। କଲ ସମୟରେ ଏହା କେବଳ ଆପଣଙ୍କର ମାଇକକୁ ସୁଇଚ କରିଥାଏ।"</string> + <string name="hearing_device_notification_switch_button" msgid="3619524619430941300">"ସୁଇଚ କରନ୍ତୁ"</string> <string name="hearing_device_notification_settings_button" msgid="6673651052880279178">"ସେଟିଂସ"</string> <string name="user_switched" msgid="7249833311585228097">"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="NAME">%1$s</xliff:g>।"</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g>ରେ ସ୍ୱିଚ କରନ୍ତୁ…"</string> @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"ସୁରକ୍ଷା ପାଇଁ ସ୍କ୍ରିନ ସେୟାରରୁ ଆପ ବିଷୟବସ୍ତୁକୁ ଲୁଚାଯାଇଛି"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"ସାଟେଲାଇଟ ସହ ସ୍ୱତଃ କନେକ୍ଟ ହୋଇଛି"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"ଏକ ମୋବାଇଲ କିମ୍ବା ୱାଇ-ଫାଇ ନେଟୱାର୍କ ବିନା ଆପଣ ମେସେଜ ପଠାଇପାରିବେ ଏବଂ ପାଇପାରିବେ"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"ସେଟେଲାଇଟ ମାଧ୍ୟମରେ ଆପଣ ମେସେଜ ପଠାଇପାରିବେ ଓ ପାଇପାରିବେ ଏବଂ ସୀମିତ ଡାଟା ବ୍ୟବହାର କରିପାରିବେ"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"ସେଟେଲାଇଟ ମେସେଜିଂକୁ ବ୍ୟବହାର କରିବେ?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"ଏକ ମୋବାଇଲ କିମ୍ବା ୱାଇ-ଫାଇ ନେଟୱାର୍କ ବିନା ମେସେଜ ପଠାନ୍ତୁ ଏବଂ ପାଆନ୍ତୁ"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ଖୋଲନ୍ତୁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 4d4b10bb25db..2d2f9c01a4c3 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"ਐਪ ਸਮੱਗਰੀ ਨੂੰ ਸੁਰੱਖਿਆ ਲਈ ਸਕ੍ਰੀਨ ਸਾਂਝਾਕਰਨ ਤੋਂ ਲੁਕਾਇਆ ਗਿਆ ਹੈ"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"ਸੈਟੇਲਾਈਟ ਨਾਲ ਸਵੈ-ਕਨੈਕਟ ਹੋਇਆ"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"ਤੁਸੀਂ ਮੋਬਾਈਲ ਜਾਂ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੋਂ ਬਿਨਾਂ ਸੁਨੇਹੇ ਭੇਜ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"ਤੁਸੀਂ ਸੁਨੇਹੇ ਭੇਜ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਸੈਟੇਲਾਈਟ ਰਾਹੀਂ ਸੀਮਤ ਡਾਟਾ ਵਰਤ ਸਕਦੇ ਹੋ"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"ਕੀ ਸੈਟੇਲਾਈਟ ਸੁਨੇਹੇ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"ਮੋਬਾਈਲ ਜਾਂ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੋਂ ਬਿਨਾਂ ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰੋ"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ਐਪ ਖੋਲ੍ਹੋ"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index cc4b251c7713..91c7adc58eb3 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Conteúdo oculto no compartilhamento de tela por segurança"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Conectado automaticamente ao satélite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Você pode enviar e receber mensagens sem um dispositivo móvel ou uma rede Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"É possível enviar e receber mensagens e usar dados limitados via satélite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Usar mensagens via satélite?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Enviar e receber mensagens sem uma rede móvel ou Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir o app Mensagens"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index cc4b251c7713..91c7adc58eb3 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Conteúdo oculto no compartilhamento de tela por segurança"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Conectado automaticamente ao satélite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Você pode enviar e receber mensagens sem um dispositivo móvel ou uma rede Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"É possível enviar e receber mensagens e usar dados limitados via satélite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Usar mensagens via satélite?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Enviar e receber mensagens sem uma rede móvel ou Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir o app Mensagens"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 25b0471347c9..0fcd12bfbc01 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Conținutul aplicației este ascuns de permiterea accesului la ecran din motive de securitate"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"S-a conectat automat la satelit"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Poți să trimiți și să primești mesaje fără o rețea mobilă sau Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Poți să trimiți și să primești mesaje și să folosești date limitate prin satelit"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Folosești mesajele prin satelit?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Trimite și primește mesaje fără o rețea mobilă sau Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Deschide Mesaje"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 1efa10593edc..85177030d45a 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -2461,8 +2461,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Для безопасности содержимое приложения при демонстрации экрана скрыто."</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Автоматически подключено к системам спутниковой связи"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Вы можете отправлять и получать сообщения без доступа к мобильной сети или Wi-Fi."</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Вы можете обмениваться сообщениями и использовать ограниченный объем трафика по спутниковой связи."</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Включить спутниковый обмен сообщениями?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Отправляйте и получайте сообщения без подключения к мобильной сети или Wi-Fi."</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Открыть Сообщения"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 57f89a230384..863f0cc18ff8 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -302,8 +302,7 @@ <string name="notification_channel_network_alerts" msgid="6312366315654526528">"ජාල ඇඟවීම්"</string> <string name="notification_channel_network_available" msgid="6083697929214165169">"ජාලය ලබා ගැනීමට හැකිය"</string> <string name="notification_channel_vpn" msgid="1628529026203808999">"VPN තත්ත්වය"</string> - <!-- no translation found for notification_channel_system_time (1660313368058030441) --> - <skip /> + <string name="notification_channel_system_time" msgid="1660313368058030441">"වේලාව සහ කාල කලාප"</string> <string name="notification_channel_device_admin" msgid="6384932669406095506">"ඔබේ තොරතුරු තාක්ෂණ පරිපාලක වෙතින් ඇඟවීම්"</string> <string name="notification_channel_alerts" msgid="5070241039583668427">"ඇඟවීම්"</string> <string name="notification_channel_retail_mode" msgid="3732239154256431213">"සිල්ලර ආදර්ශනය"</string> @@ -311,8 +310,7 @@ <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"යෙදුම ධාවනය කරමින්"</string> <string name="notification_channel_foreground_service" msgid="7102189948158885178">"බැටරිය භාවිත කරන යෙදුම්"</string> <string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"විශාලනය"</string> - <!-- no translation found for notification_channel_accessibility_hearing_device (7816963856388758952) --> - <skip /> + <string name="notification_channel_accessibility_hearing_device" msgid="7816963856388758952">"ශ්රවණ උපාංගය"</string> <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"ප්රවේශ්යතා භාවිතය"</string> <string name="notification_channel_display" msgid="6905032605735615090">"සංදර්ශකය"</string> <string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> බැටරිය භාවිත කරයි"</string> @@ -1410,10 +1408,8 @@ <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"යෙදුම බාගන්න"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"නව SIM ඇතුළු කරන්න"</string> <string name="carrier_app_notification_text" msgid="6567057546341958637">"එය පිහිටුවීමට තට්ටු කරන්න"</string> - <!-- no translation found for time_zone_change_notification_title (5232503069219193218) --> - <skip /> - <!-- no translation found for time_zone_change_notification_body (6135793674904665585) --> - <skip /> + <string name="time_zone_change_notification_title" msgid="5232503069219193218">"ඔබේ වේලා කලාපය වෙනස් විය"</string> + <string name="time_zone_change_notification_body" msgid="6135793674904665585">"ඔබ දැන් <xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>) හි වේ"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"වේලාව සකසන්න"</string> <string name="date_picker_dialog_title" msgid="5030520449243071926">"දිනය සැකසීම"</string> <string name="date_time_set" msgid="4603445265164486816">"සකසන්න"</string> @@ -1801,18 +1797,12 @@ <string name="accessibility_gesture_instructional_text" msgid="4133877896011098550">"ඔබ මෙම කෙටිමඟ භාවිතා කරන මීළඟ වතාවේ විශේෂාංගය විවෘත වනු ඇත. ඔබේ තිරයෙහි පහළ සිට ඇඟිලි 2කින් ඉහළට ස්වයිප් කර ඉක්මනින් නිදහස් කරන්න."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="1124458279366968154">"ඔබ මෙම කෙටිමඟ භාවිතා කරන මීළඟ වතාවේ විශේෂාංගය විවෘත වනු ඇත. ඔබේ තිරයෙහි පහළ සිට ඇඟිලි 3කින් ඉහළට ස්වයිප් කර ඉක්මනින් නිදහස් කරන්න."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"විශාලනය"</string> - <!-- no translation found for hearing_device_switch_phone_mic_notification_title (6645178038359708836) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_title (4612074852145289569) --> - <skip /> - <!-- no translation found for hearing_device_switch_phone_mic_notification_text (1332426273666077412) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_text (8288368365767284208) --> - <skip /> - <!-- no translation found for hearing_device_notification_switch_button (3619524619430941300) --> - <skip /> - <!-- no translation found for hearing_device_notification_settings_button (6673651052880279178) --> - <skip /> + <string name="hearing_device_switch_phone_mic_notification_title" msgid="6645178038359708836">"දුරකථන මයික්රෆෝනයට මාරු වෙන්න ද?"</string> + <string name="hearing_device_switch_hearing_mic_notification_title" msgid="4612074852145289569">"ශ්රවණාධාර මයික්රෆෝනයට මාරු වෙන්න ද?"</string> + <string name="hearing_device_switch_phone_mic_notification_text" msgid="1332426273666077412">"වඩා හොඳ ශබ්දයක් සඳහා හෝ ඔබේ ශ්රවණාධාර බැටරිය අඩු නම්. මෙය ඇමතුම අතරතුර පමණක් ඔබේ මයික්රෆෝනය මාරු කරයි."</string> + <string name="hearing_device_switch_hearing_mic_notification_text" msgid="8288368365767284208">"දෑත් නොයොදන ඇමතුම් සඳහා ඔබට ඔබේ ශ්රවණාධාර මයික්රෆෝනය භාවිතා කළ හැක. මෙය ඇමතුම අතරතුර පමණක් ඔබේ මයික්රෆෝනය මාරු කරයි."</string> + <string name="hearing_device_notification_switch_button" msgid="3619524619430941300">"මාරු කරන්න"</string> + <string name="hearing_device_notification_settings_button" msgid="6673651052880279178">"සැකසීම්"</string> <string name="user_switched" msgid="7249833311585228097">"දැනට සිටින පරිශීලකයා <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> වෙත මාරු කරමින්…"</string> <string name="user_logging_out_message" msgid="7216437629179710359">"<xliff:g id="NAME">%1$s</xliff:g> වරමින්…"</string> @@ -2469,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"ආරක්ෂාව සඳහා යෙදුම් අන්තර්ගතය තිරය බෙදා ගැනීමෙන් සඟවා ඇත"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"චන්ද්රිකාවට ස්වයංක්රීයව සම්බන්ධ වේ"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"ඔබට ජංගම හෝ Wi-Fi ජාලයක් නොමැතිව පණිවිඩ යැවීමට සහ ලැබීමට හැක"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"ඔබට චන්ද්රිකා භාවිතයෙන් පණිවිඩ යැවීමට සහ ලැබීමට සහ සීමිත දත්ත භාවිතා කිරීමට හැක"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"චන්ද්රිකා පණිවිඩ යැවීම භාවිතා කරන්න ද?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"ජංගම හෝ Wi-Fi ජාලයකින් තොරව පණිවිඩ යැවීම සහ ලැබීම"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages විවෘත කරන්න"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index c50773d594a9..fbb57ca0cb74 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -2461,8 +2461,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Obsah aplikácie je z bezpečnostných dôvodov pri zdieľaní obrazovky skrytý"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automaticky pripojené k satelitu"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Správy môžete odosielať a prijímať bez mobilnej siete či siete Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Môžete odosielať a prijímať správy a používať obmedzené dáta cez satelit"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Chcete používať správy cez satelit?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Odosielajte a prijímajte správy bez mobilnej siete či siete Wi‑Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvoriť Správy"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 134ee9df3f3d..f7a25e9288b6 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -2461,8 +2461,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Pri deljenju zaslona je vsebina aplikacije skrita zaradi varnosti"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Samodejno vzpostavljena povezava s satelitom"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Sporočila SMS lahko pošiljate in prejemate brez mobilnega omrežja ali omrežja Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Prek satelita lahko pošiljate in prejemate sporočila ter uporabljate omejeno količino podatkov"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Želite uporabiti satelitsko pošiljanje sporočil?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Pošiljanje in prejemanje sporočil brez mobilnega omrežja ali omrežja Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Odpri Sporočila"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 0a87e39e16df..19be60047254 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -302,8 +302,7 @@ <string name="notification_channel_network_alerts" msgid="6312366315654526528">"Sinjalizimet e rrjetit"</string> <string name="notification_channel_network_available" msgid="6083697929214165169">"Ka rrjet të disponueshëm"</string> <string name="notification_channel_vpn" msgid="1628529026203808999">"Statusi i VPN-së"</string> - <!-- no translation found for notification_channel_system_time (1660313368058030441) --> - <skip /> + <string name="notification_channel_system_time" msgid="1660313368058030441">"Ora dhe brezat orarë"</string> <string name="notification_channel_device_admin" msgid="6384932669406095506">"Sinjalizimet nga administratori i teknologjisë së informacionit"</string> <string name="notification_channel_alerts" msgid="5070241039583668427">"Sinjalizimet"</string> <string name="notification_channel_retail_mode" msgid="3732239154256431213">"Demonstrimi i shitjes me pakicë"</string> @@ -311,8 +310,7 @@ <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Aplikacioni është në ekzekutim"</string> <string name="notification_channel_foreground_service" msgid="7102189948158885178">"Aplikacionet që konsumojnë baterinë"</string> <string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Zmadhimi"</string> - <!-- no translation found for notification_channel_accessibility_hearing_device (7816963856388758952) --> - <skip /> + <string name="notification_channel_accessibility_hearing_device" msgid="7816963856388758952">"Pajisja ndihmëse për dëgjimin"</string> <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Përdorimi i qasshmërisë"</string> <string name="notification_channel_display" msgid="6905032605735615090">"Ekrani"</string> <string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> po përdor baterinë"</string> @@ -1410,10 +1408,8 @@ <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"Shkarko aplikacionin"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"Është futur kartë e re SIM"</string> <string name="carrier_app_notification_text" msgid="6567057546341958637">"Trokit për ta konfiguruar"</string> - <!-- no translation found for time_zone_change_notification_title (5232503069219193218) --> - <skip /> - <!-- no translation found for time_zone_change_notification_body (6135793674904665585) --> - <skip /> + <string name="time_zone_change_notification_title" msgid="5232503069219193218">"Brezi yt orar është ndryshuar"</string> + <string name="time_zone_change_notification_body" msgid="6135793674904665585">"Tani je në <xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"Cakto kohën"</string> <string name="date_picker_dialog_title" msgid="5030520449243071926">"Vendos datën"</string> <string name="date_time_set" msgid="4603445265164486816">"Cakto"</string> @@ -1801,18 +1797,12 @@ <string name="accessibility_gesture_instructional_text" msgid="4133877896011098550">"Veçoria do të hapet herën tjetër kur të përdorësh këtë shkurtore. Rrëshqit shpejt lart me 2 gishta nga fundi i ekranit dhe lëshoje me shpejtësi."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="1124458279366968154">"Veçoria do të hapet herën tjetër kur të përdorësh këtë shkurtore. Rrëshqit shpejt lart me 3 gishta nga fundi i ekranit dhe lëshoje me shpejtësi."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Zmadhimi"</string> - <!-- no translation found for hearing_device_switch_phone_mic_notification_title (6645178038359708836) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_title (4612074852145289569) --> - <skip /> - <!-- no translation found for hearing_device_switch_phone_mic_notification_text (1332426273666077412) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_text (8288368365767284208) --> - <skip /> - <!-- no translation found for hearing_device_notification_switch_button (3619524619430941300) --> - <skip /> - <!-- no translation found for hearing_device_notification_settings_button (6673651052880279178) --> - <skip /> + <string name="hearing_device_switch_phone_mic_notification_title" msgid="6645178038359708836">"Dëshiron të kalosh te mikrofoni i telefonit?"</string> + <string name="hearing_device_switch_hearing_mic_notification_title" msgid="4612074852145289569">"Dëshiron të kalosh te mikrofoni i aparatit të dëgjimit?"</string> + <string name="hearing_device_switch_phone_mic_notification_text" msgid="1332426273666077412">"Për tingull më të mirë ose nëse bateria e aparatit të dëgjimit është në nivel të ulët. Kjo vetëm ndërron mikrofonin gjatë telefonatës."</string> + <string name="hearing_device_switch_hearing_mic_notification_text" msgid="8288368365767284208">"Mund ta përdorësh mikrofonin e aparatit të dëgjimit për telefonata pa përdorur duart. Kjo vetëm ndërron mikrofonin gjatë telefonatës."</string> + <string name="hearing_device_notification_switch_button" msgid="3619524619430941300">"Ndërro"</string> + <string name="hearing_device_notification_settings_button" msgid="6673651052880279178">"Cilësimet"</string> <string name="user_switched" msgid="7249833311585228097">"Emri i përdoruesit aktual: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="user_switching_message" msgid="1912993630661332336">"Po kalon në \"<xliff:g id="NAME">%1$s</xliff:g>\"…"</string> <string name="user_logging_out_message" msgid="7216437629179710359">"<xliff:g id="NAME">%1$s</xliff:g> po del…"</string> @@ -2469,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Përmbajtja e aplikacionit është fshehur nga ndarja e ekranit për arsye sigurie"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"U lidh automatikisht me satelitin"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Mund të dërgosh dhe të marrësh mesazhe pa një rrjet celular apo rrjet Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Mund të dërgosh dhe të marrësh mesazhe, si dhe të përdorësh të dhëna pa kufi nëpërmjet satelitit"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Të përdoret shkëmbimi i mesazheve nëpërmjet satelitit?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Dërgo dhe merr mesazhe pa një rrjet celular ose Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Hap \"Mesazhet\""</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 33150dc3c3c2..c286a65a78e7 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -2460,8 +2460,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Садржај апликације је скривен за дељење садржаја екрана због безбедности"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Аутоматски повезано са сателитом"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Можете да шаљете и примате поруке без мобилне или WiFi мреже"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Можете да шаљете и примате поруке, као и да користите ограничену количину података преко сателита"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Желите да користите сателитску размену порука?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Шаљите и примајте поруке без мобилне или WiFi мреже"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отвори Messages"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index ceb0fe1d6654..a2fcd231854c 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Av säkerhetsskäl döljs appinnehållet vid skärmdelning"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Automatiskt ansluten till satellit"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan skicka och ta emot meddelanden utan mobil- eller wifi-nätverk"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Du kan skicka och ta emot meddelanden och använda begränsad data via satellit"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Vill du använda satellitmeddelanden?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Skicka och ta emot meddelanden utan ett mobil- eller wifi-nätverk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Öppna Messages"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 58d71817a078..93233d91e0df 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Maudhui ya programu yamefichwa ili yasionekane kwenye skrini ya pamoja kwa sababu za kiusalama"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Imeunganishwa kiotomatiki na satelaiti"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Unaweza kutuma na kupokea ujumbe bila mtandao wa simu au Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Unaweza kutuma na kupokea ujumbe na kutumia kiwango kidogo cha data kupitia setilaiti"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Ungependa kutuma ujumbe kupitia setilaiti?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Tuma na upokee ujumbe bila kutumia mtandao wa simu wala Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Fungua Programu ya Messages"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 59668bbff71d..38f9175cc919 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"பாதுகாப்பிற்காக, திரைப் பகிர்வில் இருந்து ஆப்ஸ் உள்ளடக்கம் மறைக்கப்பட்டுள்ளது"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"சாட்டிலைட்டுடன் தானாக இணைக்கப்பட்டது"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"மொபைல்/வைஃபை நெட்வொர்க் இல்லாமல் நீங்கள் மெசேஜ்களை அனுப்பலாம் பெறலாம்"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"சாட்டிலைட் மூலம் நீங்கள் மெசேஜ்களை அனுப்பலாம் பெறலாம், வரம்பிடப்பட்ட டேட்டாவைப் பயன்படுத்தலாம்"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"சாட்டிலைட் மெசேஜிங்கைப் பயன்படுத்தவா?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"மொபைல்/வைஃபை நெட்வொர்க் இல்லாமல் மெசேஜ்களை அனுப்பலாம், பெறலாம்"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ஆப்ஸைத் திறக்கவும்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 6285d776cfab..2a99f758daf7 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"సెక్యూరిటీ కోసం స్క్రీన్ షేర్ నుండి యాప్ కంటెంట్ దాచబడింది"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"శాటిలైట్కు ఆటోమేటిక్గా కనెక్ట్ చేయబడింది"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"మీరు మొబైల్ లేదా Wi-Fi నెట్వర్క్ లేకుండా మెసేజ్లను పంపవచ్చు, స్వీకరించవచ్చు"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"మీరు శాటిలైట్ సర్వీస్ ద్వారా మెసేజ్లను పంపవచ్చు, స్వీకరించవచ్చు, పరిమిత డేటాను ఉపయోగించండి"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"శాటిలైట్ మెసేజింగ్ను ఉపయోగించాలనుకుంటున్నారా?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"మొబైల్ లేదా Wi-Fi నెట్వర్క్ లేకుండా మెసేజ్లను పంపండి, స్వీకరించండి"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messagesను తెరవండి"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 557286128053..8f8252584757 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"ซ่อนเนื้อหาแอปจากการแชร์หน้าจอแล้วเพื่อความปลอดภัย"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"เชื่อมต่อกับดาวเทียมโดยอัตโนมัติ"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"คุณรับส่งข้อความผ่านดาวเทียมได้โดยไม่ต้องใช้เครือข่ายมือถือหรือ Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"คุณจะรับส่งข้อความและใช้อินเทอร์เน็ตแบบจำกัดผ่านดาวเทียมได้"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"ใช้การรับส่งข้อความผ่านดาวเทียมไหม"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"รับและส่งข้อความโดยไม่ต้องใช้เครือข่ายมือถือหรือ Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"เปิด Messages"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 44832c87a3a7..092e15c5289f 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Nakatago ang content ng app mula sa pagbabahagi ng screen para sa seguridad"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Awtomatikong nakakonekta sa satellite"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Puwede kang magpadala at tumanggap ng mga mensahe nang walang mobile o Wi-Fi network"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Puwede kang magpadala at tumanggap ng mga mensahe at gumamit ng limitadong data sa satellite"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Gumamit ng satellite messaging?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Magpadala at tumanggap ng mga mensahe nang walang mobile o Wi-Fi network"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Buksan ang Messages"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 1a8d373a2aa2..e04ad55e395f 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Uygulama içerikleri, güvenlik nedeniyle ekran paylaşımında gizlendi"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Uyduya otomatik olarak bağlandı"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil veya kablosuz ağa bağlı olmadan mesaj alıp gönderebilirsiniz"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Uydu üzerinden mesaj gönderip alabilir ve sınırlı miktarda veri kullanabilirsiniz"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Uydu üzerinden mesajlaşma kullanılsın mı?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Mobil veya kablosuz ağ kullanmadan mesaj gönderip alın"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mesajlar\'ı aç"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 5e6f9ec90037..a78847339b15 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -304,8 +304,7 @@ <string name="notification_channel_network_alerts" msgid="6312366315654526528">"Сповіщення мережі"</string> <string name="notification_channel_network_available" msgid="6083697929214165169">"Мережа доступна"</string> <string name="notification_channel_vpn" msgid="1628529026203808999">"Статус мережі VPN"</string> - <!-- no translation found for notification_channel_system_time (1660313368058030441) --> - <skip /> + <string name="notification_channel_system_time" msgid="1660313368058030441">"Час і часові пояси"</string> <string name="notification_channel_device_admin" msgid="6384932669406095506">"Сповіщення від ІТ-адміністратора"</string> <string name="notification_channel_alerts" msgid="5070241039583668427">"Сповіщення"</string> <string name="notification_channel_retail_mode" msgid="3732239154256431213">"Демо-режим для роздрібної торгівлі"</string> @@ -313,8 +312,7 @@ <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Працює додаток"</string> <string name="notification_channel_foreground_service" msgid="7102189948158885178">"Додатки, що використовують заряд акумулятора"</string> <string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Збільшення"</string> - <!-- no translation found for notification_channel_accessibility_hearing_device (7816963856388758952) --> - <skip /> + <string name="notification_channel_accessibility_hearing_device" msgid="7816963856388758952">"Слуховий апарат"</string> <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Використання спеціальних можливостей"</string> <string name="notification_channel_display" msgid="6905032605735615090">"Дисплей"</string> <string name="foreground_service_app_in_background" msgid="1439289699671273555">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> використовує заряд акумулятора"</string> @@ -1412,10 +1410,8 @@ <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"Завантажити додаток"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"Вставлено нову SIM-карту"</string> <string name="carrier_app_notification_text" msgid="6567057546341958637">"Торкніться, щоб налаштувати"</string> - <!-- no translation found for time_zone_change_notification_title (5232503069219193218) --> - <skip /> - <!-- no translation found for time_zone_change_notification_body (6135793674904665585) --> - <skip /> + <string name="time_zone_change_notification_title" msgid="5232503069219193218">"Часовий пояс змінено"</string> + <string name="time_zone_change_notification_body" msgid="6135793674904665585">"Ви зараз у часовому поясі \"<xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g>\" (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"Установити час"</string> <string name="date_picker_dialog_title" msgid="5030520449243071926">"Установити дату"</string> <string name="date_time_set" msgid="4603445265164486816">"Застосувати"</string> @@ -1803,18 +1799,12 @@ <string name="accessibility_gesture_instructional_text" msgid="4133877896011098550">"Функція відкриється, коли ви наступного разу скористаєтеся цією швидкою командою. Проведіть двома пальцями вгору від низу екрана й швидко відпустіть."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="1124458279366968154">"Функція відкриється, коли ви наступного разу скористаєтеся цією швидкою командою. Проведіть трьома пальцями вгору від низу екрана й швидко відпустіть."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Збільшення"</string> - <!-- no translation found for hearing_device_switch_phone_mic_notification_title (6645178038359708836) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_title (4612074852145289569) --> - <skip /> - <!-- no translation found for hearing_device_switch_phone_mic_notification_text (1332426273666077412) --> - <skip /> - <!-- no translation found for hearing_device_switch_hearing_mic_notification_text (8288368365767284208) --> - <skip /> - <!-- no translation found for hearing_device_notification_switch_button (3619524619430941300) --> - <skip /> - <!-- no translation found for hearing_device_notification_settings_button (6673651052880279178) --> - <skip /> + <string name="hearing_device_switch_phone_mic_notification_title" msgid="6645178038359708836">"Перемкнути на мікрофон телефона?"</string> + <string name="hearing_device_switch_hearing_mic_notification_title" msgid="4612074852145289569">"Перемкнути на мікрофон слухового апарата?"</string> + <string name="hearing_device_switch_phone_mic_notification_text" msgid="1332426273666077412">"Використовується, щоб покращити якість звуку або якщо акумулятор слухового апарата розряджений. Мікрофон перемикатиметься лише на час дзвінка."</string> + <string name="hearing_device_switch_hearing_mic_notification_text" msgid="8288368365767284208">"Ви можете використовувати мікрофон слухового апарата для голосового керування викликами. Мікрофон перемикатиметься лише на час дзвінка."</string> + <string name="hearing_device_notification_switch_button" msgid="3619524619430941300">"Перемкнути"</string> + <string name="hearing_device_notification_settings_button" msgid="6673651052880279178">"Налаштування"</string> <string name="user_switched" msgid="7249833311585228097">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"Перехід у режим \"<xliff:g id="NAME">%1$s</xliff:g>\"…"</string> <string name="user_logging_out_message" msgid="7216437629179710359">"Вихід з облікового запису користувача <xliff:g id="NAME">%1$s</xliff:g>…"</string> @@ -2471,8 +2461,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"З міркувань безпеки вміст додатка приховано під час показу екрана"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Автоматично підключено до супутника"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Ви можете надсилати й отримувати повідомлення, не використовуючи Wi-Fi або мобільну мережу"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Ви можете надсилати й отримувати повідомлення та використовувати обмежений обсяг даних через супутник"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Скористатися супутниковим обміном повідомленнями?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Надсилайте й отримуйте текстові повідомлення без мобільної мережі або Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Відкрийте Повідомлення"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 7ddd7cb8a02a..7f3a2ef7ed31 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"سیکیورٹی کے مد نظر ایپ کا مواد اسکرین کے اشتراک سے چھپا ہوا ہے"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"سٹلائٹ سے خودکار طور پر منسلک ہے"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"آپ موبائل یا Wi-Fi نیٹ ورک کے بغیر پیغامات بھیج اور موصول کر سکتے ہیں"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"آپ سیٹلائٹ کے ذریعے پیغامات بھیج اور موصول کر سکتے ہیں اور محدود ڈیٹا استعمال کر سکتے ہیں"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"سیٹلائٹ پیغام رسانی کا استعمال کریں؟"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"موبائل یا Wi-Fi نیٹ ورک کے بغیر پیغامات بھیجیں اور موصول کریں"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"پیغامات ایپ کو کھولیں"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index c1697953eb53..9f24b987033b 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Ekran namoyishida xavfsizlik maqsadida ilova kontenti berkitildi"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Sputnikka avtomatik ulandi"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil yoki Wi-Fi tarmoqsiz xabarlarni yuborishingiz va qabul qilishingiz mumkin"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Sputnik orqali xabarlar yuborish va qabul qilish hamda cheklangan trafikdan foydalanish mumkin"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Sputnik orqali xabarlashuv ishlatilsinmi?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Mobil yoki Wi-Fi tarmoq blan aloqa yoʻqligida xabar yuboring va qabul qiling"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Xabarlar ilovasini ochish"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 11b57703d339..678f3e09f123 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Nội dung ứng dụng bị ẩn khỏi tính năng chia sẻ màn hình vì lý do bảo mật"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Đã tự động kết nối với vệ tinh"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Bạn có thể gửi và nhận tin nhắn mà không cần có mạng di động hoặc mạng Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Bạn có thể gửi và nhận tin nhắn cũng như sử dụng dữ liệu hạn chế qua vệ tinh"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Sử dụng tính năng nhắn tin qua vệ tinh?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Gửi và nhận tin nhắn mà không cần mạng di động hoặc Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mở ứng dụng Tin nhắn"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 4a38b933b000..c5cad4bc9503 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"为安全起见,屏幕共享画面已隐藏此应用的内容"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"自动连接到卫星"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"您无需使用移动网络或 WLAN 网络便能收发消息"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"您可以使用有限的数据通过卫星收发消息"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"使用卫星消息功能?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"即使没有移动网络或 WLAN 网络,也能收发消息"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"打开“信息”应用"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index cd428895c4d0..0fb351d12681 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"為安全起見,應用程式內容已從分享螢幕畫面隱藏"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"已自動連線至衛星"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"你可在沒有流動/Wi-Fi 網絡的情況下收發訊息"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"你可透過衛星傳送和接收訊息,以及使用有限數據"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"要使用衛星訊息嗎?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"在沒有流動網絡或 Wi-Fi 網絡的情況下收發短訊"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"開啟「訊息」"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index c8ae6793a4e3..9e83ce8d44c2 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"為安全起見,分享螢幕畫面隱藏了這個應用程式的內容"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"已自動連上衛星"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"你可以收發訊息,沒有行動/Wi-Fi 網路也無妨"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"你可以透過有限的衛星數據收發訊息"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"要使用衛星訊息功能嗎?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"即使沒有行動或 Wi-Fi 網路,還是可以收發訊息"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"開啟「訊息」應用程式"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 7658189f3f55..a2827799c252 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -2459,8 +2459,7 @@ <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"Okuqukethwe kwe-app kufihliwe kusuka ekwabelaneni kwesikrini ngokuvikelwa"</string> <string name="satellite_notification_title" msgid="4026338973463121526">"Ixhumeke ngokuzenzakalelayo kusathelayithi"</string> <string name="satellite_notification_summary" msgid="5207364139430767162">"Ungathumela futhi wamukele imilayezo ngaphandle kwenethiwekhi yeselula noma ye-Wi-Fi"</string> - <!-- no translation found for satellite_notification_summary_with_data (6486843676720429049) --> - <skip /> + <string name="satellite_notification_summary_with_data" msgid="6486843676720429049">"Ungathumela futhi wamukele imiyalezo usebenzise nedatha enomkhawulo ngesathelayithi"</string> <string name="satellite_notification_manual_title" msgid="1097504441849466279">"Sebenzisa ukuthumela umyalezo ngesethelayithi?"</string> <string name="satellite_notification_manual_summary" msgid="901206289846283445">"Thumela futhi wamukele imilayezo ngaphandle kwenethiwekhi yeselula noma yeWiFi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Vula Imilayezo"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index ec1be83dcae6..18e12e300503 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -7299,6 +7299,10 @@ <!-- Whether to enable fp unlock when screen turns off on udfps devices --> <bool name="config_screen_off_udfps_enabled">false</bool> + <!-- Default value for fp screen off unlock toggle, it only works for the devices that support + fp screen off unlock--> + <bool name="config_screen_off_udfps_default_on">false</bool> + <!-- The name of the system package that will hold the dependency installer role. --> <string name="config_systemDependencyInstaller" translatable="false" /> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 77cc6868bd58..6890a4156b75 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -5791,6 +5791,9 @@ <!-- Fingerprint screen off unlock config --> <java-symbol type="bool" name="config_screen_off_udfps_enabled" /> + <!-- Default toggle for fp screen of unlcok--> + <java-symbol type="bool" name="config_screen_off_udfps_default_on" /> + <!-- Style for Wear Material3 Button. Will only be used for sdk 36 or above. --> <java-symbol type="style" name="Widget.DeviceDefault.Button.WearMaterial3" /> diff --git a/core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java b/core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java index d898d222b8de..36c73e2e979e 100644 --- a/core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java +++ b/core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java @@ -187,6 +187,9 @@ public class InstallOverlayTests extends BaseHostJUnit4Test { shell("cmd overlay list " + APP_OVERLAY_PACKAGE_NAME).trim()); assertEquals("STATE_ENABLED", shell("cmd overlay dump state " + APP_OVERLAY_PACKAGE_NAME).trim()); + + assertEquals("STATE_ENABLED", + shell("cmd overlay dump --user current state " + APP_OVERLAY_PACKAGE_NAME).trim()); } private void delay() { diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig index e4210261a9fc..4a8ab327acc4 100644 --- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig +++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig @@ -5,12 +5,6 @@ package: "com.android.wm.shell" container: "system" -flag { - name: "enable_app_pairs" - namespace: "multitasking" - description: "Enables the ability to create and save app pairs to the Home screen" - bug: "274835596" -} flag { name: "enable_taskbar_navbar_unification" diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/IPip.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/IPip.aidl index 37779077f9b6..1444a626fb11 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/IPip.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/IPip.aidl @@ -16,7 +16,7 @@ package com.android.wm.shell.common.pip; -import android.app.ActivityManager; +import android.app.ActivityManager.RunningTaskInfo; import android.app.PictureInPictureParams; import android.view.SurfaceControl; import android.content.ComponentName; @@ -42,7 +42,7 @@ interface IPip { bounds * @return destination bounds the PiP window should land into */ - Rect startSwipePipToHome(in ActivityManager.RunningTaskInfo taskInfo, int launcherRotation, + Rect startSwipePipToHome(in RunningTaskInfo taskInfo, int launcherRotation, in Rect hotseatKeepClearArea) = 1; /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt index c958a0975f11..4d87b2189115 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt @@ -70,8 +70,7 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser if (!isFreeformTask(taskInfo)) { desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId) } - // TODO: b/367268953 - Connect this with DesktopRepository for handling - // task moving to front for tasks in windowing mode. + desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible) } override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java index 0d5aa0105659..b38a853321a7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java @@ -171,7 +171,8 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener, @Override public void onFocusTaskChanged(RunningTaskInfo taskInfo) { - if (taskInfo.getWindowingMode() != WINDOWING_MODE_FREEFORM) { + if (taskInfo.getWindowingMode() != WINDOWING_MODE_FREEFORM + || DesktopModeFlags.ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue()) { return; } ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 9e88a260ac44..99a89a6b884f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -300,7 +300,7 @@ public class SplitScreenController implements SplitDragPolicy.Starter, mTaskOrganizer, mDisplayController, mDisplayImeController, mDisplayInsetsController, mTransitions, mTransactionPool, mIconProvider, mMainExecutor, mMainHandler, mRecentTasksOptional, mLaunchAdjacentController, - mWindowDecorViewModel, mSplitState, mDesktopTasksController); + mWindowDecorViewModel, mSplitState, mDesktopTasksController, mRootTDAOrganizer); } @Override @@ -441,7 +441,7 @@ public class SplitScreenController implements SplitDragPolicy.Starter, */ public void prepareExitSplitScreen(WindowContainerTransaction wct, @StageType int stageToTop, @ExitReason int reason) { - mStageCoordinator.prepareExitSplitScreen(stageToTop, wct); + mStageCoordinator.prepareExitSplitScreen(stageToTop, wct, reason); mStageCoordinator.clearSplitPairedInRecents(reason); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 37c93518998a..511e426cc681 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -130,6 +130,7 @@ import com.android.internal.policy.FoldLockSettingsObserver; import com.android.internal.protolog.ProtoLog; import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.R; +import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.ComponentUtils; import com.android.wm.shell.common.DisplayController; @@ -168,6 +169,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.Executor; @@ -218,6 +220,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private final SplitscreenEventLogger mLogger; private final ShellExecutor mMainExecutor; private final Handler mMainHandler; + private final RootTaskDisplayAreaOrganizer mRootTDAOrganizer; // Cache live tile tasks while entering recents, evict them from stages in finish transaction // if user is opening another task(s). private final ArrayList<Integer> mPausingTasks = new ArrayList<>(); @@ -354,7 +357,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, Handler mainHandler, Optional<RecentTasksController> recentTasks, LaunchAdjacentController launchAdjacentController, Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState, - Optional<DesktopTasksController> desktopTasksController) { + Optional<DesktopTasksController> desktopTasksController, + RootTaskDisplayAreaOrganizer rootTDAOrganizer) { mContext = context; mDisplayId = displayId; mSyncQueue = syncQueue; @@ -367,6 +371,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mWindowDecorViewModel = windowDecorViewModel; mSplitState = splitState; mDesktopTasksController = desktopTasksController; + mRootTDAOrganizer = rootTDAOrganizer; taskOrganizer.createRootTask(displayId, WINDOWING_MODE_FULLSCREEN, this /* listener */); @@ -425,7 +430,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, Handler mainHandler, Optional<RecentTasksController> recentTasks, LaunchAdjacentController launchAdjacentController, Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState, - Optional<DesktopTasksController> desktopTasksController) { + Optional<DesktopTasksController> desktopTasksController, + RootTaskDisplayAreaOrganizer rootTDAOrganizer) { mContext = context; mDisplayId = displayId; mSyncQueue = syncQueue; @@ -447,6 +453,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mWindowDecorViewModel = windowDecorViewModel; mSplitState = splitState; mDesktopTasksController = desktopTasksController; + mRootTDAOrganizer = rootTDAOrganizer; mDisplayController.addDisplayWindowListener(this); transitions.addHandler(this); @@ -880,7 +887,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void startSingleTask(int taskId, Bundle options, WindowContainerTransaction wct, RemoteTransition remoteTransition) { if (mMainStage.containsTask(taskId) || mSideStage.containsTask(taskId)) { - prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, wct); + prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, wct, EXIT_REASON_FULLSCREEN_REQUEST); } if (mRecentTasks.isPresent()) { mRecentTasks.get().removeSplitPair(taskId); @@ -1433,7 +1440,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // on top and lead to no visible change. clearSplitPairedInRecents(reason); final WindowContainerTransaction wct = new WindowContainerTransaction(); - prepareExitSplitScreen(mLastActiveStage, wct); + prepareExitSplitScreen(mLastActiveStage, wct, reason); mSplitTransitions.startDismissTransition(wct, this, mLastActiveStage, reason); setSplitsVisible(false); mBreakOnNextWake = false; @@ -1527,7 +1534,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (!isSplitActive()) return; final int stage = getStageOfTask(toTopTaskId); final WindowContainerTransaction wct = new WindowContainerTransaction(); - prepareExitSplitScreen(stage, wct); + prepareExitSplitScreen(stage, wct, exitReason); mSplitTransitions.startDismissTransition(wct, this, stage, exitReason); // reset stages to their default sides. setSideStagePosition(SPLIT_POSITION_BOTTOM_OR_RIGHT, null); @@ -1646,7 +1653,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, * to be used when exiting split might be bundled with other window operations. */ void prepareExitSplitScreen(@StageType int stageToTop, - @NonNull WindowContainerTransaction wct) { + @NonNull WindowContainerTransaction wct, @ExitReason int exitReason) { if (!isSplitActive()) return; ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "prepareExitSplitScreen: stageToTop=%s", stageTypeToString(stageToTop)); @@ -1657,6 +1664,26 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } else { mSideStage.removeAllTasks(wct, stageToTop == STAGE_TYPE_SIDE); } + + if (exitReason != EXIT_REASON_DESKTOP_MODE) { + StageTaskListener toTopStage = stageToTop == STAGE_TYPE_MAIN ? mMainStage : mSideStage; + if (enableFlexibleSplit()) { + toTopStage = mStageOrderOperator.getAllStages().stream() + .filter(stage -> stage.getId() == stageToTop) + .findFirst().orElse(null); + } + final DisplayAreaInfo tdaInfo = mRootTDAOrganizer.getDisplayAreaInfo(mDisplayId); + Objects.requireNonNull(tdaInfo); + final int displayWindowingMode = + tdaInfo.configuration.windowConfiguration.getWindowingMode(); + // In freeform-first env, we need to explicitly set the windowing mode when leaving + // the split-screen to be fullscreen. + final int targetWindowingMode = displayWindowingMode == WINDOWING_MODE_FREEFORM + ? WINDOWING_MODE_FULLSCREEN : WINDOWING_MODE_UNDEFINED; + toTopStage.doForAllChildTaskInfos(taskInfo -> { + wct.setWindowingMode(taskInfo.token, targetWindowingMode); + }); + } deactivateSplit(wct, stageToTop); mSplitState.exit(); } @@ -2331,7 +2358,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, stageType = isMainStage ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE; } final WindowContainerTransaction wct = new WindowContainerTransaction(); - prepareExitSplitScreen(stageType, wct); + prepareExitSplitScreen(stageType, wct, EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW); clearSplitPairedInRecents(EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW); mSplitTransitions.startDismissTransition(wct, StageCoordinator.this, stageType, EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW); @@ -2363,10 +2390,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } final WindowContainerTransaction wct = new WindowContainerTransaction(); toTopStage.resetBounds(wct); - prepareExitSplitScreen(dismissTop, wct); + prepareExitSplitScreen(dismissTop, wct, EXIT_REASON_DRAG_DIVIDER); if (mRootTaskInfo != null) { wct.setDoNotPip(mRootTaskInfo.token); } + mSplitTransitions.startDismissTransition(wct, this, dismissTop, EXIT_REASON_DRAG_DIVIDER); } @@ -2801,7 +2829,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // The top should be the opposite side that is closing: int dismissTop = getStageType(stage) == STAGE_TYPE_MAIN ? STAGE_TYPE_SIDE : STAGE_TYPE_MAIN; - prepareExitSplitScreen(dismissTop, out); + prepareExitSplitScreen(dismissTop, out, EXIT_REASON_APP_FINISHED); mSplitTransitions.setDismissTransition(transition, dismissTop, EXIT_REASON_APP_FINISHED); } else if (isOpening && !mPausingTasks.isEmpty()) { @@ -2809,7 +2837,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // recents, which means to dismiss the split pair to this task. int dismissTop = getStageType(stage) == STAGE_TYPE_MAIN ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE; - prepareExitSplitScreen(dismissTop, out); + prepareExitSplitScreen(dismissTop, out, EXIT_REASON_APP_FINISHED); mSplitTransitions.setDismissTransition(transition, dismissTop, EXIT_REASON_APP_FINISHED); } else if (!isSplitScreenVisible() && isOpening) { @@ -2822,7 +2850,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // If the trigger task is in fullscreen and in split, exit split and place // task on top final int stageType = getStageOfTask(triggerTask.taskId); - prepareExitSplitScreen(stageType, out); + prepareExitSplitScreen(stageType, out, EXIT_REASON_FULLSCREEN_REQUEST); mSplitTransitions.setDismissTransition(transition, stageType, EXIT_REASON_FULLSCREEN_REQUEST); } @@ -2850,7 +2878,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (anyStageContainsSingleFullscreenTask) { // A splitting task is opening to fullscreen causes one side of the split empty, // so appends operations to exit split. - prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, out); + prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, out, + EXIT_REASON_FULLSCREEN_REQUEST); } } else if (type == TRANSIT_KEYGUARD_OCCLUDE && triggerTask.topActivity != null && isSplitScreenVisible()) { @@ -2858,7 +2887,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // stage and move it to the top. int top = triggerTask.topActivity.equals(mMainStage.mRootTaskInfo.topActivity) ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE; - prepareExitSplitScreen(top, out); + prepareExitSplitScreen(top, out, EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP); mSplitTransitions.setDismissTransition(transition, top, EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP); } @@ -2940,7 +2969,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, topStage = STAGE_TYPE_SIDE; } } - prepareExitSplitScreen(topStage, outWCT); + prepareExitSplitScreen(topStage, outWCT, EXIT_REASON_UNKNOWN); } } @@ -3127,7 +3156,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // If there is a fullscreen opening change, we should not bring stage to top. prepareExitSplitScreen( !record.mContainShowFullscreenChange && isSplitScreenVisible() - ? dismissTop : STAGE_TYPE_UNDEFINED, wct); + ? dismissTop : STAGE_TYPE_UNDEFINED, wct, EXIT_REASON_APP_FINISHED); mSplitTransitions.startDismissTransition(wct, this, dismissTop, EXIT_REASON_APP_FINISHED); // This can happen in some pathological cases. For example: @@ -3368,7 +3397,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, (sideChild != null ? STAGE_TYPE_SIDE : STAGE_TYPE_UNDEFINED); pendingEnter.cancel( (cancelWct, cancelT) -> { - prepareExitSplitScreen(dismissTop, cancelWct); + prepareExitSplitScreen(dismissTop, cancelWct, EXIT_REASON_UNKNOWN); logExit(EXIT_REASON_UNKNOWN); }); Log.w(TAG, splitFailureMessage("startPendingEnterAnimation", diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index 021f6595d984..194114db0169 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -379,6 +379,13 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { } } + void doForAllChildTaskInfos(Consumer<ActivityManager.RunningTaskInfo> consumer) { + for (int i = mChildrenTaskInfo.size() - 1; i >= 0; i--) { + final ActivityManager.RunningTaskInfo taskInfo = mChildrenTaskInfo.valueAt(i); + consumer.accept(taskInfo); + } + } + /** Collects all the current child tasks and prepares transaction to evict them to display. */ void evictAllChildren(WindowContainerTransaction wct) { for (int i = mChildrenTaskInfo.size() - 1; i >= 0; i--) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java index c5e158c6b452..d71b7a1183f4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java @@ -62,6 +62,7 @@ public class TvSplitScreenController extends SplitScreenController { private final Optional<RecentTasksController> mRecentTasksOptional; private final LaunchAdjacentController mLaunchAdjacentController; private final SplitState mSplitState; + private final RootTaskDisplayAreaOrganizer mRootTDAOrganizer; private final Handler mMainHandler; private final SystemWindows mSystemWindows; @@ -109,6 +110,7 @@ public class TvSplitScreenController extends SplitScreenController { mMainHandler = mainHandler; mSystemWindows = systemWindows; + mRootTDAOrganizer = rootTDAOrganizer; } /** @@ -121,7 +123,8 @@ public class TvSplitScreenController extends SplitScreenController { mTaskOrganizer, mDisplayController, mDisplayImeController, mDisplayInsetsController, mTransitions, mTransactionPool, mIconProvider, mMainExecutor, mMainHandler, - mRecentTasksOptional, mLaunchAdjacentController, mSplitState, mSystemWindows); + mRecentTasksOptional, mLaunchAdjacentController, mSplitState, mSystemWindows, + mRootTDAOrganizer); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvStageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvStageCoordinator.java index e1bf12fc6082..d7f1ced1b432 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvStageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvStageCoordinator.java @@ -20,6 +20,7 @@ import android.content.Context; import android.os.Handler; import com.android.launcher3.icons.IconProvider; +import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayImeController; @@ -55,11 +56,11 @@ public class TvStageCoordinator extends StageCoordinator Optional<RecentTasksController> recentTasks, LaunchAdjacentController launchAdjacentController, SplitState splitState, - SystemWindows systemWindows) { + SystemWindows systemWindows, RootTaskDisplayAreaOrganizer rootTDAOrganizer) { super(context, displayId, syncQueue, taskOrganizer, displayController, displayImeController, displayInsetsController, transitions, transactionPool, iconProvider, mainExecutor, mainHandler, recentTasks, launchAdjacentController, - Optional.empty(), splitState, Optional.empty()); + Optional.empty(), splitState, Optional.empty(), rootTDAOrganizer); mTvSplitMenuController = new TvSplitMenuController(context, this, systemWindows, mainHandler); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 39a989ce7c7f..b179741b1259 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -423,6 +423,15 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin } @Override + void onExclusionRegionChanged(@NonNull Region exclusionRegion) { + if (Flags.appHandleNoRelayoutOnExclusionChange() && isAppHandle(mWindowDecorViewHolder)) { + // Avoid unnecessary relayouts for app handle. See b/383672263 + return; + } + relayout(mTaskInfo, mHasGlobalFocus, exclusionRegion); + } + + @Override void relayout(ActivityManager.RunningTaskInfo taskInfo, boolean hasGlobalFocus, @NonNull Region displayExclusionRegion) { final SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt index c7c0dfc5be6d..12c7ff61399f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt @@ -144,6 +144,16 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test + fun onTaskMovingToFront_freeformTaskOutsideDesktop_addsTaskToRepo() { + val task = createFullscreenTask().apply { isVisible = true } + whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) + + desktopTaskChangeListener.onTaskMovingToFront(task) + + verify(desktopUserRepositories.current).addTask(task.displayId, task.taskId, task.isVisible) + } + + @Test @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION) fun onTaskClosing_backNavEnabled_nonClosingTask_minimizesTaskInRepo() { val task = createFreeformTask().apply { isVisible = true } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java index fa5989a3ca99..6c16b3220a07 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java @@ -159,7 +159,8 @@ public final class FreeformTaskListenerTests extends ShellTestCase { } @Test - public void focusTaskChanged_addsFreeformTaskToRepo() { + @DisableFlags(FLAG_ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS) + public void focusTaskChanged_noTransitionObserversFlag_addsFreeformTaskToRepo() { ActivityManager.RunningTaskInfo task = new TestRunningTaskInfoBuilder().setWindowingMode(WINDOWING_MODE_FREEFORM).build(); task.isFocused = true; @@ -171,6 +172,19 @@ public final class FreeformTaskListenerTests extends ShellTestCase { } @Test + @EnableFlags(FLAG_ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS) + public void focusTaskChanged_enableTransitionObservers_freeformTaskNotAddedToRepo() { + ActivityManager.RunningTaskInfo task = + new TestRunningTaskInfoBuilder().setWindowingMode(WINDOWING_MODE_FREEFORM).build(); + task.isFocused = true; + + mFreeformTaskListener.onFocusTaskChanged(task); + + verify(mDesktopUserRepositories.getCurrent(), never()) + .addTask(task.displayId, task.taskId, task.isVisible); + } + + @Test public void focusTaskChanged_fullscreenTaskNotAddedToRepo() { ActivityManager.RunningTaskInfo fullscreenTask = new TestRunningTaskInfoBuilder() diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java index ae0c9d6cbf7c..414c0147660c 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTestUtils.java @@ -26,6 +26,7 @@ import android.os.Handler; import android.view.SurfaceControl; import com.android.dx.mockito.inline.extended.ExtendedMockito; +import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.TestRunningTaskInfoBuilder; import com.android.wm.shell.common.DisplayController; @@ -83,12 +84,13 @@ public class SplitTestUtils { Optional<RecentTasksController> recentTasks, LaunchAdjacentController launchAdjacentController, Optional<WindowDecorViewModel> windowDecorViewModel, SplitState splitState, - Optional<DesktopTasksController> desktopTasksController) { + Optional<DesktopTasksController> desktopTasksController, + RootTaskDisplayAreaOrganizer rootTDAOrganizer) { super(context, displayId, syncQueue, taskOrganizer, mainStage, sideStage, displayController, imeController, insetsController, splitLayout, transitions, transactionPool, mainExecutor, mainHandler, recentTasks, launchAdjacentController, windowDecorViewModel, splitState, - desktopTasksController); + desktopTasksController, rootTDAOrganizer); // Prepare root task for testing. mRootTask = new TestRunningTaskInfoBuilder().build(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java index b0fdfacd7d83..4211e4682810 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -47,6 +47,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.app.ActivityManager; @@ -54,6 +55,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.view.SurfaceControl; +import android.window.DisplayAreaInfo; import android.window.IRemoteTransition; import android.window.RemoteTransition; import android.window.TransitionInfo; @@ -65,6 +67,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.icons.IconProvider; +import com.android.wm.shell.MockToken; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; @@ -121,6 +124,8 @@ public class SplitTransitionTests extends ShellTestCase { private StageTaskListener mSideStage; private StageCoordinator mStageCoordinator; private SplitScreenTransitions mSplitScreenTransitions; + private final DisplayAreaInfo mDisplayAreaInfo = new DisplayAreaInfo(new MockToken().token(), + DEFAULT_DISPLAY, 0); private ActivityManager.RunningTaskInfo mMainChild; private ActivityManager.RunningTaskInfo mSideChild; @@ -146,7 +151,9 @@ public class SplitTransitionTests extends ShellTestCase { mSyncQueue, mTaskOrganizer, mMainStage, mSideStage, mDisplayController, mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions, mTransactionPool, mMainExecutor, mMainHandler, Optional.empty(), - mLaunchAdjacentController, Optional.empty(), mSplitState, Optional.empty()); + mLaunchAdjacentController, Optional.empty(), mSplitState, Optional.empty(), + mRootTDAOrganizer); + when(mRootTDAOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)).thenReturn(mDisplayAreaInfo); mStageCoordinator.setMixedHandler(mMixedHandler); mSplitScreenTransitions = mStageCoordinator.getSplitTransitions(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java index 7a88ace3f85f..5851cbf9b933 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java @@ -17,6 +17,8 @@ package com.android.wm.shell.splitscreen; import static android.app.ActivityTaskManager.INVALID_TASK_ID; +import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.Display.DEFAULT_DISPLAY; @@ -27,11 +29,14 @@ import static com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSIT import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED; +import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DRAG_DIVIDER; +import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DESKTOP_MODE; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -39,6 +44,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.notNull; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; @@ -56,6 +62,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.view.SurfaceControl; +import android.window.DisplayAreaInfo; import android.window.RemoteTransition; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; @@ -64,6 +71,8 @@ import androidx.test.annotation.UiThreadTest; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.wm.shell.MockToken; +import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestRunningTaskInfoBuilder; @@ -94,6 +103,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Optional; +import java.util.function.Consumer; /** * Tests for {@link StageCoordinator} @@ -125,6 +135,8 @@ public class StageCoordinatorTests extends ShellTestCase { private DefaultMixedHandler mDefaultMixedHandler; @Mock private SplitState mSplitState; + @Mock + private RootTaskDisplayAreaOrganizer mRootTDAOrganizer; private final Rect mBounds1 = new Rect(10, 20, 30, 40); private final Rect mBounds2 = new Rect(5, 10, 15, 20); @@ -138,6 +150,10 @@ public class StageCoordinatorTests extends ShellTestCase { private final TestShellExecutor mMainExecutor = new TestShellExecutor(); private final ShellExecutor mAnimExecutor = new TestShellExecutor(); private final Handler mMainHandler = new Handler(Looper.getMainLooper()); + private final DisplayAreaInfo mDisplayAreaInfo = new DisplayAreaInfo(new MockToken().token(), + DEFAULT_DISPLAY, 0); + private final ActivityManager.RunningTaskInfo mMainChildTaskInfo = + new TestRunningTaskInfoBuilder().setVisible(true).build(); @Before @UiThreadTest @@ -148,9 +164,10 @@ public class StageCoordinatorTests extends ShellTestCase { mTaskOrganizer, mMainStage, mSideStage, mDisplayController, mDisplayImeController, mDisplayInsetsController, mSplitLayout, mTransitions, mTransactionPool, mMainExecutor, mMainHandler, Optional.empty(), mLaunchAdjacentController, - Optional.empty(), mSplitState, Optional.empty())); + Optional.empty(), mSplitState, Optional.empty(), mRootTDAOrganizer)); mDividerLeash = new SurfaceControl.Builder().setName("fakeDivider").build(); + when(mRootTDAOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)).thenReturn(mDisplayAreaInfo); when(mSplitLayout.getTopLeftBounds()).thenReturn(mBounds1); when(mSplitLayout.getBottomRightBounds()).thenReturn(mBounds2); @@ -167,6 +184,12 @@ public class StageCoordinatorTests extends ShellTestCase { mMainStage.mRootTaskInfo = new TestRunningTaskInfoBuilder().build(); doReturn(mock(SplitDecorManager.class)).when(mMainStage).getSplitDecorManager(); doReturn(mock(SplitDecorManager.class)).when(mSideStage).getSplitDecorManager(); + + doAnswer(invocation -> { + Consumer<ActivityManager.RunningTaskInfo> consumer = invocation.getArgument(0); + consumer.accept(mMainChildTaskInfo); + return null; + }).when(mMainStage).doForAllChildTaskInfos(any()); } @Test @@ -454,6 +477,55 @@ public class StageCoordinatorTests extends ShellTestCase { int windowingMode = wctCaptor.getValue().getChanges().get(binder).getWindowingMode(); assertEquals(windowingMode, WINDOWING_MODE_UNDEFINED); } + @Test + public void testDismiss_freeformDisplay() { + mDisplayAreaInfo.configuration.windowConfiguration.setWindowingMode( + WINDOWING_MODE_FREEFORM); + when(mStageCoordinator.isSplitActive()).thenReturn(true); + + WindowContainerTransaction wct = new WindowContainerTransaction(); + mStageCoordinator.prepareExitSplitScreen(STAGE_TYPE_MAIN, wct, EXIT_REASON_DRAG_DIVIDER); + + assertEquals(wct.getChanges().get(mMainChildTaskInfo.token.asBinder()).getWindowingMode(), + WINDOWING_MODE_FULLSCREEN); + } + + @Test + public void testDismiss_freeformDisplayToDesktop() { + mDisplayAreaInfo.configuration.windowConfiguration.setWindowingMode( + WINDOWING_MODE_FREEFORM); + when(mStageCoordinator.isSplitActive()).thenReturn(true); + + WindowContainerTransaction wct = new WindowContainerTransaction(); + mStageCoordinator.prepareExitSplitScreen(STAGE_TYPE_MAIN, wct, EXIT_REASON_DESKTOP_MODE); + + WindowContainerTransaction.Change c = + wct.getChanges().get(mMainChildTaskInfo.token.asBinder()); + assertFalse(c != null && c.getWindowingMode() == WINDOWING_MODE_FULLSCREEN); + } + + @Test + public void testDismiss_fullscreenDisplay() { + when(mStageCoordinator.isSplitActive()).thenReturn(true); + + WindowContainerTransaction wct = new WindowContainerTransaction(); + mStageCoordinator.prepareExitSplitScreen(STAGE_TYPE_MAIN, wct, EXIT_REASON_DRAG_DIVIDER); + + assertEquals(wct.getChanges().get(mMainChildTaskInfo.token.asBinder()).getWindowingMode(), + WINDOWING_MODE_UNDEFINED); + } + + @Test + public void testDismiss_fullscreenDisplayToDesktop() { + when(mStageCoordinator.isSplitActive()).thenReturn(true); + + WindowContainerTransaction wct = new WindowContainerTransaction(); + mStageCoordinator.prepareExitSplitScreen(STAGE_TYPE_MAIN, wct, EXIT_REASON_DESKTOP_MODE); + + WindowContainerTransaction.Change c = + wct.getChanges().get(mMainChildTaskInfo.token.asBinder()); + assertFalse(c != null && c.getWindowingMode() == WINDOWING_MODE_FULLSCREEN); + } private Transitions createTestTransitions() { ShellInit shellInit = new ShellInit(mMainExecutor); diff --git a/media/java/android/media/flags/media_better_together.aconfig b/media/java/android/media/flags/media_better_together.aconfig index 312f78e2b24e..94454cf9ab9b 100644 --- a/media/java/android/media/flags/media_better_together.aconfig +++ b/media/java/android/media/flags/media_better_together.aconfig @@ -173,11 +173,10 @@ flag { bug: "281072508" } - flag { - name: "enable_singleton_audio_manager_route_controller" + name: "enable_use_of_singleton_audio_manager_route_controller" is_exported: true - namespace: "media_solutions" + namespace: "media_better_together" description: "Use singleton AudioManagerRouteController shared across all users." bug: "372868909" metadata { diff --git a/packages/InputDevices/res/values-ar/strings.xml b/packages/InputDevices/res/values-ar/strings.xml index 65f3edb2604c..6d917da5b814 100644 --- a/packages/InputDevices/res/values-ar/strings.xml +++ b/packages/InputDevices/res/values-ar/strings.xml @@ -56,6 +56,5 @@ <string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"لغة الجبل الأسود (اللاتينية)"</string> <string name="keyboard_layout_serbian_cyrillic" msgid="7013541044323542196">"الصربية (السيريلية)"</string> <string name="keyboard_layout_montenegrin_cyrillic" msgid="2391253952894077421">"لغة الجبل الأسود (السيريلية)"</string> - <!-- no translation found for keyboard_layout_romanian (8698989892731726903) --> - <skip /> + <string name="keyboard_layout_romanian" msgid="8698989892731726903">"الرومانية"</string> </resources> diff --git a/packages/InputDevices/res/values-cs/strings.xml b/packages/InputDevices/res/values-cs/strings.xml index 6a46b1473089..c7a489672bb0 100644 --- a/packages/InputDevices/res/values-cs/strings.xml +++ b/packages/InputDevices/res/values-cs/strings.xml @@ -56,6 +56,5 @@ <string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"černohorština (latinka)"</string> <string name="keyboard_layout_serbian_cyrillic" msgid="7013541044323542196">"srbština (cyrilice)"</string> <string name="keyboard_layout_montenegrin_cyrillic" msgid="2391253952894077421">"černohorština (cyrilice)"</string> - <!-- no translation found for keyboard_layout_romanian (8698989892731726903) --> - <skip /> + <string name="keyboard_layout_romanian" msgid="8698989892731726903">"rumunština"</string> </resources> diff --git a/packages/InputDevices/res/values-iw/strings.xml b/packages/InputDevices/res/values-iw/strings.xml index 4cf8098fded7..85f9656dedde 100644 --- a/packages/InputDevices/res/values-iw/strings.xml +++ b/packages/InputDevices/res/values-iw/strings.xml @@ -56,6 +56,5 @@ <string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"מונטנגרית (לטינית)"</string> <string name="keyboard_layout_serbian_cyrillic" msgid="7013541044323542196">"סרבית (אותיות קיריליות)"</string> <string name="keyboard_layout_montenegrin_cyrillic" msgid="2391253952894077421">"מונטנגרית (אותיות קיריליות)"</string> - <!-- no translation found for keyboard_layout_romanian (8698989892731726903) --> - <skip /> + <string name="keyboard_layout_romanian" msgid="8698989892731726903">"רומנית"</string> </resources> diff --git a/packages/InputDevices/res/values-si/strings.xml b/packages/InputDevices/res/values-si/strings.xml index 373dfda87874..78d10101358e 100644 --- a/packages/InputDevices/res/values-si/strings.xml +++ b/packages/InputDevices/res/values-si/strings.xml @@ -56,6 +56,5 @@ <string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"මොන්ටෙනේග්රීන් (ලතින්)"</string> <string name="keyboard_layout_serbian_cyrillic" msgid="7013541044323542196">"සර්බියානු (සිරිලික්)"</string> <string name="keyboard_layout_montenegrin_cyrillic" msgid="2391253952894077421">"මොන්ටෙනේග්රීන් (සිරිලික්)"</string> - <!-- no translation found for keyboard_layout_romanian (8698989892731726903) --> - <skip /> + <string name="keyboard_layout_romanian" msgid="8698989892731726903">"රුමේනියානු"</string> </resources> diff --git a/packages/InputDevices/res/values-sq/strings.xml b/packages/InputDevices/res/values-sq/strings.xml index 36882cbf7986..066129e87769 100644 --- a/packages/InputDevices/res/values-sq/strings.xml +++ b/packages/InputDevices/res/values-sq/strings.xml @@ -56,6 +56,5 @@ <string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Malazisht (latine)"</string> <string name="keyboard_layout_serbian_cyrillic" msgid="7013541044323542196">"Serbisht (cirilike)"</string> <string name="keyboard_layout_montenegrin_cyrillic" msgid="2391253952894077421">"Malazisht (cirilike)"</string> - <!-- no translation found for keyboard_layout_romanian (8698989892731726903) --> - <skip /> + <string name="keyboard_layout_romanian" msgid="8698989892731726903">"Rumanisht"</string> </resources> diff --git a/packages/InputDevices/res/values-uk/strings.xml b/packages/InputDevices/res/values-uk/strings.xml index 1010177539b1..01d34e362c7f 100644 --- a/packages/InputDevices/res/values-uk/strings.xml +++ b/packages/InputDevices/res/values-uk/strings.xml @@ -56,6 +56,5 @@ <string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Чорногорська (латиниця)"</string> <string name="keyboard_layout_serbian_cyrillic" msgid="7013541044323542196">"Сербська (кирилиця)"</string> <string name="keyboard_layout_montenegrin_cyrillic" msgid="2391253952894077421">"Чорногорська (кирилиця)"</string> - <!-- no translation found for keyboard_layout_romanian (8698989892731726903) --> - <skip /> + <string name="keyboard_layout_romanian" msgid="8698989892731726903">"Румунська"</string> </resources> diff --git a/packages/InputDevices/res/values-uz/strings.xml b/packages/InputDevices/res/values-uz/strings.xml index 92e00d81c622..e63fc09b8d00 100644 --- a/packages/InputDevices/res/values-uz/strings.xml +++ b/packages/InputDevices/res/values-uz/strings.xml @@ -56,6 +56,5 @@ <string name="keyboard_layout_montenegrin_latin" msgid="1467832503378949945">"Chernogor (lotin)"</string> <string name="keyboard_layout_serbian_cyrillic" msgid="7013541044323542196">"Serb (kirill)"</string> <string name="keyboard_layout_montenegrin_cyrillic" msgid="2391253952894077421">"Chernogor (kirill)"</string> - <!-- no translation found for keyboard_layout_romanian (8698989892731726903) --> - <skip /> + <string name="keyboard_layout_romanian" msgid="8698989892731726903">"Rumin"</string> </resources> diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml index 21da3e913df3..0d9920e4cdfe 100644 --- a/packages/PackageInstaller/res/values-ko/strings.xml +++ b/packages/PackageInstaller/res/values-ko/strings.xml @@ -78,7 +78,7 @@ <string name="uninstalling" msgid="8709566347688966845">"제거 중..."</string> <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 제거 중…"</string> <string name="uninstall_done" msgid="439354138387969269">"제거를 완료했습니다."</string> - <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>를 제거했습니다."</string> + <string name="uninstall_done_app" msgid="4588850984473605768">"앱(<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>)을 삭제했습니다."</string> <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 복제 삭제됨"</string> <string name="uninstall_failed" msgid="1847750968168364332">"제거하지 못했습니다."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>을(를) 제거하지 못했습니다."</string> diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt index 51813a1c9aab..adffd206d552 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt @@ -18,16 +18,22 @@ package com.android.settingslib.graph import android.app.Application import android.os.Bundle +import android.os.SystemClock import com.android.settingslib.graph.proto.PreferenceGraphProto import com.android.settingslib.ipc.ApiHandler +import com.android.settingslib.ipc.ApiPermissionChecker import com.android.settingslib.ipc.MessageCodec +import com.android.settingslib.metadata.PreferenceRemoteOpMetricsLogger import com.android.settingslib.metadata.PreferenceScreenRegistry import com.android.settingslib.preference.PreferenceScreenProvider import java.util.Locale /** API to get preference graph. */ -abstract class GetPreferenceGraphApiHandler( - private val preferenceScreenProviders: Set<Class<out PreferenceScreenProvider>> +class GetPreferenceGraphApiHandler( + override val id: Int, + private val permissionChecker: ApiPermissionChecker<GetPreferenceGraphRequest>, + private val metricsLogger: PreferenceRemoteOpMetricsLogger? = null, + private val preferenceScreenProviders: Set<Class<out PreferenceScreenProvider>> = emptySet(), ) : ApiHandler<GetPreferenceGraphRequest, PreferenceGraphProto> { override val requestCodec: MessageCodec<GetPreferenceGraphRequest> @@ -36,22 +42,42 @@ abstract class GetPreferenceGraphApiHandler( override val responseCodec: MessageCodec<PreferenceGraphProto> get() = PreferenceGraphProtoCodec + override fun hasPermission( + application: Application, + callingPid: Int, + callingUid: Int, + request: GetPreferenceGraphRequest, + ) = permissionChecker.hasPermission(application, callingPid, callingUid, request) + override suspend fun invoke( application: Application, callingPid: Int, callingUid: Int, request: GetPreferenceGraphRequest, ): PreferenceGraphProto { - val builder = PreferenceGraphBuilder.of(application, callingPid, callingUid, request) - if (request.screenKeys.isEmpty()) { - PreferenceScreenRegistry.preferenceScreenMetadataFactories.forEachKeyAsync { - builder.addPreferenceScreenFromRegistry(it) - } - for (provider in preferenceScreenProviders) { - builder.addPreferenceScreenProvider(provider) + val elapsedRealtime = SystemClock.elapsedRealtime() + var success = false + try { + val builder = PreferenceGraphBuilder.of(application, callingPid, callingUid, request) + if (request.screenKeys.isEmpty()) { + PreferenceScreenRegistry.preferenceScreenMetadataFactories.forEachKeyAsync { + builder.addPreferenceScreenFromRegistry(it) + } + for (provider in preferenceScreenProviders) { + builder.addPreferenceScreenProvider(provider) + } } + val result = builder.build() + success = true + return result + } finally { + metricsLogger?.logGraphApi( + application, + callingUid, + success, + SystemClock.elapsedRealtime() - elapsedRealtime, + ) } - return builder.build() } } diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGetterApi.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGetterApi.kt index 6fc6b5405eb2..a9958b975fc6 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGetterApi.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGetterApi.kt @@ -17,6 +17,7 @@ package com.android.settingslib.graph import android.app.Application +import android.os.SystemClock import androidx.annotation.IntDef import com.android.settingslib.graph.proto.PreferenceProto import com.android.settingslib.ipc.ApiDescriptor @@ -24,6 +25,7 @@ import com.android.settingslib.ipc.ApiHandler import com.android.settingslib.ipc.ApiPermissionChecker import com.android.settingslib.metadata.PreferenceCoordinate import com.android.settingslib.metadata.PreferenceHierarchyNode +import com.android.settingslib.metadata.PreferenceRemoteOpMetricsLogger import com.android.settingslib.metadata.PreferenceScreenRegistry /** @@ -37,6 +39,7 @@ class PreferenceGetterRequest(val preferences: Array<PreferenceCoordinate>, val /** Error code of preference getter request. */ @Target(AnnotationTarget.TYPE) @IntDef( + PreferenceGetterErrorCode.OK, PreferenceGetterErrorCode.NOT_FOUND, PreferenceGetterErrorCode.DISALLOW, PreferenceGetterErrorCode.INTERNAL_ERROR, @@ -44,6 +47,8 @@ class PreferenceGetterRequest(val preferences: Array<PreferenceCoordinate>, val @Retention(AnnotationRetention.SOURCE) annotation class PreferenceGetterErrorCode { companion object { + /** Preference value is returned. */ + const val OK = 0 /** Preference is not found. */ const val NOT_FOUND = 1 /** Disallow to get preference value (e.g. uid not allowed). */ @@ -80,6 +85,7 @@ class PreferenceGetterApiDescriptor(override val id: Int) : class PreferenceGetterApiHandler( override val id: Int, private val permissionChecker: ApiPermissionChecker<PreferenceGetterRequest>, + private val metricsLogger: PreferenceRemoteOpMetricsLogger? = null, ) : ApiHandler<PreferenceGetterRequest, PreferenceGetterResponse> { override fun hasPermission( @@ -95,14 +101,25 @@ class PreferenceGetterApiHandler( callingUid: Int, request: PreferenceGetterRequest, ): PreferenceGetterResponse { + val elapsedRealtime = SystemClock.elapsedRealtime() val errors = mutableMapOf<PreferenceCoordinate, Int>() val preferences = mutableMapOf<PreferenceCoordinate, PreferenceProto>() val flags = request.flags for ((screenKey, coordinates) in request.preferences.groupBy { it.screenKey }) { val screenMetadata = PreferenceScreenRegistry.create(application, screenKey) if (screenMetadata == null) { + val latencyMs = SystemClock.elapsedRealtime() - elapsedRealtime for (coordinate in coordinates) { errors[coordinate] = PreferenceGetterErrorCode.NOT_FOUND + metricsLogger?.logGetterApi( + application, + callingUid, + coordinate, + null, + null, + PreferenceGetterErrorCode.NOT_FOUND, + latencyMs, + ) } continue } @@ -117,27 +134,48 @@ class PreferenceGetterApiHandler( val node = nodes[coordinate.key] if (node == null) { errors[coordinate] = PreferenceGetterErrorCode.NOT_FOUND + metricsLogger?.logGetterApi( + application, + callingUid, + coordinate, + null, + null, + PreferenceGetterErrorCode.NOT_FOUND, + SystemClock.elapsedRealtime() - elapsedRealtime, + ) continue } val metadata = node.metadata - try { - val preferenceProto = - metadata.toProto( - application, - callingPid, - callingUid, - screenMetadata, - metadata.key == screenMetadata.key, - flags, - ) - if (flags == PreferenceGetterFlags.VALUE && !preferenceProto.hasValue()) { - errors[coordinate] = PreferenceGetterErrorCode.DISALLOW - } else { - preferences[coordinate] = preferenceProto + val errorCode = + try { + val preferenceProto = + metadata.toProto( + application, + callingPid, + callingUid, + screenMetadata, + metadata.key == screenMetadata.key, + flags, + ) + if (flags == PreferenceGetterFlags.VALUE && !preferenceProto.hasValue()) { + PreferenceGetterErrorCode.DISALLOW + } else { + preferences[coordinate] = preferenceProto + PreferenceGetterErrorCode.OK + } + } catch (e: Exception) { + PreferenceGetterErrorCode.INTERNAL_ERROR } - } catch (e: Exception) { - errors[coordinate] = PreferenceGetterErrorCode.INTERNAL_ERROR - } + if (errorCode != PreferenceGetterErrorCode.OK) errors[coordinate] = errorCode + metricsLogger?.logGetterApi( + application, + callingUid, + coordinate, + screenMetadata, + metadata, + errorCode, + SystemClock.elapsedRealtime() - elapsedRealtime, + ) } } return PreferenceGetterResponse(errors, preferences) diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt index 728055c2f837..a595f42a573d 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt @@ -19,6 +19,7 @@ package com.android.settingslib.graph import android.app.Application import android.content.Context import android.os.Bundle +import android.os.SystemClock import androidx.annotation.IntDef import com.android.settingslib.graph.proto.PreferenceValueProto import com.android.settingslib.ipc.ApiDescriptor @@ -29,7 +30,9 @@ import com.android.settingslib.ipc.MessageCodec import com.android.settingslib.metadata.IntRangeValuePreference import com.android.settingslib.metadata.PersistentPreference import com.android.settingslib.metadata.PreferenceAvailabilityProvider +import com.android.settingslib.metadata.PreferenceCoordinate import com.android.settingslib.metadata.PreferenceMetadata +import com.android.settingslib.metadata.PreferenceRemoteOpMetricsLogger import com.android.settingslib.metadata.PreferenceRestrictionProvider import com.android.settingslib.metadata.PreferenceScreenRegistry import com.android.settingslib.metadata.ReadWritePermit @@ -97,6 +100,7 @@ class PreferenceSetterApiDescriptor(override val id: Int) : class PreferenceSetterApiHandler( override val id: Int, private val permissionChecker: ApiPermissionChecker<PreferenceSetterRequest>, + private val metricsLogger: PreferenceRemoteOpMetricsLogger? = null, ) : ApiHandler<PreferenceSetterRequest, Int> { override fun hasPermission( @@ -112,21 +116,24 @@ class PreferenceSetterApiHandler( callingUid: Int, request: PreferenceSetterRequest, ): Int { + val elapsedRealtime = SystemClock.elapsedRealtime() + fun notFound(): Int { + metricsLogger?.logSetterApi( + application, + callingUid, + PreferenceCoordinate(request.screenKey, request.key), + null, + null, + PreferenceSetterResult.UNSUPPORTED, + SystemClock.elapsedRealtime() - elapsedRealtime, + ) + return PreferenceSetterResult.UNSUPPORTED + } val screenMetadata = - PreferenceScreenRegistry.create(application, request.screenKey) - ?: return PreferenceSetterResult.UNSUPPORTED + PreferenceScreenRegistry.create(application, request.screenKey) ?: return notFound() val key = request.key val metadata = - screenMetadata.getPreferenceHierarchy(application).find(key) - ?: return PreferenceSetterResult.UNSUPPORTED - if (metadata !is PersistentPreference<*>) return PreferenceSetterResult.UNSUPPORTED - if (!metadata.isEnabled(application)) return PreferenceSetterResult.DISABLED - if (metadata is PreferenceRestrictionProvider && metadata.isRestricted(application)) { - return PreferenceSetterResult.RESTRICTED - } - if (metadata is PreferenceAvailabilityProvider && !metadata.isAvailable(application)) { - return PreferenceSetterResult.UNAVAILABLE - } + screenMetadata.getPreferenceHierarchy(application).find(key) ?: return notFound() fun <T> PreferenceMetadata.checkWritePermit(value: T): Int { @Suppress("UNCHECKED_CAST") val preference = (this as PersistentPreference<T>) @@ -141,41 +148,64 @@ class PreferenceSetterApiHandler( } } - val storage = metadata.storage(application) - val value = request.value - try { - if (value.hasBooleanValue()) { - if (metadata.valueType != Boolean::class.javaObjectType) { - return PreferenceSetterResult.INVALID_REQUEST - } - val booleanValue = value.booleanValue - val resultCode = metadata.checkWritePermit(booleanValue) - if (resultCode != PreferenceSetterResult.OK) return resultCode - storage.setBoolean(key, booleanValue) - return PreferenceSetterResult.OK - } else if (value.hasIntValue()) { - val intValue = value.intValue - val resultCode = metadata.checkWritePermit(intValue) - if (resultCode != PreferenceSetterResult.OK) return resultCode - if ( - metadata is IntRangeValuePreference && - !metadata.isValidValue(application, intValue) - ) { - return PreferenceSetterResult.INVALID_REQUEST + fun invoke(): Int { + if (metadata !is PersistentPreference<*>) return PreferenceSetterResult.UNSUPPORTED + if (!metadata.isEnabled(application)) return PreferenceSetterResult.DISABLED + if (metadata is PreferenceRestrictionProvider && metadata.isRestricted(application)) { + return PreferenceSetterResult.RESTRICTED + } + if (metadata is PreferenceAvailabilityProvider && !metadata.isAvailable(application)) { + return PreferenceSetterResult.UNAVAILABLE + } + + val storage = metadata.storage(application) + val value = request.value + try { + if (value.hasBooleanValue()) { + if (metadata.valueType != Boolean::class.javaObjectType) { + return PreferenceSetterResult.INVALID_REQUEST + } + val booleanValue = value.booleanValue + val resultCode = metadata.checkWritePermit(booleanValue) + if (resultCode != PreferenceSetterResult.OK) return resultCode + storage.setBoolean(key, booleanValue) + return PreferenceSetterResult.OK + } else if (value.hasIntValue()) { + val intValue = value.intValue + val resultCode = metadata.checkWritePermit(intValue) + if (resultCode != PreferenceSetterResult.OK) return resultCode + if ( + metadata is IntRangeValuePreference && + !metadata.isValidValue(application, intValue) + ) { + return PreferenceSetterResult.INVALID_REQUEST + } + storage.setInt(key, intValue) + return PreferenceSetterResult.OK + } else if (value.hasFloatValue()) { + val floatValue = value.floatValue + val resultCode = metadata.checkWritePermit(floatValue) + if (resultCode != PreferenceSetterResult.OK) return resultCode + storage.setFloat(key, floatValue) + return PreferenceSetterResult.OK } - storage.setInt(key, intValue) - return PreferenceSetterResult.OK - } else if (value.hasFloatValue()) { - val floatValue = value.floatValue - val resultCode = metadata.checkWritePermit(floatValue) - if (resultCode != PreferenceSetterResult.OK) return resultCode - storage.setFloat(key, floatValue) - return PreferenceSetterResult.OK + } catch (e: Exception) { + return PreferenceSetterResult.INTERNAL_ERROR } - } catch (e: Exception) { - return PreferenceSetterResult.INTERNAL_ERROR + return PreferenceSetterResult.INVALID_REQUEST } - return PreferenceSetterResult.INVALID_REQUEST + + val result = invoke() + metricsLogger?.logSetterApi( + application, + callingUid, + PreferenceCoordinate(request.screenKey, request.key), + screenMetadata, + metadata, + result, + SystemClock.elapsedRealtime() - elapsedRealtime, + ) + return result } override val requestCodec: MessageCodec<PreferenceSetterRequest> diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/Metrics.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/Metrics.kt index 7323488c5299..e532e545cc11 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/Metrics.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/Metrics.kt @@ -16,6 +16,8 @@ package com.android.settingslib.metadata +import android.content.Context + /** Metrics logger for preference actions triggered by user interaction. */ interface PreferenceUiActionMetricsLogger { @@ -28,8 +30,34 @@ interface PreferenceUiActionMetricsLogger { screen: PreferenceScreenMetadata, preference: PreferenceMetadata, value: Any?, - ) {} + ) } /** Metrics logger for preference remote operations (e.g. external get/set). */ -interface PreferenceRemoteOpMetricsLogger +interface PreferenceRemoteOpMetricsLogger { + + /** Logs get preference metadata operation. */ + fun logGetterApi( + context: Context, + callingUid: Int, + preferenceCoordinate: PreferenceCoordinate, + screen: PreferenceScreenMetadata?, + preference: PreferenceMetadata?, + errorCode: Int, + latencyMs: Long, + ) + + /** Logs set preference value operation. */ + fun logSetterApi( + context: Context, + callingUid: Int, + preferenceCoordinate: PreferenceCoordinate, + screen: PreferenceScreenMetadata?, + preference: PreferenceMetadata?, + errorCode: Int, + latencyMs: Long, + ) + + /** Logs get preference graph operation. */ + fun logGraphApi(context: Context, callingUid: Int, success: Boolean, latencyMs: Long) +} diff --git a/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceGraphApi.kt b/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceGraphApi.kt deleted file mode 100644 index ae9642a38778..000000000000 --- a/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceGraphApi.kt +++ /dev/null @@ -1,40 +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.settingslib.service - -import android.app.Application -import com.android.settingslib.graph.GetPreferenceGraphApiHandler -import com.android.settingslib.graph.GetPreferenceGraphRequest -import com.android.settingslib.ipc.ApiPermissionChecker -import com.android.settingslib.preference.PreferenceScreenProvider - -/** Api to get preference graph. */ -internal class PreferenceGraphApi( - preferenceScreenProviders: Set<Class<out PreferenceScreenProvider>>, - private val permissionChecker: ApiPermissionChecker<GetPreferenceGraphRequest>, -) : GetPreferenceGraphApiHandler(preferenceScreenProviders) { - - override val id: Int - get() = API_GET_PREFERENCE_GRAPH - - override fun hasPermission( - application: Application, - callingPid: Int, - callingUid: Int, - request: GetPreferenceGraphRequest, - ) = permissionChecker.hasPermission(application, callingPid, callingUid, request) -} diff --git a/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceService.kt b/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceService.kt index 7cb36db856eb..5def592a1afa 100644 --- a/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceService.kt +++ b/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceService.kt @@ -16,6 +16,7 @@ package com.android.settingslib.service +import com.android.settingslib.graph.GetPreferenceGraphApiHandler import com.android.settingslib.graph.GetPreferenceGraphRequest import com.android.settingslib.graph.PreferenceGetterApiHandler import com.android.settingslib.graph.PreferenceGetterRequest @@ -25,6 +26,7 @@ import com.android.settingslib.ipc.ApiHandler import com.android.settingslib.ipc.ApiPermissionChecker import com.android.settingslib.ipc.MessengerService import com.android.settingslib.ipc.PermissionChecker +import com.android.settingslib.metadata.PreferenceRemoteOpMetricsLogger import com.android.settingslib.preference.PreferenceScreenProvider /** @@ -40,16 +42,26 @@ open class PreferenceService( graphPermissionChecker: ApiPermissionChecker<GetPreferenceGraphRequest>? = null, setterPermissionChecker: ApiPermissionChecker<PreferenceSetterRequest>? = null, getterPermissionChecker: ApiPermissionChecker<PreferenceGetterRequest>? = null, + metricsLogger: PreferenceRemoteOpMetricsLogger? = null, vararg apiHandlers: ApiHandler<*, *>, ) : MessengerService( mutableListOf<ApiHandler<*, *>>().apply { - graphPermissionChecker?.let { add(PreferenceGraphApi(preferenceScreenProviders, it)) } + graphPermissionChecker?.let { + add( + GetPreferenceGraphApiHandler( + API_GET_PREFERENCE_GRAPH, + it, + metricsLogger, + preferenceScreenProviders, + ) + ) + } setterPermissionChecker?.let { - add(PreferenceSetterApiHandler(API_PREFERENCE_SETTER, it)) + add(PreferenceSetterApiHandler(API_PREFERENCE_SETTER, it, metricsLogger)) } getterPermissionChecker?.let { - add(PreferenceGetterApiHandler(API_PREFERENCE_GETTER, it)) + add(PreferenceGetterApiHandler(API_PREFERENCE_GETTER, it, metricsLogger)) } addAll(apiHandlers) }, diff --git a/packages/SettingsLib/SettingsTheme/res/values-af/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-af/strings.xml index eb48b4ec2515..92bf10164c24 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-af/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-af/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Vou uit"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Vou in"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-am/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-am/strings.xml index 442819244b25..24811e4ca570 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-am/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-am/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ዘርጋ"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"ሰብስብ"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ar/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ar/strings.xml index e6d4c7b6cd19..87a7f29f4ba8 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ar/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ar/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"توسيع"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"تصغير"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-as/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-as/strings.xml index 2b5a5c98b98c..094650753503 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-as/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-as/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"বিস্তাৰ কৰক"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"সংকোচন কৰক"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"অগ্ৰাহ্য কৰক"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-az/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-az/strings.xml index c7adee3095f2..6bbc371f7643 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-az/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-az/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Genişləndirin"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Yığcamlaşdırın"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-b+sr+Latn/strings.xml index 8b245a63cd91..02e1e3a1eca1 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-b+sr+Latn/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Proširi"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Skupi"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Odbacite"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-be/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-be/strings.xml index b468f819397a..df590aba9b84 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-be/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-be/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Разгарнуць"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Згарнуць"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-bg/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-bg/strings.xml index b177fa76a7d9..fde9b66a93e0 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-bg/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-bg/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Разгъване"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Свиване"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-bn/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-bn/strings.xml index 67bb59fab828..78e081ff9a3f 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-bn/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-bn/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"বড় করুন"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"আড়াল করুন"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-bs/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-bs/strings.xml index 31afc8b07002..a0af83bd7685 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-bs/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-bs/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Proširi"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Suzi"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Odbaci"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ca/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ca/strings.xml index 0f999c9a20e2..c656456df0f7 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ca/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ca/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Desplega"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Replega"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-cs/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-cs/strings.xml index 144dba82e50b..0c1e5a7c23d2 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-cs/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-cs/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Rozbalit"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Sbalit"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-da/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-da/strings.xml index 85497f143ef9..50d06c3cb613 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-da/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-da/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Udvid"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Skjul"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-de/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-de/strings.xml index 9e47741a0945..13cee4b71e60 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-de/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-de/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Maximieren"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Minimieren"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-el/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-el/strings.xml index 0b325b5ac4cd..9b3f66f79540 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-el/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-el/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Ανάπτυξη"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Σύμπτυξη"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-en-rAU/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-en-rAU/strings.xml index 2539aa040a60..5dd479898b81 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-en-rAU/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Expand"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Collapse"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-en-rCA/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-en-rCA/strings.xml index 2539aa040a60..bb98403afa91 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-en-rCA/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Expand"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Collapse"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Dismiss"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-en-rGB/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-en-rGB/strings.xml index 2539aa040a60..5dd479898b81 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-en-rGB/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Expand"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Collapse"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-en-rIN/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-en-rIN/strings.xml index 2539aa040a60..5dd479898b81 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-en-rIN/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Expand"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Collapse"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-es-rUS/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-es-rUS/strings.xml index c976a2ed7757..39906176c553 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-es-rUS/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Expandir"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Contraer"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-es/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-es/strings.xml index 72ba9d11ecf1..5e5c6ab35d9a 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-es/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-es/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Mostrar"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Ocultar"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-et/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-et/strings.xml index 856360669354..9b32826ca658 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-et/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-et/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Laienda"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Ahenda"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-eu/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-eu/strings.xml index d8c2c35aed31..5fca617bd412 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-eu/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-eu/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Zabaldu"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Tolestu"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-fa/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-fa/strings.xml index 24087411b5b9..ed8f42a6fe2d 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-fa/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-fa/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ازهم بازکردن"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"جمع کردن"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-fi/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-fi/strings.xml index 0d226bf8bbe6..da7b321df38d 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-fi/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-fi/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Laajenna"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Tiivistä"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-fr-rCA/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-fr-rCA/strings.xml index fecfaa275e5e..443131aab0c1 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-fr-rCA/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Développer"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Réduire"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-fr/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-fr/strings.xml index fecfaa275e5e..443131aab0c1 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-fr/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-fr/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Développer"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Réduire"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-gl/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-gl/strings.xml index 7999aa1b4658..1da2701c40dd 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-gl/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-gl/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Despregar"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Contraer"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-gu/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-gu/strings.xml index 1457d34d3691..2bf8eea96684 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-gu/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-gu/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"મોટું કરો"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"નાનું કરો"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-hi/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-hi/strings.xml index 856379aaea84..8dec2a0164a0 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-hi/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-hi/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"बड़ा करें"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"छोटा करें"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-hr/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-hr/strings.xml index 2d637f4a94c0..9d95ca936b10 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-hr/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-hr/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Proširi"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Sažmi"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Odbaci"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-hu/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-hu/strings.xml index 42731635f35c..f1cf20091658 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-hu/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-hu/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Kibontás"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Összecsukás"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-hy/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-hy/strings.xml index 2fc65f0cb149..7e184c665de8 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-hy/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-hy/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Ծավալել"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Ծալել"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-in/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-in/strings.xml index 97c1d602b94a..4bce40172d27 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-in/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-in/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Luaskan"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Ciutkan"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-is/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-is/strings.xml index cc4d05bc869c..d902452d03bc 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-is/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-is/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Stækka"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Minnka"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-it/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-it/strings.xml index 8edcf2450b22..1dad608f8f76 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-it/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-it/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Espandi"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Comprimi"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-iw/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-iw/strings.xml index 784bd8e34789..154695f2c796 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-iw/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-iw/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"הרחבה"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"כיווץ"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ja/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ja/strings.xml index 4e7287c4eedd..c1c53e0aae04 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ja/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ja/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"開く"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"閉じる"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ka/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ka/strings.xml index ec8f1ddaad7d..ab8b37092c84 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ka/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ka/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"გაფართოება"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"ჩაკეცვა"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"დახურვა"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-kk/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-kk/strings.xml index 329ccbbcddde..11e3389e934c 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-kk/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-kk/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Жаю"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Жию"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-km/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-km/strings.xml index 5ca0269e8eb8..97f29c4c7dcc 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-km/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-km/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ពង្រីក"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"បង្រួម"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-kn/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-kn/strings.xml index 3fc1fcc728a7..19688058c640 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-kn/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-kn/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ವಿಸ್ತೃತಗೊಳಿಸಿ"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"ಕುಗ್ಗಿಸಿ"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ko/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ko/strings.xml index 05d4921064cc..db6f20872a1d 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ko/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ko/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"펼치기"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"접기"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ky/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ky/strings.xml index 4f5b8dc3643d..2a48e8e41b3a 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ky/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ky/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Жайып көрсөтүү"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Жыйыштыруу"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-lo/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-lo/strings.xml index d6ec47939596..4e48b900563c 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-lo/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-lo/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ຂະຫຍາຍ"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"ຫຍໍ້ລົງ"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"ປິດໄວ້"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-lt/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-lt/strings.xml index 54076c4fd3c2..a79877adb536 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-lt/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-lt/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Išskleisti"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Sutraukti"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Uždaryti"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-lv/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-lv/strings.xml index 2f87b0eb7abe..016620d73c25 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-lv/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-lv/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Izvērst"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Sakļaut"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-mk/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-mk/strings.xml index b4f8fb901e26..459b4daeb2cf 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-mk/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-mk/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Прошири"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Собери"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ml/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ml/strings.xml index c68141e31d96..2ce7c427c831 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ml/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ml/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"വികസിപ്പിക്കുക"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"ചുരുക്കുക"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-mn/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-mn/strings.xml index 86b333d115d0..e895d4d884cd 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-mn/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-mn/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Дэлгэх"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Хураах"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-mr/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-mr/strings.xml index db9d42280528..26640cc895d0 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-mr/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-mr/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"विस्तार करा"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"कोलॅप्स करा"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"डिसमिस करा"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ms/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ms/strings.xml index 1ffa5a083575..31a93ad67e85 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ms/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ms/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Kembangkan"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Kuncupkan"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Ketepikan"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-my/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-my/strings.xml index 6f79acc6e8ad..fa854f67b8ba 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-my/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-my/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ပိုပြပါ"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"လျှော့ပြပါ"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-nb/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-nb/strings.xml index 359c9abe316e..1a5652b3bdc3 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-nb/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-nb/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Vis"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Skjul"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ne/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ne/strings.xml index 374fd31129c9..d9badf853557 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ne/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ne/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"एक्स्पान्ड गर्नुहोस्"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"कोल्याप्स गर्नुहोस्"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-nl/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-nl/strings.xml index 76a4f9996340..6a904028cf24 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-nl/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-nl/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Uitvouwen"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Samenvouwen"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-or/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-or/strings.xml index 1e1e87025986..f8c665d22b65 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-or/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-or/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ବିସ୍ତାର କରନ୍ତୁ"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"ସଙ୍କୁଚିତ କରନ୍ତୁ"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-pa/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-pa/strings.xml index 48a756b81c9c..fd641d9e3db9 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-pa/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-pa/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ਵਿਸਤਾਰ ਕਰੋ"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"ਸਮੇਟੋ"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-pl/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-pl/strings.xml index da273b3bd137..ad3bf851e34b 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-pl/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-pl/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Rozwiń"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Zwiń"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Zamknij"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-pt-rBR/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-pt-rBR/strings.xml index 4e3d0e624d16..b18b025dfb2f 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-pt-rBR/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Abrir"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Fechar"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Dispensar"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-pt-rPT/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-pt-rPT/strings.xml index 58bd936a8bae..185e7bdc4c3c 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-pt-rPT/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Expandir"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Reduzir"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Ignorar"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-pt/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-pt/strings.xml index 4e3d0e624d16..b18b025dfb2f 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-pt/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-pt/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Abrir"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Fechar"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Dispensar"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ro/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ro/strings.xml index ec208843efa4..1471a64708a1 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ro/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ro/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Extinde"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Restrânge"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ru/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ru/strings.xml index ba6ab9687d41..324dd7405d6f 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ru/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ru/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Развернуть"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Свернуть"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-si/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-si/strings.xml index 9adb6466c9a4..e7351cda575b 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-si/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-si/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"දිග හරින්න"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"හකුළන්න"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"අස් කරන්න"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-sk/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-sk/strings.xml index 574ee839a089..64ad93730023 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-sk/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-sk/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Rozbaliť"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Zbaliť"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Zavrieť"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-sl/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-sl/strings.xml index 6fd67c59ff3d..aeb2743c9e9e 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-sl/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-sl/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Razširi"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Strni"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-sq/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-sq/strings.xml index e02ecbfada36..05205a89188b 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-sq/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-sq/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Zgjero"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Palos"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-sr/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-sr/strings.xml index 35f6aa3a635a..376276bb48c7 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-sr/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-sr/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Прошири"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Скупи"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"Одбаците"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-sv/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-sv/strings.xml index 241683984626..0d0539864ea5 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-sv/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-sv/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Utöka"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Komprimera"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-sw/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-sw/strings.xml index 9a6075842a22..03f5565cc170 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-sw/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-sw/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Panua"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Kunja"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ta/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ta/strings.xml index 4a0fb4d96e03..790efbf31774 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ta/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ta/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"விரிவாக்கும்"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"சுருக்கும்"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-te/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-te/strings.xml index 706e225560c1..6a0c6603757c 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-te/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-te/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"విస్తరించండి"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"కుదించండి"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-th/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-th/strings.xml index d6dce9c076c9..c1453e9ba056 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-th/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-th/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"ขยาย"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"ยุบ"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-tl/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-tl/strings.xml index ef5825ff1c3e..704aeb405ed0 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-tl/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-tl/strings.xml @@ -19,4 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"I-expand"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"I-collapse"</string> + <string name="settingslib_dismiss_button_content_description" msgid="6466433970910120385">"I-dismiss"</string> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-tr/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-tr/strings.xml index 8c7dbcfd987a..b4a27d30f11a 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-tr/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-tr/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Genişlet"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Daralt"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-uk/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-uk/strings.xml index 6da0ca81450e..7670d0ea5a58 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-uk/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-uk/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Розгорнути"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Згорнути"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-ur/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-ur/strings.xml index 2e020b4e0676..82e0323d4206 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-ur/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-ur/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"پھیلائیں"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"سکیڑیں"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-uz/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-uz/strings.xml index 16e389b88405..e8a69b4bd62a 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-uz/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-uz/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Yoyish"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Yopish"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml index ec67d068123a..a6fe6ec94e01 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v31/styles_expressive.xml @@ -104,18 +104,6 @@ <item name="android:layout_width">match_parent</item> </style> - <style name="SettingslibTextAppearance.LinkableTextStyle.Expressive" - parent="@style/TextAppearance.SettingsLib.LabelLarge"> - <item name="android:textColor">?android:attr/colorAccent</item> - </style> - - <style name="SettingslibTextButtonStyle.Expressive" - parent="@style/Widget.Material3Expressive.Button.TextButton.Icon"> - <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - </style> - <style name="SettingsLibCardStyle" parent=""> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> diff --git a/packages/SettingsLib/SettingsTheme/res/values-vi/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-vi/strings.xml index 46f3351b7964..b115eb665f72 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-vi/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-vi/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Mở rộng"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Thu gọn"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-zh-rCN/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-zh-rCN/strings.xml index ea5f29b2413b..779fff880ae1 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-zh-rCN/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"展开"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"收起"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-zh-rHK/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-zh-rHK/strings.xml index 36203139566c..9d5de5b6f9c8 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-zh-rHK/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"展開"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"收合"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-zh-rTW/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-zh-rTW/strings.xml index 36203139566c..9d5de5b6f9c8 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-zh-rTW/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"展開"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"收合"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-zu/strings.xml b/packages/SettingsLib/SettingsTheme/res/values-zu/strings.xml index 725d8bc27b2f..c8d5ff080ee9 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-zu/strings.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-zu/strings.xml @@ -19,4 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_expressive_text_expand" msgid="7520894876795775876">"Nweba"</string> <string name="settingslib_expressive_text_collapse" msgid="5625043934702341576">"Goqa"</string> + <!-- no translation found for settingslib_dismiss_button_content_description (6466433970910120385) --> + <skip /> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml index f73e100906c8..686c1488fb62 100644 --- a/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml +++ b/packages/SettingsLib/SettingsTheme/res/values/styles_expressive.xml @@ -250,4 +250,16 @@ <item name="android:lineHeight" tools:targetApi="28">16sp</item> <item name="android:textAllCaps">false</item> </style> + + <style name="SettingslibTextAppearance.LinkableTextStyle.Expressive" + parent="@style/TextAppearance.SettingsLib.LabelLarge"> + <item name="android:textColor">?android:attr/colorAccent</item> + </style> + + <style name="SettingslibTextButtonStyle.Expressive" + parent="@style/Widget.Material3Expressive.Button.TextButton.Icon"> + <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> </resources>
\ No newline at end of file diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index c1c3e04d46fd..14b2dfe414a4 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -214,6 +214,17 @@ public class SettingsBackupAgent extends BackupAgentHelper { "failed_to_restore_softap_config"; private static final String ERROR_FAILED_TO_RESTORE_WIFI_CONFIG = "failed_to_restore_wifi_config"; + private static final String ERROR_FAILED_TO_RESTORE_SIM_SPECIFIC_SETTINGS = + "failed_to_restore_sim_specific_settings"; + private static final String ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES = + "failed_to_convert_network_policies"; + private static final String ERROR_UNKNOWN_BACKUP_SERIALIZATION_VERSION = + "unknown_backup_serialization_version"; + private static final String INTERRUPTED_EXCEPTION = "interrupted_exception"; + private static final String ERROR_FAILED_TO_RETRIEVE_WIFI_SETTINGS_BACKUP_DATA = + "failed_to_retrieve_wifi_settings_backup_data"; + private static final String ERROR_FAILED_TO_RESTORE_WIFI_SETTINGS_BACKUP_DATA = + "failed_to_restore_wifi_settings_backup_data"; // Name of the temporary file we use during full backup/restore. This is @@ -1436,6 +1447,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { try { out.writeInt(NETWORK_POLICIES_BACKUP_VERSION); out.writeInt(policies.length); + int numberOfPoliciesBackedUp = 0; for (NetworkPolicy policy : policies) { // We purposefully only backup policies that the user has // defined; any inferred policies might include @@ -1445,13 +1457,25 @@ public class SettingsBackupAgent extends BackupAgentHelper { out.writeByte(BackupUtils.NOT_NULL); out.writeInt(marshaledPolicy.length); out.write(marshaledPolicy); + if (areAgentMetricsEnabled) { + numberOfPoliciesBackedUp++; + } } else { out.writeByte(BackupUtils.NULL); } } + if (areAgentMetricsEnabled) { + numberOfSettingsPerKey.put(KEY_NETWORK_POLICIES, numberOfPoliciesBackedUp); + } } catch (IOException ioe) { Log.e(TAG, "Failed to convert NetworkPolicies to byte array " + ioe.getMessage()); baos.reset(); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsBackupFailed( + KEY_NETWORK_POLICIES, + policies.length, + ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES); + } } } return baos.toByteArray(); @@ -1502,6 +1526,12 @@ public class SettingsBackupAgent extends BackupAgentHelper { try { int version = in.readInt(); if (version < 1 || version > NETWORK_POLICIES_BACKUP_VERSION) { + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsRestoreFailed( + KEY_NETWORK_POLICIES, + /* count= */ 1, + ERROR_UNKNOWN_BACKUP_SERIALIZATION_VERSION); + } throw new BackupUtils.BadVersionException( "Unknown Backup Serialization Version"); } @@ -1518,10 +1548,20 @@ public class SettingsBackupAgent extends BackupAgentHelper { } // Only set the policies if there was no error in the restore operation networkPolicyManager.setNetworkPolicies(policies); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger + .logItemsRestored(KEY_NETWORK_POLICIES, policies.length); + } } catch (NullPointerException | IOException | BackupUtils.BadVersionException | DateTimeException e) { // NPE can be thrown when trying to instantiate a NetworkPolicy Log.e(TAG, "Failed to convert byte array to NetworkPolicies " + e.getMessage()); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsRestoreFailed( + KEY_NETWORK_POLICIES, + /* count= */ 1, + ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES); + } } } } @@ -1592,7 +1632,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { return true; } - private byte[] getSimSpecificSettingsData() { + @VisibleForTesting + byte[] getSimSpecificSettingsData() { byte[] simSpecificData = new byte[0]; PackageManager packageManager = getBaseContext().getPackageManager(); if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { @@ -1600,17 +1641,36 @@ public class SettingsBackupAgent extends BackupAgentHelper { simSpecificData = subManager.getAllSimSpecificSettingsForBackup(); Log.i(TAG, "sim specific data of length + " + simSpecificData.length + " successfully retrieved"); + if (areAgentMetricsEnabled) { + // We're unable to determine how many settings this includes, so we'll just log 1. + numberOfSettingsPerKey.put(KEY_SIM_SPECIFIC_SETTINGS_2, 1); + } } return simSpecificData; } - private void restoreSimSpecificSettings(byte[] data) { + @VisibleForTesting + void restoreSimSpecificSettings(byte[] data) { PackageManager packageManager = getBaseContext().getPackageManager(); boolean hasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); if (hasTelephony) { SubscriptionManager subManager = SubscriptionManager.from(getBaseContext()); - subManager.restoreAllSimSpecificSettingsFromBackup(data); + if (areAgentMetricsEnabled) { + try { + subManager.restoreAllSimSpecificSettingsFromBackup(data); + mBackupRestoreEventLogger + .logItemsRestored(KEY_SIM_SPECIFIC_SETTINGS_2, /* count= */ 1); + } catch (Exception e) { + mBackupRestoreEventLogger + .logItemsRestoreFailed( + KEY_SIM_SPECIFIC_SETTINGS_2, + /* count= */ 1, + ERROR_FAILED_TO_RESTORE_SIM_SPECIFIC_SETTINGS); + } + } else { + subManager.restoreAllSimSpecificSettingsFromBackup(data); + } } } @@ -1637,20 +1697,49 @@ public class SettingsBackupAgent extends BackupAgentHelper { }); // cts requires B&R with 10 seconds if (latch.await(10, TimeUnit.SECONDS) && backupWifiData.value != null) { + if (areAgentMetricsEnabled) { + numberOfSettingsPerKey.put(KEY_WIFI_SETTINGS_BACKUP_DATA, 1); + } return backupWifiData.value; } } catch (InterruptedException ie) { Log.e(TAG, "fail to retrieveWifiBackupData, " + ie); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsBackupFailed( + KEY_WIFI_SETTINGS_BACKUP_DATA, + /* count= */ 1, + INTERRUPTED_EXCEPTION); + } } Log.e(TAG, "fail to retrieveWifiBackupData"); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsBackupFailed( + KEY_WIFI_SETTINGS_BACKUP_DATA, + /* count= */ 1, + ERROR_FAILED_TO_RETRIEVE_WIFI_SETTINGS_BACKUP_DATA); + } return new byte[0]; } - private void restoreWifiData(byte[] data) { + @VisibleForTesting + void restoreWifiData(byte[] data) { if (DEBUG_BACKUP) { Log.v(TAG, "Applying restored all wifi data"); } - mWifiManager.restoreWifiBackupData(data); + if (areAgentMetricsEnabled) { + try { + mWifiManager.restoreWifiBackupData(data); + mBackupRestoreEventLogger.logItemsRestored( + KEY_WIFI_SETTINGS_BACKUP_DATA, /* count= */ 1); + } catch (Exception e) { + mBackupRestoreEventLogger.logItemsRestoreFailed( + KEY_WIFI_SETTINGS_BACKUP_DATA, + /* count= */ 1, + ERROR_FAILED_TO_RESTORE_WIFI_SETTINGS_BACKUP_DATA); + } + } else { + mWifiManager.restoreWifiBackupData(data); + } } private void updateWindowManagerIfNeeded(Integer previousDensity) { diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 0f6311552de9..c98a741f8254 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -18,10 +18,13 @@ package com.android.providers.settings; import static android.os.Process.FIRST_APPLICATION_UID; +import static com.android.aconfig_new_storage.Flags.enableAconfigStorageDaemon; + import android.aconfig.Aconfig.flag_permission; import android.aconfig.Aconfig.flag_state; import android.aconfig.Aconfig.parsed_flag; import android.aconfig.Aconfig.parsed_flags; +import android.aconfigd.AconfigdFlagInfo; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -65,14 +68,10 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.InputStream; import java.io.IOException; import java.io.PrintWriter; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.attribute.PosixFileAttributes; -import java.nio.file.attribute.PosixFilePermission; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -84,18 +83,6 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.CountDownLatch; -// FOR ACONFIGD TEST MISSION AND ROLLOUT -import java.io.DataInputStream; -import java.io.DataOutputStream; -import android.util.proto.ProtoInputStream; -import android.aconfigd.Aconfigd.StorageRequestMessage; -import android.aconfigd.Aconfigd.StorageRequestMessages; -import android.aconfigd.Aconfigd.StorageReturnMessage; -import android.aconfigd.Aconfigd.StorageReturnMessages; -import android.aconfigd.AconfigdClientSocket; -import android.aconfigd.AconfigdFlagInfo; -import android.aconfigd.AconfigdJavaUtils; -import static com.android.aconfig_new_storage.Flags.enableAconfigStorageDaemon; /** * This class contains the state for one type of settings. It is responsible * for saving the state asynchronously to an XML file after a mutation and @@ -393,22 +380,6 @@ public class SettingsState { getAllAconfigFlagsFromSettings(mAconfigDefaultFlags); } } - - if (isConfigSettingsKey(mKey)) { - requests = handleBulkSyncToNewStorage(mAconfigDefaultFlags); - } - } - - if (enableAconfigStorageDaemon()) { - if (isConfigSettingsKey(mKey)){ - AconfigdClientSocket localSocket = AconfigdJavaUtils.getAconfigdClientSocket(); - if (requests != null) { - InputStream res = localSocket.send(requests.getBytes()); - if (res == null) { - Slog.w(LOG_TAG, "Bulk sync request to acongid failed."); - } - } - } } } @@ -482,87 +453,6 @@ public class SettingsState { return flag; } - - // TODO(b/341764371): migrate aconfig flag push to GMS core - @VisibleForTesting - @GuardedBy("mLock") - public ProtoOutputStream handleBulkSyncToNewStorage( - Map<String, AconfigdFlagInfo> aconfigFlagMap) { - // get marker or add marker if it does not exist - Setting markerSetting = mSettings.get(BULK_SYNC_MARKER); - int localCounter = 0; - if (markerSetting == null) { - markerSetting = new Setting(BULK_SYNC_MARKER, "0", false, "aconfig", "aconfig"); - mSettings.put(BULK_SYNC_MARKER, markerSetting); - } - try { - localCounter = Integer.parseInt(markerSetting.value); - } catch (NumberFormatException e) { - // reset local counter - markerSetting.value = "0"; - } - - if (enableAconfigStorageDaemon()) { - Setting bulkSyncCounter = mSettings.get(BULK_SYNC_TRIGGER_COUNTER); - int serverCounter = 0; - if (bulkSyncCounter != null) { - try { - serverCounter = Integer.parseInt(bulkSyncCounter.value); - } catch (NumberFormatException e) { - // reset the local value of server counter - bulkSyncCounter.value = "0"; - } - } - - boolean shouldSync = localCounter < serverCounter; - if (!shouldSync) { - // CASE 1, flag is on, bulk sync marker true, nothing to do - return null; - } else { - // CASE 2, flag is on, bulk sync marker false. Do following two tasks - // (1) Do bulk sync here. - // (2) After bulk sync, set marker to true. - - // first add storage reset request - ProtoOutputStream requests = new ProtoOutputStream(); - AconfigdJavaUtils.writeResetStorageRequest(requests); - - // loop over all settings and add flag override requests - for (AconfigdFlagInfo flag : aconfigFlagMap.values()) { - // don't sync read_only flags - if (!flag.getIsReadWrite()) { - continue; - } - - if (flag.getHasServerOverride()) { - AconfigdJavaUtils.writeFlagOverrideRequest( - requests, - flag.getPackageName(), - flag.getFlagName(), - flag.getServerFlagValue(), - StorageRequestMessage.SERVER_ON_REBOOT); - } - - if (flag.getHasLocalOverride()) { - AconfigdJavaUtils.writeFlagOverrideRequest( - requests, - flag.getPackageName(), - flag.getFlagName(), - flag.getLocalFlagValue(), - StorageRequestMessage.LOCAL_ON_REBOOT); - } - } - - // mark sync has been done - markerSetting.value = String.valueOf(serverCounter); - scheduleWriteIfNeededLocked(); - return requests; - } - } else { - return null; - } - } - @GuardedBy("mLock") private void loadAconfigDefaultValuesLocked(List<String> filePaths) { for (String fileName : filePaths) { diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java index 6e5b602c02c5..48c360b635ea 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java @@ -18,6 +18,8 @@ package com.android.providers.settings; import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_WIFI_NEW_CONFIG; import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_SOFTAP_CONFIG; +import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_SIM_SPECIFIC_SETTINGS_2; +import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_WIFI_SETTINGS_BACKUP_DATA; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; @@ -59,6 +61,7 @@ import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.provider.settings.validators.SettingsValidators; import android.provider.settings.validators.Validator; +import android.telephony.SubscriptionManager; import android.test.mock.MockContentProvider; import android.test.mock.MockContentResolver; @@ -136,6 +139,7 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { @Mock private BackupDataInput mBackupDataInput; @Mock private BackupDataOutput mBackupDataOutput; @Mock private static WifiManager mWifiManager; + @Mock private static SubscriptionManager mSubscriptionManager; private TestFriendlySettingsBackupAgent mAgentUnderTest; private Context mContext; @@ -906,6 +910,110 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { assertNull(getLoggingResultForDatatype(KEY_WIFI_NEW_CONFIG, mAgentUnderTest)); } + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + getSimSpecificSettingsData_agentMetricsAreEnabled_numberOfSettingsInKeyAreRecorded() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.BACKUP); + when(mSubscriptionManager.getAllSimSpecificSettingsForBackup()).thenReturn(new byte[0]); + + mAgentUnderTest.getSimSpecificSettingsData(); + + assertEquals(mAgentUnderTest.getNumberOfSettingsPerKey(KEY_SIM_SPECIFIC_SETTINGS_2), 1); + } + + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreSimSpecificSettings_agentMetricsAreEnabled_restoreIsSuccessful_successMetricsAreLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doNothing().when(mSubscriptionManager).restoreAllSimSpecificSettingsFromBackup(any()); + + mAgentUnderTest.restoreSimSpecificSettings(new byte[0]); + + DataTypeResult loggingResult = + getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest); + assertNotNull(loggingResult); + assertEquals(loggingResult.getSuccessCount(), 1); + } + + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreSimSpecificSettings_agentMetricsAreEnabled_restoreIsNotSuccessful_failureMetricsAreLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doThrow(new RuntimeException()) + .when(mSubscriptionManager) + .restoreAllSimSpecificSettingsFromBackup(any()); + + mAgentUnderTest.restoreSimSpecificSettings(new byte[0]); + + DataTypeResult loggingResult = + getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest); + assertNotNull(loggingResult); + assertEquals(loggingResult.getFailCount(), 1); + } + + @Test + @DisableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreSimSpecificSettings_agentMetricsAreNotEnabled_metricsAreNotLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doNothing().when(mSubscriptionManager).restoreAllSimSpecificSettingsFromBackup(any()); + + mAgentUnderTest.restoreSimSpecificSettings(new byte[0]); + + assertNull(getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest)); + } + + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreWifiData_agentMetricsAreEnabled_restoreIsSuccessful_successMetricsAreLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doNothing().when(mWifiManager).restoreWifiBackupData(any()); + + mAgentUnderTest.restoreWifiData(new byte[0]); + + DataTypeResult loggingResult = + getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest); + assertNotNull(loggingResult); + assertEquals(loggingResult.getSuccessCount(), 1); + } + + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreWifiData_agentMetricsAreEnabled_restoreIsNotSuccessful_failureMetricsAreLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doThrow(new RuntimeException()).when(mWifiManager).restoreWifiBackupData(any()); + + mAgentUnderTest.restoreWifiData(new byte[0]); + + DataTypeResult loggingResult = + getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest); + assertNotNull(loggingResult); + assertEquals(loggingResult.getFailCount(), 1); + } + + @Test + @DisableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void restoreWifiData_agentMetricsAreDisabled_metricsAreNotLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doNothing().when(mWifiManager).restoreWifiBackupData(any()); + + mAgentUnderTest.restoreWifiData(new byte[0]); + + assertNull(getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest)); + } + private byte[] generateBackupData(Map<String, String> keyValueData) { int totalBytes = 0; for (String key : keyValueData.keySet()) { @@ -1106,10 +1214,14 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { @Override public Object getSystemService(String name) { - if (name.equals(Context.WIFI_SERVICE)) { - return mWifiManager; + switch (name) { + case Context.WIFI_SERVICE: + return mWifiManager; + case Context.TELEPHONY_SUBSCRIPTION_SERVICE: + return mSubscriptionManager; + default: + return super.getSystemService(name); } - return super.getSystemService(name); } } 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 6e7576631147..13eb1d4b2603 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -31,19 +31,20 @@ import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.util.Xml; -import android.util.proto.ProtoOutputStream; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; import com.android.modules.utils.TypedXmlSerializer; -import android.platform.test.annotations.EnableFlags; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.flag.junit.SetFlagsRule; - import com.google.common.base.Strings; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -52,11 +53,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class SettingsStateTest { @@ -1085,124 +1081,6 @@ public class SettingsStateTest { assertTrue(flag1.getHasLocalOverride()); } - @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - - @Test - @EnableFlags(com.android.aconfig_new_storage.Flags.FLAG_ENABLE_ACONFIG_STORAGE_DAEMON) - 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()); - - Map<String, AconfigdFlagInfo> flags = new HashMap<>(); - 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()); - - String bulkSyncMarker = "aconfigd_marker/bulk_synced"; - String bulkSyncCounter = - "core_experiments_team_internal/" + - "BulkSyncTriggerCounterFlag__bulk_sync_trigger_counter"; - - synchronized (lock) { - settingsState.insertSettingLocked(bulkSyncMarker, "0", null, false, "aconfig"); - settingsState.insertSettingLocked(bulkSyncCounter, "1", null, false, - "com.google.android.platform.core_experiments_team_internal"); - - // first bulk sync - ProtoOutputStream requests = settingsState.handleBulkSyncToNewStorage(flags); - assertTrue(requests != null); - String value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue(); - assertEquals("1", value); - - // send time should no longer bulk sync - requests = settingsState.handleBulkSyncToNewStorage(flags); - assertNull(requests); - value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue(); - assertEquals("1", value); - - // won't sync if the marker is string - settingsState.insertSettingLocked(bulkSyncMarker, "true", null, false, "aconfig"); - settingsState.insertSettingLocked(bulkSyncCounter, "0", null, false, - "com.google.android.platform.core_experiments_team_internal"); - requests = settingsState.handleBulkSyncToNewStorage(flags); - assertNull(requests); - value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue(); - assertEquals("0", value); - - // won't sync if the marker and counter value are the same - settingsState.insertSettingLocked(bulkSyncMarker, "1", null, false, "aconfig"); - settingsState.insertSettingLocked(bulkSyncCounter, "1", null, false, - "com.google.android.platform.core_experiments_team_internal"); - requests = settingsState.handleBulkSyncToNewStorage(flags); - assertNull(requests); - value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue(); - assertEquals("1", value); - } - } - - @Test - @DisableFlags(com.android.aconfig_new_storage.Flags.FLAG_ENABLE_ACONFIG_STORAGE_DAEMON) - public void testHandleBulkSyncWithAconfigdDisabled() { - 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()); - - Map<String, AconfigdFlagInfo> flags = new HashMap<>(); - String bulkSyncMarker = "aconfigd_marker/bulk_synced"; - String bulkSyncCounter = - "core_experiments_team_internal/" + - "BulkSyncTriggerCounterFlag__bulk_sync_trigger_counter"; - synchronized (lock) { - settingsState.insertSettingLocked("aconfigd_marker/bulk_synced", - "true", null, false, "aconfig"); - - // when aconfigd is off, should change the marker to false - ProtoOutputStream requests = settingsState.handleBulkSyncToNewStorage(flags); - assertNull(requests); - String value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue(); - assertEquals("0", value); - - // marker started with false value, after call, it should remain false - requests = settingsState.handleBulkSyncToNewStorage(flags); - assertNull(requests); - value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue(); - assertEquals("0", value); - - // won't sync - settingsState.insertSettingLocked(bulkSyncMarker, "0", null, false, "aconfig"); - settingsState.insertSettingLocked(bulkSyncCounter, "1", null, false, - "com.google.android.platform.core_experiments_team_internal"); - requests = settingsState.handleBulkSyncToNewStorage(flags); - assertNull(requests); - value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue(); - assertEquals("0", value); - } - } - @Test public void testGetAllAconfigFlagsFromSettings() throws Exception { final Object lock = new Object(); diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index f753316cb67a..d8d1a74448c5 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -1769,7 +1769,14 @@ flag { flag { name: "bouncer_ui_revamp" namespace: "systemui" - description: "Updates to background (blur), button animations and font changes." + description: "Updates to background (blur) for bouncer" + bug: "370555003" +} + +flag { + name: "bouncer_ui_revamp_2" + namespace: "systemui" + description: "Updates to button animations and font changes for bouncer, bouncer_ui_revamp will cover only the blur changes." bug: "376491880" } @@ -1946,4 +1953,14 @@ flag { namespace: "systemui" description: "Show a rich ongoing notification on the always-on display (depends on ui_rich_ongoing)" bug: "369151941" +} + +flag { + name: "stabilize_heads_up_group_v2" + namespace: "systemui" + description: "Stabilize heads up groups in VisualStabilityCoordinator" + bug: "357753857" + metadata { + purpose: PURPOSE_BUGFIX + } }
\ No newline at end of file diff --git a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/RunTestShouldUseKosmosDetector.kt b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/RunTestShouldUseKosmosDetector.kt new file mode 100644 index 000000000000..4927fb9dc67d --- /dev/null +++ b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/RunTestShouldUseKosmosDetector.kt @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.systemui.lint + +import com.android.tools.lint.detector.api.Category +import com.android.tools.lint.detector.api.Detector +import com.android.tools.lint.detector.api.Implementation +import com.android.tools.lint.detector.api.Issue +import com.android.tools.lint.detector.api.JavaContext +import com.android.tools.lint.detector.api.Scope +import com.android.tools.lint.detector.api.Severity +import com.android.tools.lint.detector.api.SourceCodeScanner +import com.android.tools.lint.detector.api.getReceiver +import com.intellij.psi.PsiMethod +import org.jetbrains.uast.UCallExpression +import org.jetbrains.uast.getContainingUFile + +/** + * Detects test function naming violations regarding use of the backtick-wrapped space-allowed + * feature of Kotlin functions. + */ +class RunTestShouldUseKosmosDetector : Detector(), SourceCodeScanner { + override fun getApplicableMethodNames() = listOf("runTest") + + override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) { + if (method.getReceiver()?.qualifiedName == "kotlinx.coroutines.test.TestScope") { + + val imports = + node.getContainingUFile()?.imports.orEmpty().mapNotNull { + it.importReference?.asSourceString() + } + if (imports.any { it == "com.android.systemui.kosmos.Kosmos" }) { + context.report( + issue = ISSUE, + scope = node, + location = context.getLocation(node.methodIdentifier), + message = + "Prefer Kosmos.runTest to TestScope.runTest in sysui tests that use Kosmos. go/kosmos-runtest", + ) + super.visitMethodCall(context, node, method) + } + } + } + + companion object { + @JvmStatic + val ISSUE = + Issue.create( + id = "RunTestShouldUseKosmos", + briefDescription = "When you can, use Kosmos.runTest instead of TestScope.runTest.", + explanation = + """ + Kosmos.runTest helps to ensure that the test uses the same coroutine + dispatchers that are used in Kosmos fixtures, preventing subtle bugs. + See go/kosmos-runtest + """, + category = Category.TESTING, + priority = 8, + severity = Severity.WARNING, + implementation = + Implementation( + RunTestShouldUseKosmosDetector::class.java, + Scope.JAVA_FILE_SCOPE, + ), + ) + } +} diff --git a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/RunTestShouldUseKosmosDetectorTest.kt b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/RunTestShouldUseKosmosDetectorTest.kt new file mode 100644 index 000000000000..41e90b863fab --- /dev/null +++ b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/RunTestShouldUseKosmosDetectorTest.kt @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.android.internal.systemui.lint + +import com.android.tools.lint.checks.infrastructure.TestFile +import com.android.tools.lint.checks.infrastructure.TestFiles +import com.android.tools.lint.checks.infrastructure.TestLintResult +import com.android.tools.lint.detector.api.Detector +import com.android.tools.lint.detector.api.Issue +import org.junit.Test + +class RunTestShouldUseKosmosDetectorTest : SystemUILintDetectorTest() { + override fun getDetector(): Detector = RunTestShouldUseKosmosDetector() + + override fun getIssues(): List<Issue> = listOf(RunTestShouldUseKosmosDetector.ISSUE) + + @Test + fun wronglyTriesToUseScopeRunTest() { + val runOnSource = + runOnSource( + """ + package test.pkg.name + + import com.android.systemui.kosmos.Kosmos + import kotlinx.coroutines.test.runTest + import kotlinx.coroutines.test.TestScope + import org.junit.Test + + class MyTest { + val scope: TestScope + val kosmos: Kosmos + + @Test + fun badTest() = scope.runTest { + // test code + } + } + """ + ) + + runOnSource + .expectWarningCount(1) + .expect( + """ + src/test/pkg/name/MyTest.kt:13: Warning: Prefer Kosmos.runTest to TestScope.runTest in sysui tests that use Kosmos. go/kosmos-runtest [RunTestShouldUseKosmos] + fun badTest() = scope.runTest { + ~~~~~~~ + 0 errors, 1 warnings + """ + ) + } + + @Test + fun testScopeRunTestIsOKifKosmosNotUsed() { + runOnSource( + """ + package test.pkg.name + + import kotlinx.coroutines.test.runTest + import kotlinx.coroutines.test.TestScope + import org.junit.Test + + class MyTest { + val scope: TestScope + + @Test + fun okTest() = scope.runTest { + // test code + } + } + """ + ) + .expectWarningCount(0) + } + + @Test + fun otherTestScopeMethodsAreOK() { + runOnSource( + """ + package test.pkg.name + + import com.android.systemui.kosmos.Kosmos + import com.android.systemui.kosmos.runTest + import kotlinx.coroutines.test.TestScope + import org.junit.Test + + class MyTest { + val scope: TestScope + val kosmos: Kosmos + + @Test + fun okTest() = kosmos.runTest { + scope.cancel() + // test code + } + } + """ + ) + .expectWarningCount(0) + } + + @Test + fun correctlyUsesKosmosRunTest() { + runOnSource( + """ + package test.pkg.name + + import com.android.systemui.kosmos.Kosmos + import com.android.systemui.kosmos.runTest + import kotlinx.coroutines.test.TestScope + import org.junit.Test + + class MyTest { + val scope: TestScope + val kosmos: Kosmos + + @Test + fun okTest() = kosmos.runTest { + // test code + } + } + """ + ) + .expectWarningCount(0) + } + + private fun runOnSource(source: String): TestLintResult { + return lint() + .files( + TestFiles.kotlin(source).indented(), + testAnnotationStub, + runTestStub, + testScopeStub, + kosmosStub, + kosmosRunTestStub, + ) + .issues(RunTestShouldUseKosmosDetector.ISSUE) + .run() + } + + companion object { + private val testAnnotationStub: TestFile = + kotlin( + """ + package org.junit + + import java.lang.annotation.ElementType + import java.lang.annotation.Retention + import java.lang.annotation.RetentionPolicy + import java.lang.annotation.Target + + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.METHOD}) + annotation class Test + """ + ) + + private val runTestStub: TestFile = + kotlin( + """ + package kotlinx.coroutines.test + + fun TestScope.runTest( + timeout: Duration = DEFAULT_TIMEOUT.getOrThrow(), + testBody: suspend TestScope.() -> Unit + ): Unit = {} + """ + ) + + private val testScopeStub: TestFile = + kotlin( + """ + package kotlinx.coroutines.test + + class TestScope + + public fun TestScope.cancel() {} + """ + ) + + private val kosmosStub: TestFile = + kotlin( + """ + package com.android.systemui.kosmos + + class Kosmos + """ + ) + + private val kosmosRunTestStub: TestFile = + kotlin( + """ + package com.android.systemui.kosmos + + fun Kosmos.runTest(testBody: suspend Kosmos.() -> Unit) + """ + ) + } +} diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt index a27bf8af1806..195b060932eb 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt @@ -464,13 +464,15 @@ private class NestedDraggableNode( velocity: Velocity, performFling: suspend (Velocity) -> Velocity, ): Velocity { + // Make sure we only use the velocity in this draggable orientation. + val orientationVelocity = velocity.toFloat().toVelocity() return if (overscrollEffect != null) { - overscrollEffect.applyToFling(velocity) { performFling(it) } + overscrollEffect.applyToFling(orientationVelocity) { performFling(it) } // Effects always consume the whole velocity. velocity } else { - performFling(velocity) + performFling(orientationVelocity) } } diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/ContentOverscrollEffect.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/ContentOverscrollEffect.kt index 4ee6db3d516c..49e510791929 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/ContentOverscrollEffect.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/ContentOverscrollEffect.kt @@ -23,7 +23,9 @@ import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity +import com.android.compose.ui.util.HorizontalSpaceVectorConverter import com.android.compose.ui.util.SpaceVectorConverter +import com.android.compose.ui.util.VerticalSpaceVectorConverter import kotlin.math.abs import kotlin.math.sign import kotlinx.coroutines.CoroutineScope @@ -40,13 +42,12 @@ interface ContentOverscrollEffect : OverscrollEffect { } open class BaseContentOverscrollEffect( - orientation: Orientation, private val animationScope: CoroutineScope, private val animationSpec: AnimationSpec<Float>, -) : ContentOverscrollEffect, SpaceVectorConverter by SpaceVectorConverter(orientation) { - +) : ContentOverscrollEffect { /** The [Animatable] that holds the current overscroll value. */ private val animatable = Animatable(initialValue = 0f, visibilityThreshold = 0.5f) + private var lastConverter: SpaceVectorConverter? = null override val overscrollDistance: Float get() = animatable.value @@ -59,6 +60,15 @@ open class BaseContentOverscrollEffect( source: NestedScrollSource, performScroll: (Offset) -> Offset, ): Offset { + val converter = converterOrNull(delta.x, delta.y) ?: return performScroll(delta) + return converter.applyToScroll(delta, source, performScroll) + } + + private fun SpaceVectorConverter.applyToScroll( + delta: Offset, + source: NestedScrollSource, + performScroll: (Offset) -> Offset, + ): Offset { val deltaForAxis = delta.toFloat() // If we're currently overscrolled, and the user scrolls in the opposite direction, we need @@ -106,6 +116,14 @@ open class BaseContentOverscrollEffect( velocity: Velocity, performFling: suspend (Velocity) -> Velocity, ) { + val converter = converterOrNull(velocity.x, velocity.y) ?: return + converter.applyToFling(velocity, performFling) + } + + private suspend fun SpaceVectorConverter.applyToFling( + velocity: Velocity, + performFling: suspend (Velocity) -> Velocity, + ) { // We launch a coroutine to ensure the fling animation starts after any pending [snapTo] // animations have finished. // This guarantees a smooth, sequential execution of animations on the overscroll value. @@ -117,4 +135,35 @@ open class BaseContentOverscrollEffect( } } } + + protected fun requireConverter(): SpaceVectorConverter { + return checkNotNull(lastConverter) { + "lastConverter is null, make sure to call requireConverter() only when " + + "overscrollDistance != 0f" + } + } + + private fun converterOrNull(x: Float, y: Float): SpaceVectorConverter? { + val converter: SpaceVectorConverter = + when { + x != 0f && y != 0f -> + error( + "BaseContentOverscrollEffect only supports single orientation scrolls " + + "and velocities" + ) + x == 0f && y == 0f -> lastConverter ?: return null + x != 0f -> HorizontalSpaceVectorConverter + else -> VerticalSpaceVectorConverter + } + + if (lastConverter != null) { + check(lastConverter == converter) { + "BaseContentOverscrollEffect should always be used in the same orientation" + } + } else { + lastConverter = converter + } + + return converter + } } diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/OffsetOverscrollEffect.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/OffsetOverscrollEffect.kt index fc01c78f8c54..e74b185851c4 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/OffsetOverscrollEffect.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/OffsetOverscrollEffect.kt @@ -19,7 +19,7 @@ package com.android.compose.gesture.effect import androidx.annotation.VisibleForTesting import androidx.compose.animation.core.AnimationSpec import androidx.compose.foundation.OverscrollEffect -import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.OverscrollFactory import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -37,24 +37,42 @@ import androidx.compose.ui.unit.dp import kotlin.math.roundToInt import kotlinx.coroutines.CoroutineScope -/** An [OverscrollEffect] that offsets the content by the overscroll value. */ -class OffsetOverscrollEffect( - orientation: Orientation, - animationScope: CoroutineScope, - animationSpec: AnimationSpec<Float>, -) : BaseContentOverscrollEffect(orientation, animationScope, animationSpec) { - private var _node: DelegatableNode = newNode() - override val node: DelegatableNode - get() = _node +@Composable +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +fun rememberOffsetOverscrollEffect( + animationSpec: AnimationSpec<Float> = MaterialTheme.motionScheme.defaultSpatialSpec() +): OffsetOverscrollEffect { + val animationScope = rememberCoroutineScope() + return remember(animationScope, animationSpec) { + OffsetOverscrollEffect(animationScope, animationSpec) + } +} - fun newNode(): DelegatableNode { - return object : Modifier.Node(), LayoutModifierNode { - override fun onDetach() { - super.onDetach() - // TODO(b/379086317) Remove this workaround: avoid to reuse the same node. - _node = newNode() - } +@Composable +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +fun rememberOffsetOverscrollEffectFactory( + animationSpec: AnimationSpec<Float> = MaterialTheme.motionScheme.defaultSpatialSpec() +): OverscrollFactory { + val animationScope = rememberCoroutineScope() + return remember(animationScope, animationSpec) { + OffsetOverscrollEffectFactory(animationScope, animationSpec) + } +} +data class OffsetOverscrollEffectFactory( + private val animationScope: CoroutineScope, + private val animationSpec: AnimationSpec<Float>, +) : OverscrollFactory { + override fun createOverscrollEffect(): OverscrollEffect { + return OffsetOverscrollEffect(animationScope, animationSpec) + } +} + +/** An [OverscrollEffect] that offsets the content by the overscroll value. */ +class OffsetOverscrollEffect(animationScope: CoroutineScope, animationSpec: AnimationSpec<Float>) : + BaseContentOverscrollEffect(animationScope, animationSpec) { + override val node: DelegatableNode = + object : Modifier.Node(), LayoutModifierNode { override fun MeasureScope.measure( measurable: Measurable, constraints: Constraints, @@ -62,11 +80,16 @@ class OffsetOverscrollEffect( val placeable = measurable.measure(constraints) return layout(placeable.width, placeable.height) { val offsetPx = computeOffset(density = this@measure, overscrollDistance) - placeable.placeRelativeWithLayer(position = offsetPx.toIntOffset()) + if (offsetPx != 0) { + placeable.placeRelativeWithLayer( + with(requireConverter()) { offsetPx.toIntOffset() } + ) + } else { + placeable.placeRelative(0, 0) + } } } } - } companion object { private val MaxDistance = 400.dp @@ -80,18 +103,6 @@ class OffsetOverscrollEffect( } } -@OptIn(ExperimentalMaterial3ExpressiveApi::class) -@Composable -fun rememberOffsetOverscrollEffect( - orientation: Orientation, - animationSpec: AnimationSpec<Float> = MaterialTheme.motionScheme.defaultSpatialSpec(), -): OffsetOverscrollEffect { - val animationScope = rememberCoroutineScope() - return remember(orientation, animationScope, animationSpec) { - OffsetOverscrollEffect(orientation, animationScope, animationSpec) - } -} - /** This converter lets you change a linear progress into a function of your choice. */ fun interface ProgressConverter { fun convert(progress: Float): Float diff --git a/packages/SystemUI/compose/core/src/com/android/compose/ui/util/SpaceVectorConverter.kt b/packages/SystemUI/compose/core/src/com/android/compose/ui/util/SpaceVectorConverter.kt index ca50e778d131..ac0e17a591dc 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/ui/util/SpaceVectorConverter.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/ui/util/SpaceVectorConverter.kt @@ -37,11 +37,11 @@ interface SpaceVectorConverter { fun SpaceVectorConverter(orientation: Orientation) = when (orientation) { - Orientation.Horizontal -> HorizontalConverter - Orientation.Vertical -> VerticalConverter + Orientation.Horizontal -> HorizontalSpaceVectorConverter + Orientation.Vertical -> VerticalSpaceVectorConverter } -private data object HorizontalConverter : SpaceVectorConverter { +data object HorizontalSpaceVectorConverter : SpaceVectorConverter { override fun Offset.toFloat() = x override fun Velocity.toFloat() = x @@ -55,7 +55,7 @@ private data object HorizontalConverter : SpaceVectorConverter { override fun Int.toIntOffset() = IntOffset(this, 0) } -private data object VerticalConverter : SpaceVectorConverter { +data object VerticalSpaceVectorConverter : SpaceVectorConverter { override fun Offset.toFloat() = y override fun Velocity.toFloat() = y diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/effect/OffsetOverscrollEffectTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/effect/OffsetOverscrollEffectTest.kt index 5a3f240deb44..e7c47fb56130 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/effect/OffsetOverscrollEffectTest.kt +++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/effect/OffsetOverscrollEffectTest.kt @@ -55,10 +55,7 @@ class OffsetOverscrollEffectTest { } } - private fun setupOverscrollableBox( - scrollableOrientation: Orientation, - overscrollEffectOrientation: Orientation = scrollableOrientation, - ): LayoutInfo { + private fun setupOverscrollableBox(scrollableOrientation: Orientation): LayoutInfo { val layoutSize: Dp = 200.dp var touchSlop: Float by Delegates.notNull() // The draggable touch slop, i.e. the min px distance a touch pointer must move before it is @@ -67,7 +64,7 @@ class OffsetOverscrollEffectTest { rule.setContent { density = LocalDensity.current touchSlop = LocalViewConfiguration.current.touchSlop - val overscrollEffect = rememberOffsetOverscrollEffect(overscrollEffectOrientation) + val overscrollEffect = rememberOffsetOverscrollEffect() Box( Modifier.overscroll(overscrollEffect) @@ -102,11 +99,7 @@ class OffsetOverscrollEffectTest { @Test fun applyNoOffset_duringHorizontalOverscroll() { - val info = - setupOverscrollableBox( - scrollableOrientation = Orientation.Vertical, - overscrollEffectOrientation = Orientation.Horizontal, - ) + val info = setupOverscrollableBox(scrollableOrientation = Orientation.Vertical) rule.onNodeWithTag(BOX_TAG).assertTopPositionInRootIsEqualTo(0.dp) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt index c55a3fdfc6c0..478970f4e210 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt @@ -45,6 +45,7 @@ import com.android.systemui.keyguard.ui.composable.section.StatusBarSection import com.android.systemui.keyguard.ui.composable.section.TopAreaSection import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel import com.android.systemui.res.R +import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUiAod import java.util.Optional import javax.inject.Inject import kotlin.math.roundToInt @@ -128,11 +129,14 @@ constructor( with(notificationSection) { if (!isShadeLayoutWide && !isBypassEnabled) { Box(modifier = Modifier.weight(weight = 1f)) { - AodNotificationIcons( - modifier = - Modifier.align(alignment = Alignment.TopStart) - .padding(start = aodIconPadding) - ) + Column(Modifier.align(alignment = Alignment.TopStart)) { + if (PromotedNotificationUiAod.isEnabled) { + AodPromotedNotification() + } + AodNotificationIcons( + modifier = Modifier.padding(start = aodIconPadding) + ) + } Notifications( areNotificationsVisible = areNotificationsVisible, isShadeLayoutWide = false, @@ -140,9 +144,14 @@ constructor( ) } } else { - AodNotificationIcons( - modifier = Modifier.padding(start = aodIconPadding) - ) + Column { + if (PromotedNotificationUiAod.isEnabled) { + AodPromotedNotification() + } + AodNotificationIcons( + modifier = Modifier.padding(start = aodIconPadding) + ) + } } } if (!isUdfpsVisible && ambientIndicationSectionOptional.isPresent) { diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt index 2bc392d386bf..b66690c2fe89 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt @@ -53,6 +53,8 @@ import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDi import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarIconViewBindingFailureTracker import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel +import com.android.systemui.statusbar.notification.promoted.AODPromotedNotification +import com.android.systemui.statusbar.notification.promoted.ui.viewmodel.AODPromotedNotificationViewModel import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer @@ -84,6 +86,7 @@ constructor( private val iconBindingFailureTracker: StatusBarIconViewBindingFailureTracker, private val nicAodViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, private val nicAodIconViewStore: AlwaysOnDisplayNotificationIconViewStore, + private val aodPromotedNotificationViewModelFactory: AODPromotedNotificationViewModel.Factory, private val systemBarUtilsState: SystemBarUtilsState, private val clockInteractor: KeyguardClockInteractor, ) { @@ -107,6 +110,11 @@ constructor( } @Composable + fun AodPromotedNotification() { + AODPromotedNotification(aodPromotedNotificationViewModelFactory) + } + + @Composable fun AodNotificationIcons(modifier: Modifier = Modifier) { val isVisible by keyguardRootViewModel.isNotifIconContainerVisible.collectAsStateWithLifecycle() diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt index 9eb1f68dd669..931134795a53 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt @@ -41,9 +41,10 @@ import com.android.systemui.res.R import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.ui.composable.Overlay -import com.android.systemui.shade.ui.composable.CollapsedShadeHeader import com.android.systemui.shade.ui.composable.OverlayShade +import com.android.systemui.shade.ui.composable.OverlayShadeHeader import com.android.systemui.shade.ui.composable.SingleShadeMeasurePolicy +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView import com.android.systemui.statusbar.phone.ui.StatusBarIconController import com.android.systemui.statusbar.phone.ui.TintedIconManager @@ -60,6 +61,8 @@ constructor( private val tintedIconManagerFactory: TintedIconManager.Factory, private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, private val statusBarIconController: StatusBarIconController, + private val notificationIconContainerStatusBarViewBinder: + NotificationIconContainerStatusBarViewBinder, private val shadeSession: SaveableSession, private val stackScrollView: Lazy<NotificationScrollView>, private val clockSection: DefaultClockSection, @@ -79,7 +82,6 @@ constructor( @Composable override fun ContentScope.Content(modifier: Modifier) { - val notificationStackPadding = dimensionResource(id = R.dimen.notification_side_paddings) val viewModel = @@ -92,26 +94,29 @@ constructor( } OverlayShade( + isShadeLayoutWide = viewModel.isShadeLayoutWide, panelAlignment = Alignment.TopStart, modifier = modifier, onScrimClicked = viewModel::onScrimClicked, + header = { + OverlayShadeHeader( + viewModelFactory = viewModel.shadeHeaderViewModelFactory, + createTintedIconManager = tintedIconManagerFactory::create, + createBatteryMeterViewController = batteryMeterViewControllerFactory::create, + statusBarIconController = statusBarIconController, + notificationIconContainerStatusBarViewBinder = + notificationIconContainerStatusBarViewBinder, + modifier = + Modifier.element(NotificationsShade.Elements.StatusBar) + .layoutId(SingleShadeMeasurePolicy.LayoutId.ShadeHeader), + ) + }, ) { Box { Column { if (viewModel.showHeader) { val burnIn = rememberBurnIn(clockInteractor) - CollapsedShadeHeader( - viewModelFactory = viewModel.shadeHeaderViewModelFactory, - createTintedIconManager = tintedIconManagerFactory::create, - createBatteryMeterViewController = - batteryMeterViewControllerFactory::create, - statusBarIconController = statusBarIconController, - modifier = - Modifier.element(NotificationsShade.Elements.StatusBar) - .layoutId(SingleShadeMeasurePolicy.LayoutId.ShadeHeader), - ) - with(clockSection) { SmallClock( burnInParams = burnIn.parameters, @@ -126,16 +131,17 @@ constructor( stackScrollView = stackScrollView.get(), viewModel = placeholderViewModel, maxScrimTop = { 0f }, + shouldPunchHoleBehindScrim = false, stackTopPadding = notificationStackPadding, stackBottomPadding = notificationStackPadding, - shouldPunchHoleBehindScrim = false, shouldFillMaxSize = false, shouldShowScrim = false, supportNestedScrolling = false, modifier = Modifier.fillMaxWidth(), ) } - // Communicates the bottom position of the drawable area within the shade to NSSL. + // Communicates the bottom position of the drawable area within the shade to + // NSSL. NotificationStackCutoffGuideline( stackScrollView = stackScrollView.get(), viewModel = placeholderViewModel, diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt index 50bae8a094ad..3ec14a23421c 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt @@ -37,6 +37,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.boundsInWindow +import androidx.compose.ui.layout.layoutId import androidx.compose.ui.layout.onPlaced import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp @@ -49,6 +50,7 @@ import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer import com.android.systemui.compose.modifiers.sysuiResTag import com.android.systemui.dagger.SysUISingleton import com.android.systemui.lifecycle.rememberViewModel +import com.android.systemui.notifications.ui.composable.NotificationsShade import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace import com.android.systemui.qs.composefragment.ui.GridAnchor import com.android.systemui.qs.flags.QsDetailedView @@ -61,8 +63,11 @@ import com.android.systemui.qs.ui.viewmodel.QuickSettingsShadeOverlayActionsView import com.android.systemui.qs.ui.viewmodel.QuickSettingsShadeOverlayContentViewModel import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.ui.composable.Overlay -import com.android.systemui.shade.ui.composable.CollapsedShadeHeader import com.android.systemui.shade.ui.composable.OverlayShade +import com.android.systemui.shade.ui.composable.OverlayShadeHeader +import com.android.systemui.shade.ui.composable.QuickSettingsOverlayHeader +import com.android.systemui.shade.ui.composable.SingleShadeMeasurePolicy +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder 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.view.NotificationScrollView @@ -82,6 +87,8 @@ constructor( private val tintedIconManagerFactory: TintedIconManager.Factory, private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, private val statusBarIconController: StatusBarIconController, + private val notificationIconContainerStatusBarViewBinder: + NotificationIconContainerStatusBarViewBinder, private val notificationStackScrollView: Lazy<NotificationScrollView>, private val notificationsPlaceholderViewModelFactory: NotificationsPlaceholderViewModel.Factory, ) : Overlay { @@ -108,43 +115,7 @@ constructor( // set the bounds to null when the QuickSettings overlay disappears DisposableEffect(Unit) { onDispose { viewModel.onPanelShapeChanged(null) } } - OverlayShade( - panelAlignment = Alignment.TopEnd, - modifier = modifier, - onScrimClicked = viewModel::onScrimClicked, - ) { - Column( - modifier = - Modifier.onPlaced { coordinates -> - val boundsInWindow = coordinates.boundsInWindow() - val shadeScrimBounds = - ShadeScrimBounds( - left = boundsInWindow.left, - top = boundsInWindow.top, - right = boundsInWindow.right, - bottom = boundsInWindow.bottom, - ) - val shape = - ShadeScrimShape( - bounds = shadeScrimBounds, - topRadius = 0, - bottomRadius = panelCornerRadius, - ) - viewModel.onPanelShapeChanged(shape) - } - ) { - if (viewModel.showHeader) { - CollapsedShadeHeader( - viewModelFactory = viewModel.shadeHeaderViewModelFactory, - createTintedIconManager = tintedIconManagerFactory::create, - createBatteryMeterViewController = - batteryMeterViewControllerFactory::create, - statusBarIconController = statusBarIconController, - ) - } - ShadeBody(viewModel = viewModel.quickSettingsContainerViewModel) - } - + Box(modifier = modifier) { SnoozeableHeadsUpNotificationSpace( stackScrollView = notificationStackScrollView.get(), viewModel = @@ -152,6 +123,58 @@ constructor( notificationsPlaceholderViewModelFactory.create() }, ) + OverlayShade( + isShadeLayoutWide = viewModel.isShadeLayoutWide, + panelAlignment = Alignment.TopEnd, + onScrimClicked = viewModel::onScrimClicked, + header = { + OverlayShadeHeader( + viewModelFactory = viewModel.shadeHeaderViewModelFactory, + createTintedIconManager = tintedIconManagerFactory::create, + createBatteryMeterViewController = + batteryMeterViewControllerFactory::create, + statusBarIconController = statusBarIconController, + notificationIconContainerStatusBarViewBinder = + notificationIconContainerStatusBarViewBinder, + modifier = + Modifier.element(NotificationsShade.Elements.StatusBar) + .layoutId(SingleShadeMeasurePolicy.LayoutId.ShadeHeader), + ) + }, + ) { + ShadeBody( + viewModel = viewModel.quickSettingsContainerViewModel, + modifier = + Modifier.onPlaced { coordinates -> + val boundsInWindow = coordinates.boundsInWindow() + val shadeScrimBounds = + ShadeScrimBounds( + left = boundsInWindow.left, + top = boundsInWindow.top, + right = boundsInWindow.right, + bottom = boundsInWindow.bottom, + ) + val shape = + ShadeScrimShape( + bounds = shadeScrimBounds, + topRadius = 0, + bottomRadius = panelCornerRadius, + ) + viewModel.onPanelShapeChanged(shape) + }, + header = { + if (viewModel.isShadeLayoutWide) { + QuickSettingsOverlayHeader( + viewModelFactory = viewModel.shadeHeaderViewModelFactory, + createBatteryMeterViewController = + batteryMeterViewControllerFactory::create, + modifier = + Modifier.padding(top = QuickSettingsShade.Dimensions.Padding), + ) + } + }, + ) + } } } } @@ -166,7 +189,11 @@ sealed interface ShadeBodyState { } @Composable -fun ContentScope.ShadeBody(viewModel: QuickSettingsContainerViewModel) { +fun ContentScope.ShadeBody( + viewModel: QuickSettingsContainerViewModel, + modifier: Modifier = Modifier, + header: @Composable () -> Unit, +) { val isEditing by viewModel.editModeViewModel.isEditing.collectAsStateWithLifecycle() val tileDetails = if (QsDetailedView.isEnabled) viewModel.detailsViewModel.activeTileDetails else null @@ -185,16 +212,19 @@ fun ContentScope.ShadeBody(viewModel: QuickSettingsContainerViewModel) { EditMode( viewModel = viewModel.editModeViewModel, modifier = - Modifier.fillMaxWidth().padding(QuickSettingsShade.Dimensions.Padding), + modifier.fillMaxWidth().padding(QuickSettingsShade.Dimensions.Padding), ) } + ShadeBodyState.TileDetails -> { - TileDetails(viewModel.detailsViewModel) + TileDetails(modifier = modifier, viewModel.detailsViewModel) } + else -> { QuickSettingsLayout( viewModel = viewModel, - modifier = Modifier.sysuiResTag("quick_settings_panel"), + modifier = modifier.sysuiResTag("quick_settings_panel"), + header = header, ) } } @@ -206,6 +236,7 @@ fun ContentScope.ShadeBody(viewModel: QuickSettingsContainerViewModel) { fun ContentScope.QuickSettingsLayout( viewModel: QuickSettingsContainerViewModel, modifier: Modifier = Modifier, + header: @Composable () -> Unit, ) { Column( verticalArrangement = Arrangement.spacedBy(QuickSettingsShade.Dimensions.Padding), @@ -217,6 +248,7 @@ fun ContentScope.QuickSettingsLayout( bottom = QuickSettingsShade.Dimensions.Padding, ), ) { + header() Toolbar( modifier = Modifier.fillMaxWidth().requiredHeight(QuickSettingsShade.Dimensions.ToolbarHeight), diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt index 0ca7a6af01e0..6c0c5c7e49b9 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt @@ -16,6 +16,7 @@ package com.android.systemui.scene.ui.composable +import androidx.compose.foundation.LocalOverscrollFactory import androidx.compose.foundation.gestures.awaitEachGesture import androidx.compose.foundation.gestures.awaitFirstDown import androidx.compose.foundation.layout.Box @@ -44,6 +45,7 @@ import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.observableTransitionState import com.android.compose.animation.scene.rememberMutableSceneTransitionLayoutState +import com.android.compose.gesture.effect.rememberOffsetOverscrollEffectFactory import com.android.systemui.lifecycle.rememberActivated import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.qs.ui.composable.QuickSettingsTheme @@ -52,6 +54,7 @@ import com.android.systemui.scene.shared.model.SceneDataSourceDelegator import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.view.SceneJankMonitor import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel +import com.android.systemui.shade.ui.composable.isFullWidthShade import javax.inject.Provider /** @@ -150,6 +153,13 @@ fun SceneContainer( } } + // Overlays use the offset overscroll effect when shown on large screens, otherwise they + // stretch. All scenes use the OffsetOverscrollEffect. + val offsetOverscrollEffectFactory = rememberOffsetOverscrollEffectFactory() + val stretchOverscrollEffectFactory = checkNotNull(LocalOverscrollFactory.current) + val overlayEffectFactory = + if (isFullWidthShade()) stretchOverscrollEffectFactory else offsetOverscrollEffectFactory + // Inflate qsView here so that shade has the correct qqs height in the first measure pass after // rebooting if ( @@ -192,6 +202,7 @@ fun SceneContainer( scene( key = sceneKey, userActions = userActionsByContentKey.getOrDefault(sceneKey, emptyMap()), + effectFactory = offsetOverscrollEffectFactory, ) { // Activate the scene. LaunchedEffect(scene) { scene.activate() } @@ -208,6 +219,7 @@ fun SceneContainer( overlay( key = overlayKey, userActions = userActionsByContentKey.getOrDefault(overlayKey, emptyMap()), + effectFactory = overlayEffectFactory, ) { // Activate the overlay. LaunchedEffect(overlay) { overlay.activate() } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt index ffdf509174d5..fc59d40ec443 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt @@ -20,10 +20,8 @@ package com.android.systemui.shade.ui.composable import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.gestures.Orientation -import androidx.compose.foundation.gestures.rememberScrollableState -import androidx.compose.foundation.gestures.scrollable import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer @@ -44,59 +42,47 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.dimensionResource -import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.ContentScope import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.LowestZIndexContentPicker -import com.android.compose.gesture.effect.rememberOffsetOverscrollEffect import com.android.compose.windowsizeclass.LocalWindowSizeClass import com.android.systemui.res.R /** Renders a lightweight shade UI container, as an overlay. */ @Composable fun ContentScope.OverlayShade( + isShadeLayoutWide: Boolean, panelAlignment: Alignment, onScrimClicked: () -> Unit, modifier: Modifier = Modifier, + header: @Composable () -> Unit, content: @Composable () -> Unit, ) { - // TODO(b/384653288) This should be removed when b/378470603 is done. - val idleEffect = rememberOffsetOverscrollEffect(Orientation.Vertical) - Box( - modifier - .overscroll(idleEffect) - .nestedScroll( - remember { - object : NestedScrollConnection { - override suspend fun onPreFling(available: Velocity): Velocity { - return available - } - } - } - ) - .scrollable(rememberScrollableState { 0f }, Orientation.Vertical, idleEffect) - ) { + Box(modifier) { Scrim(onClicked = onScrimClicked) Box(modifier = Modifier.fillMaxSize().panelPadding(), contentAlignment = panelAlignment) { Panel( + isShadeLayoutWide = isShadeLayoutWide, modifier = - Modifier.element(OverlayShade.Elements.Panel) - .overscroll(verticalOverscrollEffect) + Modifier.overscroll(verticalOverscrollEffect) + .element(OverlayShade.Elements.Panel) .panelSize(), + header = header, content = content, ) } + + if (isShadeLayoutWide) { + header() + } } } @@ -113,7 +99,12 @@ private fun ContentScope.Scrim(onClicked: () -> Unit, modifier: Modifier = Modif } @Composable -private fun ContentScope.Panel(modifier: Modifier = Modifier, content: @Composable () -> Unit) { +private fun ContentScope.Panel( + isShadeLayoutWide: Boolean, + modifier: Modifier = Modifier, + header: @Composable () -> Unit, + content: @Composable () -> Unit, +) { Box(modifier = modifier.clip(OverlayShade.Shapes.RoundedCornerPanel)) { Spacer( modifier = @@ -125,17 +116,22 @@ private fun ContentScope.Panel(modifier: Modifier = Modifier, content: @Composab ) ) - // This content is intentionally rendered as a separate element from the background in order - // to allow for more flexibility when defining transitions. - content() + Column { + if (!isShadeLayoutWide) { + header() + } + + // This content is intentionally rendered as a separate element from the background in + // order to allow for more flexibility when defining transitions. + content() + } } } @Composable private fun Modifier.panelSize(): Modifier { - val widthSizeClass = LocalWindowSizeClass.current.widthSizeClass return this.then( - if (widthSizeClass == WindowWidthSizeClass.Compact) { + if (isFullWidthShade()) { Modifier.fillMaxWidth() } else { Modifier.width(dimensionResource(id = R.dimen.shade_panel_width)) @@ -144,6 +140,12 @@ private fun Modifier.panelSize(): Modifier { } @Composable +@ReadOnlyComposable +internal fun isFullWidthShade(): Boolean { + return LocalWindowSizeClass.current.widthSizeClass == WindowWidthSizeClass.Compact +} + +@Composable private fun Modifier.panelPadding(): Modifier { val widthSizeClass = LocalWindowSizeClass.current.widthSizeClass val systemBars = WindowInsets.systemBarsIgnoringVisibility diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt index 3131b539c6af..c5d28adce601 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt @@ -26,6 +26,7 @@ import androidx.compose.foundation.interaction.collectIsHoveredAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer @@ -38,11 +39,11 @@ import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ColorScheme import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -50,6 +51,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.TransformOrigin import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.Layout +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Constraints @@ -65,7 +67,6 @@ import com.android.compose.animation.scene.ValueKey import com.android.compose.animation.scene.animateElementFloatAsState import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.modifiers.thenIf -import com.android.compose.windowsizeclass.LocalWindowSizeClass import com.android.settingslib.Utils import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController @@ -77,10 +78,15 @@ import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.privacy.OngoingPrivacyChip import com.android.systemui.res.R import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.shade.shared.flag.DualShade +import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.chipBackground +import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.chipHighlighted import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.onScrimDim import com.android.systemui.shade.ui.composable.ShadeHeader.Dimensions.CollapsedHeight import com.android.systemui.shade.ui.composable.ShadeHeader.Values.ClockScale import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder +import com.android.systemui.statusbar.phone.NotificationIconContainer import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.phone.ui.StatusBarIconController @@ -88,6 +94,7 @@ import com.android.systemui.statusbar.phone.ui.TintedIconManager import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernShadeCarrierGroupMobileView import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel import com.android.systemui.statusbar.policy.Clock +import kotlinx.coroutines.launch object ShadeHeader { object Elements { @@ -114,6 +121,12 @@ object ShadeHeader { val ColorScheme.onScrimDim: Color get() = Color.DarkGray + + val ColorScheme.chipBackground: Color + get() = Color.DarkGray + + val ColorScheme.chipHighlighted: Color + get() = Color.LightGray } object TestTags { @@ -121,6 +134,7 @@ object ShadeHeader { } } +/** The status bar that appears above the Shade scene on small screens */ @Composable fun ContentScope.CollapsedShadeHeader( viewModelFactory: ShadeHeaderViewModel.Factory, @@ -131,9 +145,6 @@ fun ContentScope.CollapsedShadeHeader( ) { val viewModel = rememberViewModel("CollapsedShadeHeader") { viewModelFactory.create() } - val cutoutWidth = LocalDisplayCutout.current.width() - val cutoutHeight = LocalDisplayCutout.current.height() - val cutoutTop = LocalDisplayCutout.current.top val cutoutLocation = LocalDisplayCutout.current.location val horizontalPadding = max(LocalScreenCornerRadius.current / 2f, Shade.Dimensions.HorizontalPadding) @@ -146,123 +157,73 @@ fun ContentScope.CollapsedShadeHeader( } } - val isLargeScreenLayout = - LocalWindowSizeClass.current.widthSizeClass == WindowWidthSizeClass.Medium || - LocalWindowSizeClass.current.widthSizeClass == WindowWidthSizeClass.Expanded + val isShadeLayoutWide = viewModel.isShadeLayoutWide val isPrivacyChipVisible by viewModel.isPrivacyChipVisible.collectAsStateWithLifecycle() // This layout assumes it is globally positioned at (0, 0) and is the // same size as the screen. - Layout( + CutoutAwareShadeHeader( modifier = modifier.sysuiResTag(ShadeHeader.TestTags.Root), - contents = - listOf( - { - Row(modifier = Modifier.padding(horizontal = horizontalPadding)) { - Clock( - scale = 1f, + startContent = { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(5.dp), + modifier = Modifier.padding(horizontal = horizontalPadding), + ) { + Clock(scale = 1f, viewModel = viewModel) + VariableDayDate( + viewModel = viewModel, + modifier = Modifier.element(ShadeHeader.Elements.CollapsedContentStart), + ) + } + }, + endContent = { + if (isPrivacyChipVisible) { + Box( + modifier = + Modifier.height(CollapsedHeight) + .fillMaxWidth() + .padding(horizontal = horizontalPadding) + ) { + PrivacyChip( + viewModel = viewModel, + modifier = Modifier.align(Alignment.CenterEnd), + ) + } + } else { + Row( + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier.element(ShadeHeader.Elements.CollapsedContentEnd) + .padding(horizontal = horizontalPadding), + ) { + if (isShadeLayoutWide) { + ShadeCarrierGroup(viewModel = viewModel) + } + SystemIconChip(viewModel = viewModel, isClickable = isShadeLayoutWide) { + StatusIcons( viewModel = viewModel, - modifier = Modifier.align(Alignment.CenterVertically), + createTintedIconManager = createTintedIconManager, + statusBarIconController = statusBarIconController, + useExpandedFormat = useExpandedTextFormat, + modifier = Modifier.padding(end = 6.dp).weight(1f, fill = false), ) - Spacer(modifier = Modifier.width(5.dp)) - VariableDayDate( + BatteryIcon( viewModel = viewModel, - modifier = - Modifier.element(ShadeHeader.Elements.CollapsedContentStart) - .align(Alignment.CenterVertically), + createBatteryMeterViewController = createBatteryMeterViewController, + useExpandedFormat = useExpandedTextFormat, + modifier = Modifier.padding(vertical = 8.dp), ) } - }, - { - if (isPrivacyChipVisible) { - Box( - modifier = - Modifier.height(CollapsedHeight) - .fillMaxWidth() - .padding(horizontal = horizontalPadding) - ) { - PrivacyChip( - viewModel = viewModel, - modifier = Modifier.align(Alignment.CenterEnd), - ) - } - } else { - Row( - horizontalArrangement = Arrangement.End, - modifier = - Modifier.element(ShadeHeader.Elements.CollapsedContentEnd) - .padding(horizontal = horizontalPadding), - ) { - if (isLargeScreenLayout) { - ShadeCarrierGroup( - viewModel = viewModel, - modifier = Modifier.align(Alignment.CenterVertically), - ) - } - SystemIconContainer( - viewModel = viewModel, - isClickable = isLargeScreenLayout, - modifier = Modifier.align(Alignment.CenterVertically), - ) { - StatusIcons( - viewModel = viewModel, - createTintedIconManager = createTintedIconManager, - statusBarIconController = statusBarIconController, - useExpandedFormat = useExpandedTextFormat, - modifier = - Modifier.align(Alignment.CenterVertically) - .padding(end = 6.dp) - .weight(1f, fill = false), - ) - BatteryIcon( - createBatteryMeterViewController = - createBatteryMeterViewController, - useExpandedFormat = useExpandedTextFormat, - modifier = Modifier.align(Alignment.CenterVertically), - ) - } - } - } - }, - ), - ) { measurables, constraints -> - check(constraints.hasBoundedWidth) - check(measurables.size == 2) - check(measurables[0].size == 1) - check(measurables[1].size == 1) - - val screenWidth = constraints.maxWidth - val cutoutWidthPx = cutoutWidth.roundToPx() - val height = max(cutoutHeight + (cutoutTop * 2), CollapsedHeight).roundToPx() - val childConstraints = Constraints.fixed((screenWidth - cutoutWidthPx) / 2, height) - - val startMeasurable = measurables[0][0] - val endMeasurable = measurables[1][0] - - val startPlaceable = startMeasurable.measure(childConstraints) - val endPlaceable = endMeasurable.measure(childConstraints) - - layout(screenWidth, height) { - when (cutoutLocation) { - CutoutLocation.NONE, - CutoutLocation.RIGHT -> { - startPlaceable.placeRelative(x = 0, y = 0) - endPlaceable.placeRelative(x = startPlaceable.width, y = 0) - } - CutoutLocation.CENTER -> { - startPlaceable.placeRelative(x = 0, y = 0) - endPlaceable.placeRelative(x = startPlaceable.width + cutoutWidthPx, y = 0) - } - CutoutLocation.LEFT -> { - startPlaceable.placeRelative(x = cutoutWidthPx, y = 0) - endPlaceable.placeRelative(x = startPlaceable.width + cutoutWidthPx, y = 0) } } - } - } + }, + ) } +/** The status bar that appears above the Quick Settings scene on small screens */ @Composable fun ContentScope.ExpandedShadeHeader( viewModelFactory: ShadeHeaderViewModel.Factory, @@ -310,27 +271,24 @@ fun ContentScope.ExpandedShadeHeader( } } Spacer(modifier = Modifier.width(5.dp)) - Row(modifier = Modifier.element(ShadeHeader.Elements.ExpandedContent)) { - VariableDayDate( - viewModel = viewModel, - modifier = Modifier.widthIn(max = 90.dp).align(Alignment.CenterVertically), - ) + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.element(ShadeHeader.Elements.ExpandedContent), + ) { + VariableDayDate(viewModel = viewModel, modifier = Modifier.widthIn(max = 90.dp)) Spacer(modifier = Modifier.weight(1f)) - SystemIconContainer(viewModel = viewModel, isClickable = false) { + SystemIconChip(viewModel = viewModel) { StatusIcons( viewModel = viewModel, createTintedIconManager = createTintedIconManager, statusBarIconController = statusBarIconController, useExpandedFormat = useExpandedFormat, - modifier = - Modifier.align(Alignment.CenterVertically) - .padding(end = 6.dp) - .weight(1f, fill = false), + modifier = Modifier.padding(end = 6.dp).weight(1f, fill = false), ) BatteryIcon( + viewModel = viewModel, useExpandedFormat = useExpandedFormat, createBatteryMeterViewController = createBatteryMeterViewController, - modifier = Modifier.align(Alignment.CenterVertically), ) } } @@ -338,8 +296,183 @@ fun ContentScope.ExpandedShadeHeader( } } +/** + * The status bar that appears above both the Notifications and Quick Settings shade overlays when + * overlay shade is enabled. + */ @Composable -private fun ContentScope.Clock(scale: Float, viewModel: ShadeHeaderViewModel, modifier: Modifier) { +fun ContentScope.OverlayShadeHeader( + viewModelFactory: ShadeHeaderViewModel.Factory, + createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager, + createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController, + statusBarIconController: StatusBarIconController, + notificationIconContainerStatusBarViewBinder: NotificationIconContainerStatusBarViewBinder, + modifier: Modifier = Modifier, +) { + val viewModel = rememberViewModel("OverlayShadeHeader") { viewModelFactory.create() } + + val horizontalPadding = + max(LocalScreenCornerRadius.current / 2f, Shade.Dimensions.HorizontalPadding) + + val isShadeLayoutWide = viewModel.isShadeLayoutWide + + val isPrivacyChipVisible by viewModel.isPrivacyChipVisible.collectAsStateWithLifecycle() + + // This layout assumes it is globally positioned at (0, 0) and is the + // same size as the screen. + CutoutAwareShadeHeader( + modifier = modifier.sysuiResTag(ShadeHeader.TestTags.Root), + startContent = { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(horizontal = horizontalPadding), + ) { + if (isShadeLayoutWide) { + Clock( + scale = 1f, + viewModel = viewModel, + modifier = Modifier.padding(horizontal = 4.dp), + ) + Spacer(modifier = Modifier.width(5.dp)) + } + NotificationIconChip(viewModel = viewModel) { + if (isShadeLayoutWide) { + NotificationIcons( + viewModel = viewModel, + notificationIconContainerStatusBarViewBinder = + notificationIconContainerStatusBarViewBinder, + modifier = Modifier.width(IntrinsicSize.Min).height(20.dp), + ) + } else { + VariableDayDate(viewModel = viewModel) + } + } + } + }, + endContent = { + Row( + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(horizontal = horizontalPadding), + ) { + SystemIconChip(viewModel = viewModel, isClickable = true, showBackground = true) { + StatusIcons( + viewModel = viewModel, + createTintedIconManager = createTintedIconManager, + statusBarIconController = statusBarIconController, + useExpandedFormat = false, + highlightable = true, + modifier = Modifier.padding(end = 6.dp).weight(1f, fill = false), + ) + BatteryIcon( + viewModel = viewModel, + createBatteryMeterViewController = createBatteryMeterViewController, + useExpandedFormat = false, + highlightable = true, + ) + } + if (isPrivacyChipVisible) { + Box( + modifier = + Modifier.height(CollapsedHeight) + .fillMaxWidth() + .padding(horizontal = horizontalPadding) + ) { + PrivacyChip( + viewModel = viewModel, + modifier = Modifier.align(Alignment.CenterEnd), + ) + } + } + } + }, + ) +} + +/** The header that appears at the top of the Quick Settings shade overlay. */ +@Composable +fun ContentScope.QuickSettingsOverlayHeader( + viewModelFactory: ShadeHeaderViewModel.Factory, + createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController, + modifier: Modifier = Modifier, +) { + val viewModel = rememberViewModel("QuickSettingsOverlayHeader") { viewModelFactory.create() } + + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = modifier.fillMaxWidth(), + ) { + ShadeCarrierGroup(viewModel = viewModel) + BatteryIcon( + viewModel = viewModel, + createBatteryMeterViewController = createBatteryMeterViewController, + useExpandedFormat = true, + ) + } +} + +/* + * Places startContent and endContent according to the location of the display cutout. + * Assumes it is globally positioned at (0, 0) and the same size as the screen. + */ +@Composable +private fun CutoutAwareShadeHeader( + modifier: Modifier = Modifier, + startContent: @Composable () -> Unit, + endContent: @Composable () -> Unit, +) { + val cutoutWidth = LocalDisplayCutout.current.width() + val cutoutHeight = LocalDisplayCutout.current.height() + val cutoutTop = LocalDisplayCutout.current.top + val cutoutLocation = LocalDisplayCutout.current.location + + Layout( + modifier = modifier.sysuiResTag(ShadeHeader.TestTags.Root), + contents = listOf(startContent, endContent), + ) { measurables, constraints -> + check(constraints.hasBoundedWidth) + check(measurables.size == 2) + check(measurables[0].size == 1) + check(measurables[1].size == 1) + + val screenWidth = constraints.maxWidth + val cutoutWidthPx = cutoutWidth.roundToPx() + val height = max(cutoutHeight + (cutoutTop * 2), CollapsedHeight).roundToPx() + val childConstraints = Constraints.fixed((screenWidth - cutoutWidthPx) / 2, height) + + val startMeasurable = measurables[0][0] + val endMeasurable = measurables[1][0] + + val startPlaceable = startMeasurable.measure(childConstraints) + val endPlaceable = endMeasurable.measure(childConstraints) + + layout(screenWidth, height) { + when (cutoutLocation) { + CutoutLocation.NONE, + CutoutLocation.RIGHT -> { + startPlaceable.placeRelative(x = 0, y = 0) + endPlaceable.placeRelative(x = startPlaceable.width, y = 0) + } + CutoutLocation.CENTER -> { + startPlaceable.placeRelative(x = 0, y = 0) + endPlaceable.placeRelative(x = startPlaceable.width + cutoutWidthPx, y = 0) + } + CutoutLocation.LEFT -> { + startPlaceable.placeRelative(x = cutoutWidthPx, y = 0) + endPlaceable.placeRelative(x = startPlaceable.width + cutoutWidthPx, y = 0) + } + } + } + } +} + +@Composable +private fun ContentScope.Clock( + scale: Float, + viewModel: ShadeHeaderViewModel, + modifier: Modifier = Modifier, +) { val layoutDirection = LocalLayoutDirection.current Element(key = ShadeHeader.Elements.Clock, modifier = modifier) { @@ -374,28 +507,31 @@ private fun ContentScope.Clock(scale: Float, viewModel: ShadeHeaderViewModel, mo @Composable private fun BatteryIcon( + viewModel: ShadeHeaderViewModel, createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController, useExpandedFormat: Boolean, + highlightable: Boolean = false, modifier: Modifier = Modifier, ) { + val localContext = LocalContext.current + val themedContext = + ContextThemeWrapper(localContext, R.style.Theme_SystemUI_QuickSettings_Header) + val primaryColor = + Utils.getColorAttrDefaultColor(themedContext, android.R.attr.textColorPrimary) + val inverseColor = + Utils.getColorAttrDefaultColor(themedContext, android.R.attr.textColorPrimaryInverse) + + val isHighlighted = viewModel.highlightQuickSettingsIcons + AndroidView( factory = { context -> val batteryIcon = BatteryMeterView(context, null) batteryIcon.setPercentShowMode(BatteryMeterView.MODE_ON) - val themedContext = - ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings_Header) - val fg = Utils.getColorAttrDefaultColor(themedContext, android.R.attr.textColorPrimary) - val bg = - Utils.getColorAttrDefaultColor( - themedContext, - android.R.attr.textColorPrimaryInverse, - ) - // [BatteryMeterView.updateColors] is an old method that was built to distinguish // between dual-tone colors and single-tone. The current icon is only single-tone, so // the final [fg] is the only one we actually need - batteryIcon.updateColors(fg, bg, fg) + batteryIcon.updateColors(primaryColor, inverseColor, primaryColor) val batteryMaterViewController = createBatteryMeterViewController(batteryIcon, StatusBarLocation.QS) @@ -414,6 +550,13 @@ private fun BatteryIcon( BatteryMeterView.MODE_ON } ) + if (highlightable) { + if (isHighlighted) { + batteryIcon.updateColors(primaryColor, inverseColor, inverseColor) + } else { + batteryIcon.updateColors(primaryColor, inverseColor, primaryColor) + } + } }, modifier = modifier, ) @@ -446,13 +589,51 @@ private fun ShadeCarrierGroup(viewModel: ShadeHeaderViewModel, modifier: Modifie } @Composable +private fun NotificationIcons( + viewModel: ShadeHeaderViewModel, + notificationIconContainerStatusBarViewBinder: NotificationIconContainerStatusBarViewBinder, + modifier: Modifier = Modifier, +) { + val scope = rememberCoroutineScope() + + val isHighlighted = viewModel.highlightNotificationIcons + + AndroidView( + factory = { context -> + NotificationIconContainer(context, null).also { view -> + view.setOverrideIconColor(true) + scope.launch { + notificationIconContainerStatusBarViewBinder.bindWhileAttached( + view = view, + displayId = context.displayId, + ) + } + } + }, + update = { it.setUseInverseOverrideIconColor(isHighlighted) }, + modifier = modifier, + ) +} + +@Composable private fun ContentScope.StatusIcons( viewModel: ShadeHeaderViewModel, createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager, statusBarIconController: StatusBarIconController, useExpandedFormat: Boolean, + highlightable: Boolean = false, modifier: Modifier = Modifier, ) { + val localContext = LocalContext.current + val themedContext = + ContextThemeWrapper(localContext, R.style.Theme_SystemUI_QuickSettings_Header) + val primaryColor = + Utils.getColorAttrDefaultColor(themedContext, android.R.attr.textColorPrimary) + val inverseColor = + Utils.getColorAttrDefaultColor(themedContext, android.R.attr.textColorPrimaryInverse) + + val isHighlighted = viewModel.highlightQuickSettingsIcons + val carrierIconSlots = listOf(stringResource(id = com.android.internal.R.string.status_bar_mobile)) val cameraSlot = stringResource(id = com.android.internal.R.string.status_bar_camera) @@ -466,19 +647,12 @@ private fun ContentScope.StatusIcons( val isLocationIndicationEnabled by viewModel.isLocationIndicationEnabled.collectAsStateWithLifecycle() + val iconContainer = remember { StatusIconContainer(themedContext, null) } + val iconManager = remember { createTintedIconManager(iconContainer, StatusBarLocation.QS) } + AndroidView( factory = { context -> - val themedContext = - ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings_Header) - val iconContainer = StatusIconContainer(themedContext, null) - val iconManager = createTintedIconManager(iconContainer, StatusBarLocation.QS) - iconManager.setTint( - Utils.getColorAttrDefaultColor(themedContext, android.R.attr.textColorPrimary), - Utils.getColorAttrDefaultColor( - themedContext, - android.R.attr.textColorPrimaryInverse, - ), - ) + iconManager.setTint(primaryColor, inverseColor) statusBarIconController.addIconGroup(iconManager) iconContainer @@ -511,35 +685,87 @@ private fun ContentScope.StatusIcons( iconContainer.removeIgnoredSlot(micSlot) iconContainer.removeIgnoredSlot(locationSlot) } + + if (highlightable) { + if (isHighlighted) { + iconManager.setTint(inverseColor, primaryColor) + } else { + iconManager.setTint(primaryColor, inverseColor) + } + } }, modifier = modifier, ) } @Composable -private fun SystemIconContainer( +private fun NotificationIconChip( viewModel: ShadeHeaderViewModel, - isClickable: Boolean, modifier: Modifier = Modifier, content: @Composable RowScope.() -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } - val isHovered by interactionSource.collectIsHoveredAsState() + val backgroundColor = + if (viewModel.highlightNotificationIcons) MaterialTheme.colorScheme.chipHighlighted + else MaterialTheme.colorScheme.chipBackground + Box(modifier = modifier) { + Row( + modifier = + Modifier.align(Alignment.CenterStart) + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = { viewModel.onNotificationIconChipClicked() }, + ) + .thenIf(DualShade.isEnabled) { + Modifier.graphicsLayer { + shape = RoundedCornerShape(25.dp) + clip = true + } + .background(backgroundColor) + .padding(horizontal = 8.dp, vertical = 4.dp) + } + ) { + content() + } + } +} + +@Composable +private fun SystemIconChip( + viewModel: ShadeHeaderViewModel, + isClickable: Boolean = false, + showBackground: Boolean = false, + modifier: Modifier = Modifier, + content: @Composable RowScope.() -> Unit, +) { + val interactionSource = remember { MutableInteractionSource() } + val isHovered by interactionSource.collectIsHoveredAsState() val hoverModifier = Modifier.clip(RoundedCornerShape(CollapsedHeight / 4)) .background(MaterialTheme.colorScheme.onScrimDim) + val backgroundColor = + if (viewModel.highlightQuickSettingsIcons) MaterialTheme.colorScheme.chipHighlighted + else MaterialTheme.colorScheme.chipBackground Row( + verticalAlignment = Alignment.CenterVertically, modifier = modifier - .height(CollapsedHeight) - .padding(vertical = CollapsedHeight / 4) + .thenIf(showBackground) { + Modifier.graphicsLayer { + shape = RoundedCornerShape(25.dp) + clip = true + } + .background(backgroundColor) + .padding(horizontal = 8.dp, vertical = 4.dp) + } .thenIf(isClickable) { Modifier.clickable( interactionSource = interactionSource, indication = null, - onClick = { viewModel.onSystemIconContainerClicked() }, + onClick = { viewModel.onSystemIconChipClicked() }, ) } .thenIf(isHovered) { hoverModifier }, diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt index 931ff56e56cb..93eca86e15cf 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt @@ -6,17 +6,18 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.Layout import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.shadeHeaderText +import com.android.compose.theme.colorAttr import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel @Composable -fun VariableDayDate( - viewModel: ShadeHeaderViewModel, - modifier: Modifier = Modifier, -) { +fun VariableDayDate(viewModel: ShadeHeaderViewModel, modifier: Modifier = Modifier) { val longerText = viewModel.longerDateText.collectAsStateWithLifecycle() val shorterText = viewModel.shorterDateText.collectAsStateWithLifecycle() + val textColor = + if (viewModel.highlightNotificationIcons) colorAttr(android.R.attr.textColorPrimaryInverse) + else colorAttr(android.R.attr.textColorPrimary) + Layout( contents = listOf( @@ -24,7 +25,7 @@ fun VariableDayDate( Text( text = longerText.value, style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.shadeHeaderText, + color = textColor, maxLines = 1, ) }, @@ -32,7 +33,7 @@ fun VariableDayDate( Text( text = shorterText.value, style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.shadeHeaderText, + color = textColor, maxLines = 1, ) }, diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/MediaOutputModule.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/MediaOutputModule.kt index f1cc71bc59af..c73656eb1ec5 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/MediaOutputModule.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/MediaOutputModule.kt @@ -16,9 +16,9 @@ package com.android.systemui.volume.panel.component.mediaoutput +import com.android.systemui.volume.panel.component.mediaoutput.domain.MediaOutputAvailabilityCriteria import com.android.systemui.volume.panel.component.mediaoutput.ui.composable.MediaOutputComponent import com.android.systemui.volume.panel.component.shared.model.VolumePanelComponents -import com.android.systemui.volume.panel.domain.AlwaysAvailableCriteria import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria import com.android.systemui.volume.panel.shared.model.VolumePanelUiComponent import dagger.Binds @@ -39,6 +39,6 @@ interface MediaOutputModule { @IntoMap @StringKey(VolumePanelComponents.MEDIA_OUTPUT) fun bindComponentAvailabilityCriteria( - criteria: AlwaysAvailableCriteria + criteria: MediaOutputAvailabilityCriteria ): ComponentAvailabilityCriteria } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt index 184c2a28727b..f6d40eef53a3 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt @@ -17,6 +17,9 @@ package com.android.compose.animation.scene import androidx.annotation.FloatRange +import androidx.compose.foundation.LocalOverscrollFactory +import androidx.compose.foundation.OverscrollEffect +import androidx.compose.foundation.OverscrollFactory import androidx.compose.foundation.gestures.Orientation import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect @@ -37,7 +40,6 @@ import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.LayoutDirection import com.android.compose.gesture.NestedScrollableBound -import com.android.compose.gesture.effect.ContentOverscrollEffect /** * [SceneTransitionLayout] is a container that automatically animates its content whenever its state @@ -82,12 +84,19 @@ interface SceneTransitionLayoutScope<out CS : ContentScope> { * You can configure [userActions] so that swiping on this layout or navigating back will * transition to a different scene. * + * By default, [verticalOverscrollEffect][ContentScope.verticalOverscrollEffect] and + * [horizontalOverscrollEffect][ContentScope.horizontalOverscrollEffect] of this scene will be + * created using [LocalOverscrollFactory]. You can specify a non-null [effectFactory] to set up + * a custom factory that will be used by this scene and by any calls to + * rememberOverscrollEffect() inside the scene. + * * Important: scene order along the z-axis follows call order. Calling scene(A) followed by * scene(B) will mean that scene B renders after/above scene A. */ fun scene( key: SceneKey, userActions: Map<UserAction, UserActionResult> = emptyMap(), + effectFactory: OverscrollFactory? = null, content: @Composable CS.() -> Unit, ) @@ -108,6 +117,12 @@ interface SceneTransitionLayoutScope<out CS : ContentScope> { * to prevent swipes from reaching other scenes or overlays behind this one. Clicking this * protective layer will close the overlay. * + * By default, [verticalOverscrollEffect][ContentScope.verticalOverscrollEffect] and + * [horizontalOverscrollEffect][ContentScope.horizontalOverscrollEffect] of this overlay will be + * created using [LocalOverscrollFactory]. You can specify a non-null [effectFactory] to set up + * a custom factory that will be used by this content and by any calls to + * rememberOverscrollEffect() inside the content. + * * Important: overlays must be defined after all scenes. Overlay order along the z-axis follows * call order. Calling overlay(A) followed by overlay(B) will mean that overlay B renders * after/above overlay A. @@ -118,6 +133,7 @@ interface SceneTransitionLayoutScope<out CS : ContentScope> { mapOf(Back to UserActionResult.HideOverlay(key)), alignment: Alignment = Alignment.Center, isModal: Boolean = true, + effectFactory: OverscrollFactory? = null, content: @Composable CS.() -> Unit, ) } @@ -262,7 +278,7 @@ interface ContentScope : BaseContentScope { * The overscroll effect applied to the content in the vertical direction. This can be used to * customize how the content behaves when the scene is over scrolled. * - * For example, you can use it with the `Modifier.overscroll()` modifier: + * You should use this effect exactly once with the `Modifier.overscroll()` modifier: * ```kotlin * @Composable * fun ContentScope.MyScene() { @@ -276,26 +292,9 @@ interface ContentScope : BaseContentScope { * } * ``` * - * Or you can read the `overscrollDistance` value directly, if you need some custom overscroll - * behavior: - * ```kotlin - * @Composable - * fun ContentScope.MyScene() { - * Box( - * modifier = Modifier - * .graphicsLayer { - * // Translate half of the overscroll - * translationY = verticalOverscrollEffect.overscrollDistance * 0.5f - * } - * ) { - * // ... your content ... - * } - * } - * ``` - * * @see horizontalOverscrollEffect */ - val verticalOverscrollEffect: ContentOverscrollEffect + val verticalOverscrollEffect: OverscrollEffect /** * The overscroll effect applied to the content in the horizontal direction. This can be used to @@ -303,7 +302,7 @@ interface ContentScope : BaseContentScope { * * @see verticalOverscrollEffect */ - val horizontalOverscrollEffect: ContentOverscrollEffect + val horizontalOverscrollEffect: OverscrollEffect /** * Animate some value at the content level. @@ -746,6 +745,7 @@ internal fun SceneTransitionLayoutForTesting( val density = LocalDensity.current val directionChangeSlop = LocalViewConfiguration.current.touchSlop val layoutDirection = LocalLayoutDirection.current + val defaultEffectFactory = checkNotNull(LocalOverscrollFactory.current) val animationScope = rememberCoroutineScope() val layoutImpl = remember { SceneTransitionLayoutImpl( @@ -761,13 +761,14 @@ internal fun SceneTransitionLayoutForTesting( ancestors = ancestors, lookaheadScope = lookaheadScope, directionChangeSlop = directionChangeSlop, + defaultEffectFactory = defaultEffectFactory, ) .also { onLayoutImpl?.invoke(it) } } // TODO(b/317014852): Move this into the SideEffect {} again once STLImpl.scenes is not a // SnapshotStateMap anymore. - layoutImpl.updateContents(builder, layoutDirection) + layoutImpl.updateContents(builder, layoutDirection, defaultEffectFactory) SideEffect { if (state != layoutImpl.state) { diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt index 16fd5b1e78e6..585da0633131 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt @@ -17,6 +17,7 @@ package com.android.compose.animation.scene import androidx.annotation.VisibleForTesting +import androidx.compose.foundation.OverscrollFactory import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.interaction.MutableInteractionSource @@ -120,6 +121,7 @@ internal class SceneTransitionLayoutImpl( */ internal val ancestors: List<Ancestor> = emptyList(), lookaheadScope: LookaheadScope? = null, + defaultEffectFactory: OverscrollFactory, ) { /** @@ -201,7 +203,7 @@ internal class SceneTransitionLayoutImpl( private val nestedScrollConnection = object : NestedScrollConnection {} init { - updateContents(builder, layoutDirection) + updateContents(builder, layoutDirection, defaultEffectFactory) // DraggableHandlerImpl must wait for the scenes to be initialized, in order to access the // current scene (required for SwipeTransition). @@ -209,14 +211,14 @@ internal class SceneTransitionLayoutImpl( DraggableHandler( layoutImpl = this, orientation = Orientation.Horizontal, - gestureEffectProvider = { content(it).scope.horizontalOverscrollGestureEffect }, + gestureEffectProvider = { content(it).horizontalEffects.gestureEffect }, ) verticalDraggableHandler = DraggableHandler( layoutImpl = this, orientation = Orientation.Vertical, - gestureEffectProvider = { content(it).scope.verticalOverscrollGestureEffect }, + gestureEffectProvider = { content(it).verticalEffects.gestureEffect }, ) // Make sure that the state is created on the same thread (most probably the main thread) @@ -286,6 +288,7 @@ internal class SceneTransitionLayoutImpl( internal fun updateContents( builder: SceneTransitionLayoutScope<InternalContentScope>.() -> Unit, layoutDirection: LayoutDirection, + defaultEffectFactory: OverscrollFactory, ) { // Keep a reference of the current contents. After processing [builder], the contents that // were not configured will be removed. @@ -303,6 +306,7 @@ internal class SceneTransitionLayoutImpl( override fun scene( key: SceneKey, userActions: Map<UserAction, UserActionResult>, + effectFactory: OverscrollFactory?, content: @Composable InternalContentScope.() -> Unit, ) { require(!overlaysDefined) { "all scenes must be defined before overlays" } @@ -313,12 +317,14 @@ internal class SceneTransitionLayoutImpl( val scene = scenes[key] val globalZIndex = Content.calculateGlobalZIndex(parentZIndex, ++zIndex, ancestors.size) + val factory = effectFactory ?: defaultEffectFactory if (scene != null) { // Update an existing scene. scene.content = content scene.userActions = resolvedUserActions scene.zIndex = zIndex.toFloat() scene.globalZIndex = globalZIndex + scene.maybeUpdateEffects(factory) } else { // New scene. scenes[key] = @@ -329,6 +335,7 @@ internal class SceneTransitionLayoutImpl( resolvedUserActions, zIndex.toFloat(), globalZIndex, + factory, ) } } @@ -338,6 +345,7 @@ internal class SceneTransitionLayoutImpl( userActions: Map<UserAction, UserActionResult>, alignment: Alignment, isModal: Boolean, + effectFactory: OverscrollFactory?, content: @Composable (InternalContentScope.() -> Unit), ) { overlaysDefined = true @@ -347,6 +355,7 @@ internal class SceneTransitionLayoutImpl( val resolvedUserActions = resolveUserActions(key, userActions, layoutDirection) val globalZIndex = Content.calculateGlobalZIndex(parentZIndex, ++zIndex, ancestors.size) + val factory = effectFactory ?: defaultEffectFactory if (overlay != null) { // Update an existing overlay. overlay.content = content @@ -355,6 +364,7 @@ internal class SceneTransitionLayoutImpl( overlay.userActions = resolvedUserActions overlay.alignment = alignment overlay.isModal = isModal + overlay.maybeUpdateEffects(factory) } else { // New overlay. overlays[key] = @@ -367,6 +377,7 @@ internal class SceneTransitionLayoutImpl( globalZIndex, alignment, isModal, + factory, ) } } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt index 86201a9c0879..b7daaf4075ed 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt @@ -17,13 +17,12 @@ package com.android.compose.animation.scene.content import android.annotation.SuppressLint -import androidx.compose.animation.core.AnimationSpec -import androidx.compose.animation.core.AnimationVector -import androidx.compose.animation.core.TwoWayConverter -import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.LocalOverscrollFactory +import androidx.compose.foundation.OverscrollEffect +import androidx.compose.foundation.OverscrollFactory import androidx.compose.foundation.layout.Box -import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf @@ -60,12 +59,10 @@ import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.ValueKey import com.android.compose.animation.scene.animateSharedValueAsState import com.android.compose.animation.scene.effect.GestureEffect -import com.android.compose.animation.scene.effect.VisualEffect import com.android.compose.animation.scene.element import com.android.compose.animation.scene.modifiers.noResizeDuringTransitions import com.android.compose.gesture.NestedScrollControlState import com.android.compose.gesture.NestedScrollableBound -import com.android.compose.gesture.effect.OffsetOverscrollEffect import com.android.compose.gesture.nestedScrollController import com.android.compose.modifiers.thenIf import com.android.compose.ui.graphics.ContainerState @@ -81,11 +78,14 @@ internal sealed class Content( actions: Map<UserAction.Resolved, UserActionResult>, zIndex: Float, globalZIndex: Long, + effectFactory: OverscrollFactory, ) { private val nestedScrollControlState = NestedScrollControlState() internal val scope = ContentScopeImpl(layoutImpl, content = this, nestedScrollControlState) val containerState = ContainerState() + // Important: All fields in this class should be backed by State given that contents are updated + // directly during composition, outside of a SideEffect. var content by mutableStateOf(content) var targetSize by mutableStateOf(IntSize.Zero) var userActions by mutableStateOf(actions) @@ -143,16 +143,26 @@ internal sealed class Content( } } + private var lastFactory by mutableStateOf(effectFactory) + var verticalEffects by mutableStateOf(ContentEffects(effectFactory)) + private set + + var horizontalEffects by mutableStateOf(ContentEffects(effectFactory)) + private set + @SuppressLint("NotConstructor") @Composable fun Content(modifier: Modifier = Modifier) { + // If this content has a custom factory, provide it to the content so that the factory is + // automatically used when calling rememberOverscrollEffect(). Box( modifier .zIndex(zIndex) .approachLayout( isMeasurementApproachInProgress = { layoutImpl.state.isTransitioning() } ) { measurable, constraints -> - // TODO(b/353679003): Use the ModifierNode API to set this *before* the approach + // TODO(b/353679003): Use the ModifierNode API to set this *before* the + // approach // pass is started. targetSize = lookaheadSize val placeable = measurable.measure(constraints) @@ -163,11 +173,26 @@ internal sealed class Content( } .testTag(key.testTag) ) { - scope.content() + CompositionLocalProvider(LocalOverscrollFactory provides lastFactory) { + scope.content() + } } } fun areSwipesAllowed(): Boolean = nestedScrollControlState.isOuterScrollAllowed + + fun maybeUpdateEffects(effectFactory: OverscrollFactory) { + if (effectFactory != lastFactory) { + lastFactory = effectFactory + verticalEffects = ContentEffects(effectFactory) + horizontalEffects = ContentEffects(effectFactory) + } + } +} + +internal class ContentEffects(factory: OverscrollFactory) { + val overscrollEffect = factory.createOverscrollEffect() + val gestureEffect = GestureEffect(overscrollEffect) } internal class ContentScopeImpl( @@ -183,34 +208,11 @@ internal class ContentScopeImpl( override val lookaheadScope: LookaheadScope get() = layoutImpl.lookaheadScope - @OptIn(ExperimentalMaterial3ExpressiveApi::class) - private val animationSpatialSpec = - object : AnimationSpec<Float> { - override fun <V : AnimationVector> vectorize(converter: TwoWayConverter<Float, V>) = - layoutImpl.state.motionScheme.defaultSpatialSpec<Float>().vectorize(converter) - } - - private val _verticalOverscrollEffect = - OffsetOverscrollEffect( - orientation = Orientation.Vertical, - animationScope = layoutImpl.animationScope, - animationSpec = animationSpatialSpec, - ) - - private val _horizontalOverscrollEffect = - OffsetOverscrollEffect( - orientation = Orientation.Horizontal, - animationScope = layoutImpl.animationScope, - animationSpec = animationSpatialSpec, - ) - - val verticalOverscrollGestureEffect = GestureEffect(_verticalOverscrollEffect) - - val horizontalOverscrollGestureEffect = GestureEffect(_horizontalOverscrollEffect) - - override val verticalOverscrollEffect = VisualEffect(_verticalOverscrollEffect) + override val verticalOverscrollEffect: OverscrollEffect + get() = content.verticalEffects.overscrollEffect - override val horizontalOverscrollEffect = VisualEffect(_horizontalOverscrollEffect) + override val horizontalOverscrollEffect: OverscrollEffect + get() = content.horizontalEffects.overscrollEffect override fun Modifier.element(key: ElementKey): Modifier { return element(layoutImpl, content, key) diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Overlay.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Overlay.kt index 300de3f36b1f..4fbca430bc4b 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Overlay.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Overlay.kt @@ -16,6 +16,7 @@ package com.android.compose.animation.scene.content +import androidx.compose.foundation.OverscrollFactory import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue @@ -39,7 +40,8 @@ internal class Overlay( globalZIndex: Long, alignment: Alignment, isModal: Boolean, -) : Content(key, layoutImpl, content, actions, zIndex, globalZIndex) { + effectFactory: OverscrollFactory, +) : Content(key, layoutImpl, content, actions, zIndex, globalZIndex, effectFactory) { var alignment by mutableStateOf(alignment) var isModal by mutableStateOf(isModal) diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Scene.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Scene.kt index 275341c7268b..7f57798fb1b3 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Scene.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Scene.kt @@ -16,6 +16,7 @@ package com.android.compose.animation.scene.content +import androidx.compose.foundation.OverscrollFactory import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import com.android.compose.animation.scene.InternalContentScope @@ -33,7 +34,8 @@ internal class Scene( actions: Map<UserAction.Resolved, UserActionResult>, zIndex: Float, globalZIndex: Long, -) : Content(key, layoutImpl, content, actions, zIndex, globalZIndex) { + effectFactory: OverscrollFactory, +) : Content(key, layoutImpl, content, actions, zIndex, globalZIndex, effectFactory) { override fun toString(): String { return "Scene(key=$key)" } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/effect/GestureEffect.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/effect/GestureEffect.kt index 2db45aa3dd58..a537c8764b0a 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/effect/GestureEffect.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/effect/GestureEffect.kt @@ -16,14 +16,14 @@ package com.android.compose.animation.scene.effect +import androidx.compose.foundation.OverscrollEffect import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity -import com.android.compose.gesture.effect.ContentOverscrollEffect /** An overscroll effect that ensures only a single fling animation is triggered. */ -internal class GestureEffect(private val delegate: ContentOverscrollEffect) : - ContentOverscrollEffect by delegate { +internal class GestureEffect(private val delegate: OverscrollEffect) : + OverscrollEffect by delegate { private var shouldFling = false override fun applyToScroll( @@ -51,25 +51,3 @@ internal class GestureEffect(private val delegate: ContentOverscrollEffect) : applyToFling(Velocity.Zero) { Velocity.Zero } } } - -/** - * An overscroll effect that only applies visual effects and does not interfere with the actual - * scrolling or flinging behavior. - */ -internal class VisualEffect(private val delegate: ContentOverscrollEffect) : - ContentOverscrollEffect by delegate { - override fun applyToScroll( - delta: Offset, - source: NestedScrollSource, - performScroll: (Offset) -> Offset, - ): Offset { - return performScroll(delta) - } - - override suspend fun applyToFling( - velocity: Velocity, - performFling: suspend (Velocity) -> Velocity, - ) { - performFling(velocity) - } -} diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt index 68e85db2c80b..6b439980cc68 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt @@ -14,11 +14,15 @@ * limitations under the License. */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package com.android.compose.animation.scene import androidx.compose.animation.core.Spring import androidx.compose.animation.core.spring import androidx.compose.foundation.overscroll +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.MotionScheme import androidx.compose.material3.Text import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset @@ -40,6 +44,7 @@ import com.android.compose.animation.scene.content.state.TransitionState.Compani import com.android.compose.animation.scene.content.state.TransitionState.Transition import com.android.compose.animation.scene.subjects.assertThat import com.android.compose.gesture.NestedDraggable +import com.android.compose.gesture.effect.OffsetOverscrollEffectFactory import com.android.compose.test.MonotonicClockTestScope import com.android.compose.test.runMonotonicClockTest import com.android.mechanics.spec.InputDirection @@ -67,22 +72,25 @@ class DraggableHandlerTest { canChangeScene = { canChangeScene(it) }, ) + val defaultEffectFactory = + OffsetOverscrollEffectFactory(testScope, MotionScheme.standard().defaultSpatialSpec()) + var layoutDirection = LayoutDirection.Rtl set(value) { field = value - layoutImpl.updateContents(scenesBuilder, layoutDirection) + layoutImpl.updateContents(scenesBuilder, layoutDirection, defaultEffectFactory) } var mutableUserActionsA = mapOf(Swipe.Up to SceneB, Swipe.Down to SceneC) set(value) { field = value - layoutImpl.updateContents(scenesBuilder, layoutDirection) + layoutImpl.updateContents(scenesBuilder, layoutDirection, defaultEffectFactory) } var mutableUserActionsB = mapOf(Swipe.Up to SceneC, Swipe.Down to SceneA) set(value) { field = value - layoutImpl.updateContents(scenesBuilder, layoutDirection) + layoutImpl.updateContents(scenesBuilder, layoutDirection, defaultEffectFactory) } private val scenesBuilder: SceneTransitionLayoutScope<ContentScope>.() -> Unit = { @@ -125,6 +133,7 @@ class DraggableHandlerTest { // work well with advanceUntilIdle(), which is used by some tests. animationScope = testScope, directionChangeSlop = directionChangeSlop, + defaultEffectFactory = defaultEffectFactory, ) .apply { setContentsAndLayoutTargetSizeForTest(LAYOUT_SIZE) } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt index 8d0af9b57f2a..f625add0648b 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt @@ -18,6 +18,7 @@ package com.android.compose.animation.scene import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.tween +import androidx.compose.foundation.LocalOverscrollFactory import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.rememberScrollableState import androidx.compose.foundation.gestures.scrollable @@ -32,6 +33,7 @@ import androidx.compose.foundation.overscroll import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue @@ -72,6 +74,7 @@ import com.android.compose.animation.scene.TestScenes.SceneB import com.android.compose.animation.scene.TestScenes.SceneC import com.android.compose.animation.scene.subjects.assertThat import com.android.compose.gesture.effect.OffsetOverscrollEffect +import com.android.compose.gesture.effect.rememberOffsetOverscrollEffectFactory import com.android.compose.test.assertSizeIsEqualTo import com.android.compose.test.setContentAndCreateMainScope import com.android.compose.test.transition @@ -668,16 +671,20 @@ class ElementTest { rule.setContent { density = LocalDensity.current touchSlop = LocalViewConfiguration.current.touchSlop - SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { - scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { - Spacer(Modifier.fillMaxSize()) - } - scene(SceneB) { - Spacer( - Modifier.overscroll(verticalOverscrollEffect) - .fillMaxSize() - .element(TestElements.Foo) - ) + CompositionLocalProvider( + LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory() + ) { + SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { + scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { + Spacer(Modifier.fillMaxSize()) + } + scene(SceneB) { + Spacer( + Modifier.overscroll(verticalOverscrollEffect) + .fillMaxSize() + .element(TestElements.Foo) + ) + } } } } @@ -724,20 +731,24 @@ class ElementTest { rule.setContent { density = LocalDensity.current touchSlop = LocalViewConfiguration.current.touchSlop - SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { - scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { - Spacer( - Modifier.overscroll(verticalOverscrollEffect) - .fillMaxSize() - .element(TestElements.Foo) - ) - } - scene(SceneB) { - Spacer( - Modifier.overscroll(verticalOverscrollEffect) - .fillMaxSize() - .element(TestElements.Bar) - ) + CompositionLocalProvider( + LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory() + ) { + SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { + scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { + Spacer( + Modifier.overscroll(verticalOverscrollEffect) + .fillMaxSize() + .element(TestElements.Foo) + ) + } + scene(SceneB) { + Spacer( + Modifier.overscroll(verticalOverscrollEffect) + .fillMaxSize() + .element(TestElements.Bar) + ) + } } } } @@ -820,16 +831,20 @@ class ElementTest { rule.setContent { density = LocalDensity.current touchSlop = LocalViewConfiguration.current.touchSlop - SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { - scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { - Spacer(Modifier.fillMaxSize()) - } - scene(SceneB) { - Spacer( - Modifier.overscroll(verticalOverscrollEffect) - .element(TestElements.Foo) - .fillMaxSize() - ) + CompositionLocalProvider( + LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory() + ) { + SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { + scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { + Spacer(Modifier.fillMaxSize()) + } + scene(SceneB) { + Spacer( + Modifier.overscroll(verticalOverscrollEffect) + .element(TestElements.Foo) + .fillMaxSize() + ) + } } } } @@ -875,27 +890,31 @@ class ElementTest { rule.setContent { density = LocalDensity.current touchSlop = LocalViewConfiguration.current.touchSlop - SceneTransitionLayout( - state = state, - modifier = Modifier.size(layoutWidth, layoutHeight), + CompositionLocalProvider( + LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory() ) { - scene(SceneA, userActions = mapOf(Swipe.Down to SceneB)) { - Box( - Modifier - // A scrollable that does not consume the scroll gesture - .scrollable( - state = rememberScrollableState(consumeScrollDelta = { 0f }), - orientation = Orientation.Vertical, - ) - .fillMaxSize() - ) - } - scene(SceneB) { - Spacer( - Modifier.overscroll(verticalOverscrollEffect) - .element(TestElements.Foo) - .fillMaxSize() - ) + SceneTransitionLayout( + state = state, + modifier = Modifier.size(layoutWidth, layoutHeight), + ) { + scene(SceneA, userActions = mapOf(Swipe.Down to SceneB)) { + Box( + Modifier + // A scrollable that does not consume the scroll gesture + .scrollable( + state = rememberScrollableState(consumeScrollDelta = { 0f }), + orientation = Orientation.Vertical, + ) + .fillMaxSize() + ) + } + scene(SceneB) { + Spacer( + Modifier.overscroll(verticalOverscrollEffect) + .element(TestElements.Foo) + .fillMaxSize() + ) + } } } } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt index b4b328b14a78..04c762f43907 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt @@ -18,21 +18,29 @@ package com.android.compose.animation.scene import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.tween +import androidx.compose.foundation.LocalOverscrollFactory +import androidx.compose.foundation.OverscrollEffect +import androidx.compose.foundation.OverscrollFactory import androidx.compose.foundation.ScrollState import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberOverscrollEffect import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.platform.testTag import androidx.compose.ui.test.SemanticsMatcher @@ -47,6 +55,7 @@ import androidx.compose.ui.test.onRoot import androidx.compose.ui.test.performTouchInput import androidx.compose.ui.test.swipe import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.compose.animation.scene.TestOverlays.OverlayA @@ -884,4 +893,65 @@ class OverlayTest { assertThat(state.transitionState).hasCurrentScene(SceneA) assertThat(state.transitionState).hasCurrentOverlays(OverlayC, OverlayD) } + + @Test + fun effectFactory() { + val effects = mutableSetOf<OverscrollEffect>() + var customFactory by mutableStateOf<OverscrollFactory?>(null) + rule.setContent { + CompositionLocalProvider(LocalOverscrollFactory provides DefaultEffectFactory) { + SceneTransitionLayout( + remember { MutableSceneTransitionLayoutStateForTests(SceneA) } + ) { + scene(SceneA, effectFactory = customFactory) { + val effect = checkNotNull(rememberOverscrollEffect()) + SideEffect { + effects.add(effect) + effects.add(horizontalOverscrollEffect) + effects.add(verticalOverscrollEffect) + } + } + } + } + } + + assertThat(effects.size).isEqualTo(3) + effects.forEach { assertThat(it).isInstanceOf(DefaultEffect::class.java) } + + effects.clear() + customFactory = CustomEffectFactory + rule.waitForIdle() + + assertThat(effects.size).isEqualTo(3) + effects.forEach { assertThat(it).isInstanceOf(CustomEffect::class.java) } + } + + private abstract class NoOpEffect : OverscrollEffect { + override val isInProgress: Boolean = false + + override suspend fun applyToFling( + velocity: Velocity, + performFling: suspend (Velocity) -> Velocity, + ) { + performFling(velocity) + } + + override fun applyToScroll( + delta: Offset, + source: NestedScrollSource, + performScroll: (Offset) -> Offset, + ): Offset = performScroll(delta) + } + + private class DefaultEffect : NoOpEffect() + + private class CustomEffect : NoOpEffect() + + private data object DefaultEffectFactory : OverscrollFactory { + override fun createOverscrollEffect(): OverscrollEffect = DefaultEffect() + } + + private data object CustomEffectFactory : OverscrollFactory { + override fun createOverscrollEffect(): OverscrollEffect = CustomEffect() + } } diff --git a/packages/SystemUI/docs/scene.md b/packages/SystemUI/docs/scene.md index bf15b4feadfb..aa3ac08b972c 100644 --- a/packages/SystemUI/docs/scene.md +++ b/packages/SystemUI/docs/scene.md @@ -68,12 +68,9 @@ file evaluates to `true`. 1. Set a collection of **aconfig flags** to `true` by running the following commands: ```console - $ adb shell device_config override systemui com.android.systemui.keyguard_bottom_area_refactor true - $ adb shell device_config override systemui com.android.systemui.keyguard_wm_state_refactor true - $ adb shell device_config override systemui com.android.systemui.migrate_clocks_to_blueprint true - $ adb shell device_config override systemui com.android.systemui.notification_avalanche_throttle_hun true - $ adb shell device_config override systemui com.android.systemui.predictive_back_sysui true - $ adb shell device_config override systemui com.android.systemui.scene_container true + $ adb shell aflags enable com.android.systemui.keyguard_wm_state_refactor --immediate + $ adb shell aflags enable com.android.systemui.notification_avalanche_throttle_hun --immediate + $ adb shell aflags enable com.android.systemui.scene_container --immediate ``` 2. **Restart** System UI by issuing the following command: ```console @@ -87,19 +84,16 @@ file evaluates to `true`. NOTE: this will be removed proper to the actual release of the framework. - *(b)* Turn on logging and look for the logging statements in `logcat`: - ```console - - # Turn on logging from the framework: + *(b)* look in logcat, see the "Checking if the framework is enabled" section + below. - $ adb shell cmd statusbar echo -b SceneFramework:verbose ### Checking if the framework is enabled Look for the log statements from the framework: ```console -$ adb logcat -v time SceneFramework:* *:S +$ adb logcat -s SceneFramework ``` ### Disabling the framework @@ -107,7 +101,7 @@ $ adb logcat -v time SceneFramework:* *:S To **disable** the framework, simply turn off the main aconfig flag: ```console -$ adb shell device_config put systemui com.android.systemui.scene_container false +$ adb shell aflags unset com.android.systemui.scene_container --immediate ``` ## Defining a scene diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt index 1841d2ea6132..d2b61c0ab745 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt @@ -783,7 +783,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() { underTest.reinflateViewFlipper(onViewInflatedCallback) verify(viewFlipperController).clearViews() verify(viewFlipperController) - .asynchronouslyInflateView(any(), any(), onViewInflatedCallbackArgumentCaptor.capture()) + .getSecurityView(any(), any(), onViewInflatedCallbackArgumentCaptor.capture()) onViewInflatedCallbackArgumentCaptor.value.onViewInflated(inputViewController) verify(view).updateSecurityViewFlipper() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java index 7bb6ef1c8895..23e07b185a2e 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java @@ -20,6 +20,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; @@ -129,23 +130,40 @@ public class KeyguardSecurityViewFlipperControllerTest extends SysuiTestCase { } @Test - public void asynchronouslyInflateView() { - mKeyguardSecurityViewFlipperController.asynchronouslyInflateView(SecurityMode.PIN, - mKeyguardSecurityCallback, null); - verify(mAsyncLayoutInflater).inflate(anyInt(), eq(mView), any( - AsyncLayoutInflater.OnInflateFinishedListener.class)); + public void asynchronouslyInflateView_setNeedsInput() { + mKeyguardSecurityViewFlipperController.clearViews(); + ArgumentCaptor<AsyncLayoutInflater.OnInflateFinishedListener> argumentCaptor = + ArgumentCaptor.forClass(AsyncLayoutInflater.OnInflateFinishedListener.class); + mKeyguardSecurityViewFlipperController.getSecurityView(SecurityMode.PIN, + mKeyguardSecurityCallback, controller -> {}); + verify(mAsyncLayoutInflater).inflate(anyInt(), eq(mView), argumentCaptor.capture()); + argumentCaptor.getValue().onInflateFinished( + LayoutInflater.from(getContext()).inflate(R.layout.keyguard_pin_view, null), + R.layout.keyguard_pin_view, mView); } @Test - public void asynchronouslyInflateView_setNeedsInput() { + public void getSecurityView_multipleInvocations_callsAsyncInflateOnce() { + mKeyguardSecurityViewFlipperController.clearViews(); + // Make 2 calls to get security view + var callback1 = mock(KeyguardSecurityViewFlipperController.OnViewInflatedCallback.class); + var callback2 = mock(KeyguardSecurityViewFlipperController.OnViewInflatedCallback.class); + mKeyguardSecurityViewFlipperController.getSecurityView(SecurityMode.PIN, + mKeyguardSecurityCallback, callback1); + mKeyguardSecurityViewFlipperController.getSecurityView(SecurityMode.PIN, + mKeyguardSecurityCallback, callback2); + + // Verify inflation is called once... ArgumentCaptor<AsyncLayoutInflater.OnInflateFinishedListener> argumentCaptor = ArgumentCaptor.forClass(AsyncLayoutInflater.OnInflateFinishedListener.class); - mKeyguardSecurityViewFlipperController.asynchronouslyInflateView(SecurityMode.PIN, - mKeyguardSecurityCallback, null); verify(mAsyncLayoutInflater).inflate(anyInt(), eq(mView), argumentCaptor.capture()); argumentCaptor.getValue().onInflateFinished( - LayoutInflater.from(getContext()).inflate(R.layout.keyguard_password_view, null), - R.layout.keyguard_password_view, mView); + LayoutInflater.from(getContext()).inflate(R.layout.keyguard_pin_view, null), + R.layout.keyguard_pin_view, mView); + + // ... and both callbacks get invoked + verify(callback1).onViewInflated(mKeyguardInputViewController); + verify(callback2).onViewInflated(mKeyguardInputViewController); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/data/repository/ConfigurationRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/data/repository/ConfigurationRepositoryImplTest.kt index 3f4d3f8ba12a..205f94434970 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/data/repository/ConfigurationRepositoryImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/data/repository/ConfigurationRepositoryImplTest.kt @@ -40,6 +40,7 @@ import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import org.mockito.kotlin.clearInvocations @ExperimentalCoroutinesApi @SmallTest @@ -65,11 +66,13 @@ class ConfigurationRepositoryImplTest : SysuiTestCase() { testScope.backgroundScope, displayUtils, ) + testScope.runCurrent() } @Test fun onAnyConfigurationChange_updatesOnUiModeChanged() = testScope.runTest { + clearInvocations(configurationController) val lastAnyConfigurationChange by collectLastValue(underTest.onAnyConfigurationChange) assertThat(lastAnyConfigurationChange).isNull() @@ -85,6 +88,7 @@ class ConfigurationRepositoryImplTest : SysuiTestCase() { @Test fun onAnyConfigurationChange_updatesOnThemeChanged() = testScope.runTest { + clearInvocations(configurationController) val lastAnyConfigurationChange by collectLastValue(underTest.onAnyConfigurationChange) assertThat(lastAnyConfigurationChange).isNull() @@ -101,7 +105,7 @@ class ConfigurationRepositoryImplTest : SysuiTestCase() { fun onMovedToDisplays_updatesOnMovedToDisplay() = testScope.runTest { val lastOnMovedToDisplay by collectLastValue(underTest.onMovedToDisplay) - assertThat(lastOnMovedToDisplay).isNull() + assertThat(lastOnMovedToDisplay).isEqualTo(Display.DEFAULT_DISPLAY) val configurationCallback = withArgCaptor { verify(configurationController).addCallback(capture()) @@ -115,6 +119,7 @@ class ConfigurationRepositoryImplTest : SysuiTestCase() { @Test fun onAnyConfigurationChange_updatesOnConfigChanged() = testScope.runTest { + clearInvocations(configurationController) val lastAnyConfigurationChange by collectLastValue(underTest.onAnyConfigurationChange) assertThat(lastAnyConfigurationChange).isNull() @@ -130,6 +135,7 @@ class ConfigurationRepositoryImplTest : SysuiTestCase() { @Test fun onResolutionScale_updatesOnConfigurationChange() = testScope.runTest { + clearInvocations(configurationController) val scaleForResolution by collectLastValue(underTest.scaleForResolution) assertThat(scaleForResolution).isEqualTo(displaySizeRatio) @@ -149,6 +155,7 @@ class ConfigurationRepositoryImplTest : SysuiTestCase() { @Test fun onResolutionScale_nullMaxResolution() = testScope.runTest { + clearInvocations(configurationController) val scaleForResolution by collectLastValue(underTest.scaleForResolution) runCurrent() @@ -203,7 +210,7 @@ class ConfigurationRepositoryImplTest : SysuiTestCase() { anyInt(), anyInt(), anyInt(), - anyInt() + anyInt(), ) ) .thenReturn(ratio) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractorTest.kt new file mode 100644 index 000000000000..0df8834618d5 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractorTest.kt @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.domain.interactor + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.communal.posturing.data.repository.fake +import com.android.systemui.communal.posturing.data.repository.posturingRepository +import com.android.systemui.communal.posturing.shared.model.PosturedState +import com.android.systemui.kosmos.collectLastValue +import com.android.systemui.kosmos.runTest +import com.android.systemui.kosmos.useUnconfinedTestDispatcher +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class PosturingInteractorTest : SysuiTestCase() { + + private val kosmos = testKosmos().useUnconfinedTestDispatcher() + + private val underTest by lazy { kosmos.posturingInteractor } + + @Test + fun testNoDebugOverride() = + kosmos.runTest { + val postured by collectLastValue(underTest.postured) + assertThat(postured).isFalse() + + posturingRepository.fake.setPosturedState(PosturedState.Postured(1f)) + assertThat(postured).isTrue() + } + + @Test + fun testOverriddenByDebugValue() = + kosmos.runTest { + val postured by collectLastValue(underTest.postured) + assertThat(postured).isFalse() + + underTest.setValueForDebug(PosturedState.NotPostured) + posturingRepository.fake.setPosturedState(PosturedState.Postured(1f)) + + // Repository value is overridden by debug value + assertThat(postured).isFalse() + + underTest.setValueForDebug(PosturedState.Unknown) + assertThat(postured).isTrue() + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/ui/TemperatureControlBehaviorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/ui/TemperatureControlBehaviorTest.kt index b3f458821cba..70570f9323f1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/ui/TemperatureControlBehaviorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/controls/ui/TemperatureControlBehaviorTest.kt @@ -12,13 +12,14 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.controls.ControlsMetricsLogger import com.android.systemui.controls.controller.ControlInfo import com.android.systemui.controls.controller.ControlsController +import com.android.systemui.res.R import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.time.FakeSystemClock +import com.android.systemui.utils.SafeIconLoader import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -32,6 +33,7 @@ class TemperatureControlBehaviorTest : SysuiTestCase() { @Mock lateinit var controlsMetricsLogger: ControlsMetricsLogger @Mock lateinit var controlActionCoordinator: ControlActionCoordinator @Mock lateinit var controlsController: ControlsController + @Mock lateinit var safeIconLoader: SafeIconLoader private val fakeSystemClock = FakeSystemClock() private val underTest = TemperatureControlBehavior() @@ -53,6 +55,7 @@ class TemperatureControlBehaviorTest : SysuiTestCase() { controlsMetricsLogger, 0, 0, + safeIconLoader, ) } @@ -61,12 +64,7 @@ class TemperatureControlBehaviorTest : SysuiTestCase() { val controlWithState = ControlWithState( ComponentName("test.pkg", "TestClass"), - ControlInfo( - "test_id", - "test title", - "test subtitle", - DeviceTypes.TYPE_AC_UNIT, - ), + ControlInfo("test_id", "test title", "test subtitle", DeviceTypes.TYPE_AC_UNIT), Control.StatefulBuilder( "", PendingIntent.getActivity( @@ -87,11 +85,11 @@ class TemperatureControlBehaviorTest : SysuiTestCase() { ), 0, 0, - 0 + 0, ) ) .setStatus(Control.STATUS_OK) - .build() + .build(), ) viewHolder.bindData(controlWithState, false) underTest.initialize(viewHolder) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt index 7c694b4fc95b..810ca4960a57 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt @@ -29,6 +29,7 @@ import com.android.systemui.keyguard.ui.view.KeyguardRootView import com.android.systemui.keyguard.ui.view.layout.sections.AccessibilityActionsSection import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection +import com.android.systemui.keyguard.ui.view.layout.sections.AodPromotedNotificationSection import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection @@ -68,6 +69,7 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { @Mock private lateinit var defaultStatusBarViewSection: DefaultStatusBarSection @Mock private lateinit var defaultNSSLSection: DefaultNotificationStackScrollLayoutSection @Mock private lateinit var splitShadeGuidelines: SplitShadeGuidelines + @Mock private lateinit var aodPromotedNotificationSection: AodPromotedNotificationSection @Mock private lateinit var aodNotificationIconsSection: AodNotificationIconsSection @Mock private lateinit var aodBurnInSection: AodBurnInSection @Mock private lateinit var clockSection: ClockSection @@ -90,6 +92,7 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { defaultSettingsPopupMenuSection, defaultStatusBarViewSection, defaultNSSLSection, + aodPromotedNotificationSection, aodNotificationIconsSection, aodBurnInSection, clockSection, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelTest.kt index ade7614ae853..83b821619659 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelTest.kt @@ -80,7 +80,7 @@ class AlternateBouncerToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() fun notifications_areFullyVisible_whenShadeIsOpen() = testScope.runTest { val values by collectValues(underTest.notificationAlpha) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(true) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(true) keyguardTransitionRepository.sendTransitionSteps( listOf( @@ -100,9 +100,9 @@ class AlternateBouncerToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() fun blurRadiusGoesToMaximumWhenShadeIsExpanded() = testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(true) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(true) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0f, 0f, 0.1f, 0.2f, 0.3f, 1f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, @@ -119,9 +119,9 @@ class AlternateBouncerToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() testScope.runTest { val values by collectValues(underTest.notificationBlurRadius) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(true) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(true) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0f, 0f, 0.1f, 0.2f, 0.3f, 1f), startValue = kosmos.blurConfig.maxBlurRadiusPx / 3.0f, endValue = kosmos.blurConfig.maxBlurRadiusPx / 3.0f, @@ -135,9 +135,9 @@ class AlternateBouncerToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() fun blurRadiusGoesFromMinToMaxWhenShadeIsNotExpanded() = testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(false) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(false) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0f, 0f, 0.1f, 0.2f, 0.3f, 1f), startValue = kosmos.blurConfig.minBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToPrimaryBouncerTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToPrimaryBouncerTransitionViewModelTest.kt index d782d1e2612c..01191cca87a1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToPrimaryBouncerTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToPrimaryBouncerTransitionViewModelTest.kt @@ -51,7 +51,7 @@ class AodToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() { testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.0f, 0.3f, 0.4f, 0.5f, 1.0f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModelTest.kt index 4d58f7ab118e..28410d9e3be1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModelTest.kt @@ -81,7 +81,7 @@ class DozingToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() { testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.minBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModelTest.kt index 88fd333b34a8..abf8b39ce5af 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModelTest.kt @@ -45,7 +45,7 @@ class GlanceableHubToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() { testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerWindowBlurTestUtilKosmos.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardWindowBlurTestUtilKosmos.kt index cde853140de2..ef07786284c9 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerWindowBlurTestUtilKosmos.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardWindowBlurTestUtilKosmos.kt @@ -33,9 +33,9 @@ import com.android.systemui.shade.shadeTestUtil import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.TestScope -val Kosmos.bouncerWindowBlurTestUtil by +val Kosmos.keyguardWindowBlurTestUtil by Kosmos.Fixture { - BouncerWindowBlurTestUtil( + KeyguardWindowBlurTestUtil( shadeTestUtil = shadeTestUtil, fakeKeyguardTransitionRepository = fakeKeyguardTransitionRepository, fakeKeyguardRepository = fakeKeyguardRepository, @@ -43,7 +43,7 @@ val Kosmos.bouncerWindowBlurTestUtil by ) } -class BouncerWindowBlurTestUtil( +class KeyguardWindowBlurTestUtil( private val shadeTestUtil: ShadeTestUtil, private val fakeKeyguardTransitionRepository: FakeKeyguardTransitionRepository, private val fakeKeyguardRepository: FakeKeyguardRepository, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelTest.kt index 914094fa39df..fdee8d0544f0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelTest.kt @@ -159,9 +159,9 @@ class LockscreenToPrimaryBouncerTransitionViewModelTest(flags: FlagsParameteriza fun blurRadiusIsMaxWhenShadeIsExpanded() = testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(true) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(true) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, @@ -176,9 +176,9 @@ class LockscreenToPrimaryBouncerTransitionViewModelTest(flags: FlagsParameteriza fun blurRadiusGoesFromMinToMaxWhenShadeIsNotExpanded() = testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(false) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(false) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.minBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, @@ -193,10 +193,10 @@ class LockscreenToPrimaryBouncerTransitionViewModelTest(flags: FlagsParameteriza fun notificationBlur_isNonZero_whenShadeIsExpanded() = testScope.runTest { val values by collectValues(underTest.notificationBlurRadius) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(true) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(true) runCurrent() - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0f, 0f, 0.1f, 0.2f, 0.3f, 1f), startValue = kosmos.blurConfig.maxBlurRadiusPx / 3.0f, endValue = kosmos.blurConfig.maxBlurRadiusPx / 3.0f, @@ -212,10 +212,10 @@ class LockscreenToPrimaryBouncerTransitionViewModelTest(flags: FlagsParameteriza fun notifications_areFullyVisible_whenShadeIsExpanded() = testScope.runTest { val values by collectValues(underTest.notificationAlpha) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(true) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(true) runCurrent() - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0f, 0f, 0.1f, 0.2f, 0.3f, 1f), startValue = 1.0f, endValue = 1.0f, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModelTest.kt index e11e3076c6c3..6db876756d3a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModelTest.kt @@ -45,7 +45,7 @@ class OccludedToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() { testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelTest.kt index 6895794df3dd..aa1e7ae9d509 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelTest.kt @@ -145,7 +145,7 @@ class PrimaryBouncerToAodTransitionViewModelTest : SysuiTestCase() { testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.minBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModelTest.kt index 4013c700673f..766816b1ac26 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModelTest.kt @@ -128,7 +128,7 @@ class PrimaryBouncerToDozingTransitionViewModelTest : SysuiTestCase() { testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.minBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGlanceableHubTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGlanceableHubTransitionViewModelTest.kt index f3f4c89688c9..9cfcce43d13d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGlanceableHubTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGlanceableHubTransitionViewModelTest.kt @@ -45,7 +45,7 @@ class PrimaryBouncerToGlanceableHubTransitionViewModelTest : SysuiTestCase() { testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.minBlurRadiusPx, endValue = kosmos.blurConfig.minBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelTest.kt index bae49fa14999..0db0c5fe8482 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelTest.kt @@ -116,9 +116,9 @@ class PrimaryBouncerToLockscreenTransitionViewModelTest : SysuiTestCase() { fun blurRadiusGoesFromMaxToMinWhenShadeIsNotExpanded() = testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(false) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(false) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.minBlurRadiusPx, @@ -131,9 +131,9 @@ class PrimaryBouncerToLockscreenTransitionViewModelTest : SysuiTestCase() { fun blurRadiusRemainsAtMaxWhenShadeIsExpanded() = testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.shadeExpanded(true) + kosmos.keyguardWindowBlurTestUtil.shadeExpanded(true) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.maxBlurRadiusPx, endValue = kosmos.blurConfig.maxBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModelTest.kt index 8a2fc56e11e6..b0b4af5fea5b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModelTest.kt @@ -45,7 +45,7 @@ class PrimaryBouncerToOccludedTransitionViewModelTest : SysuiTestCase() { testScope.runTest { val values by collectValues(underTest.windowBlurRadius) - kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + kosmos.keyguardWindowBlurTestUtil.assertTransitionToBlurRadius( transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), startValue = kosmos.blurConfig.minBlurRadiusPx, endValue = kosmos.blurConfig.minBlurRadiusPx, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java index 555ba56e087f..7f9313cbeb5b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java @@ -19,6 +19,7 @@ package com.android.systemui.navigationbar.views; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; +import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_ADJUST_NOTHING; import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT; import static android.inputmethodservice.InputMethodService.IME_VISIBLE; import static android.view.Display.DEFAULT_DISPLAY; @@ -30,6 +31,8 @@ import static com.android.systemui.assist.AssistManager.INVOCATION_TYPE_HOME_BUT import static com.android.systemui.navigationbar.views.NavigationBar.NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS; import static com.android.systemui.navigationbar.views.buttons.KeyButtonView.NavBarButtonEvent.NAVBAR_IME_SWITCHER_BUTTON_LONGPRESS; import static com.android.systemui.navigationbar.views.buttons.KeyButtonView.NavBarButtonEvent.NAVBAR_IME_SWITCHER_BUTTON_TAP; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; import static com.google.common.truth.Truth.assertThat; @@ -487,6 +490,65 @@ public class NavigationBarTest extends SysuiTestCase { verify(mUserTracker).addCallback(any(UserTracker.Callback.class), any(Executor.class)); } + /** + * Verifies that the SysUI state is updated correctly when given a new IME window status with + * IME visible and IME Switcher button visible. + */ + @Test + public void testSetImeWindowStatusSysuiState_ImeVisibleImeSwitcherButtonVisible() { + doNothing().when(mNavigationBar).checkNavBarModes(); + + mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_VISIBLE, + BACK_DISPOSITION_DEFAULT, true /* showImeSwitcher */); + verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_IME_SHOWING), eq(true)); + verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_IME_SWITCHER_SHOWING), eq(true)); + } + + /** + * Verifies that the SysUI state is updated correctly when given a new IME window status with + * IME visible and IME Switcher button not visible. + */ + @Test + public void testSetImeWindowStatusSysuiState_ImeVisibleImeSwitcherButtonNotVisible() { + doNothing().when(mNavigationBar).checkNavBarModes(); + + mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_VISIBLE, + BACK_DISPOSITION_DEFAULT, false /* showImeSwitcher */); + verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_IME_SHOWING), eq(true)); + verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_IME_SWITCHER_SHOWING), eq(false)); + } + + /** + * Verifies that the SysUI state is updated correctly when given a new IME window status with + * IME not visible and IME Switcher button visible. + */ + @Test + public void testSetImeWindowStatusSysuiState_ImeNotVisibleImeSwitcherButtonVisible() { + doNothing().when(mNavigationBar).checkNavBarModes(); + // Set initial state for later reset to be able to take place. + mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_VISIBLE, + BACK_DISPOSITION_DEFAULT, true /* showImeSwitcher */); + + mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, 0 /* vis */, + BACK_DISPOSITION_DEFAULT, true /* showImeSwitcher */); + verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_IME_SHOWING), eq(false)); + verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_IME_SWITCHER_SHOWING), eq(false)); + } + + /** + * Verifies that the SysUI state is updated correctly when given a new IME window status with + * IME visible and back disposition adjust nothing. + */ + @Test + public void testSetImeWindowStatusSysuiState_ImeVisibleBackDispositionAdjustNothing() { + doNothing().when(mNavigationBar).checkNavBarModes(); + + mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_VISIBLE, + BACK_DISPOSITION_ADJUST_NOTHING, true /* showImeSwitcher */); + verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_IME_SHOWING), eq(true)); + verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_IME_SWITCHER_SHOWING), eq(true)); + } + @Test public void testSetImeWindowStatusWhenImeSwitchOnDisplay() { // Create default & external NavBar fragment. diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/HeaderPrivacyIconsControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/HeaderPrivacyIconsControllerTest.kt index 3ae7a1672821..3966e1e44de7 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/HeaderPrivacyIconsControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/HeaderPrivacyIconsControllerTest.kt @@ -21,8 +21,10 @@ import com.android.systemui.privacy.PrivacyDialogController import com.android.systemui.privacy.PrivacyDialogControllerV2 import com.android.systemui.privacy.PrivacyItemController import com.android.systemui.privacy.logging.PrivacyLogger +import com.android.systemui.shade.data.repository.shadeDialogContextInteractor import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.policy.DeviceProvisionedController +import com.android.systemui.testKosmos import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor @@ -49,6 +51,7 @@ private fun <T> any(): T = Mockito.any<T>() @RunWith(AndroidJUnit4::class) class HeaderPrivacyIconsControllerTest : SysuiTestCase() { + private val kosmos = testKosmos() @Mock private lateinit var privacyItemController: PrivacyItemController @Mock @@ -113,7 +116,8 @@ class HeaderPrivacyIconsControllerTest : SysuiTestCase() { broadcastDispatcher, safetyCenterManager, deviceProvisionedController, - featureFlags + featureFlags, + kosmos.shadeDialogContextInteractor, ) backgroundExecutor.runAllReady() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt index 3d014b6822b4..a82a7de75cc0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt @@ -34,7 +34,7 @@ import com.android.systemui.scene.data.repository.WindowRootViewVisibilityReposi import com.android.systemui.statusbar.NotificationPresenter import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository import com.android.systemui.statusbar.notification.data.repository.setActiveNotifs -import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor +import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor import com.android.systemui.statusbar.notification.headsup.HeadsUpManager import com.android.systemui.statusbar.notification.init.NotificationsController import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor @@ -70,8 +70,7 @@ class WindowRootViewVisibilityInteractorTest : SysuiTestCase() { private val notificationsController = mock<NotificationsController>() private val powerInteractor = PowerInteractorFactory.create().powerInteractor private val activeNotificationsRepository = kosmos.activeNotificationListRepository - private val activeNotificationsInteractor = - ActiveNotificationsInteractor(activeNotificationsRepository, testDispatcher) + private val activeNotificationsInteractor = kosmos.activeNotificationsInteractor private val underTest = WindowRootViewVisibilityInteractor( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt index d3ba3dceb4cf..0b60c5368195 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt @@ -22,17 +22,24 @@ import android.view.Display import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.common.ui.data.repository.configurationRepository +import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.scene.ui.view.mockShadeRootView import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository +import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository +import com.android.systemui.statusbar.notification.data.repository.setActiveNotifs +import com.android.systemui.statusbar.notification.row.notificationRebindingTracker +import com.android.systemui.statusbar.notification.stack.notificationStackRebindingHider import com.android.systemui.testKosmos -import kotlinx.coroutines.test.advanceUntilIdle +import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.never +import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.kotlin.any import org.mockito.kotlin.eq @@ -42,7 +49,7 @@ import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) @SmallTest class ShadeDisplaysInteractorTest : SysuiTestCase() { - val kosmos = testKosmos().useUnconfinedTestDispatcher() + private val kosmos = testKosmos().useUnconfinedTestDispatcher() private val testScope = kosmos.testScope private val shadeRootview = kosmos.mockShadeRootView @@ -52,6 +59,10 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() { private val latencyTracker = kosmos.mockedShadeDisplayChangeLatencyTracker private val configuration = mock<Configuration>() private val display = mock<Display>() + private val activeNotificationRepository = kosmos.activeNotificationListRepository + private val notificationRebindingTracker = kosmos.notificationRebindingTracker + private val notificationStackRebindingHider = kosmos.notificationStackRebindingHider + private val configurationRepository = kosmos.fakeConfigurationRepository private val underTest by lazy { kosmos.shadeDisplaysInteractor } @@ -68,24 +79,26 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() { } @Test - fun start_shadeInCorrectPosition_notAddedOrRemoved() { - whenever(display.displayId).thenReturn(0) - positionRepository.setDisplayId(0) + fun start_shadeInCorrectPosition_notAddedOrRemoved() = + testScope.runTest { + whenever(display.displayId).thenReturn(0) + positionRepository.setDisplayId(0) - underTest.start() + underTest.start() - verify(shadeContext, never()).reparentToDisplay(any()) - } + verify(shadeContext, never()).reparentToDisplay(any()) + } @Test - fun start_shadeInWrongPosition_changes() { - whenever(display.displayId).thenReturn(0) - positionRepository.setDisplayId(1) + fun start_shadeInWrongPosition_changes() = + testScope.runTest { + whenever(display.displayId).thenReturn(0) + positionRepository.setDisplayId(1) - underTest.start() + underTest.start() - verify(shadeContext).reparentToDisplay(eq(1)) - } + verify(shadeContext).reparentToDisplay(eq(1)) + } @Test fun start_shadeInWrongPosition_logsStartToLatencyTracker() = @@ -94,8 +107,79 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() { positionRepository.setDisplayId(1) underTest.start() - advanceUntilIdle() verify(latencyTracker).onShadeDisplayChanging(eq(1)) } + + @Test + fun start_shadeInWrongPosition_someNotificationsVisible_hiddenThenShown() = + testScope.runTest { + whenever(display.displayId).thenReturn(0) + positionRepository.setDisplayId(1) + activeNotificationRepository.setActiveNotifs(1) + + underTest.start() + + verify(notificationStackRebindingHider).setVisible(eq(false), eq(false)) + configurationRepository.onMovedToDisplay(1) + verify(notificationStackRebindingHider).setVisible(eq(true), eq(true)) + } + + @Test + fun start_shadeInWrongPosition_someNotificationsVisible_waitsForInflationsBeforeShowingNssl() = + testScope.runTest { + whenever(display.displayId).thenReturn(0) + positionRepository.setDisplayId(1) + activeNotificationRepository.setActiveNotifs(1) + + val endRebinding = notificationRebindingTracker.trackRebinding("test") + + assertThat(notificationRebindingTracker.rebindingInProgressCount.value).isEqualTo(1) + + underTest.start() + + verify(notificationStackRebindingHider).setVisible(eq(false), eq(false)) + configurationRepository.onMovedToDisplay(1) + + // Verify that setVisible(true, true) is NOT called yet, as we + // first need to wait for notification bindings to have happened + verify(notificationStackRebindingHider, never()).setVisible(eq(true), eq(true)) + + endRebinding.onFinished() + + // Now verify that setVisible(true, true) is called + verify(notificationStackRebindingHider, times(1)).setVisible(eq(true), eq(true)) + } + + @Test + fun start_shadeInWrongPosition_noNotifications_nsslNotHidden() = + testScope.runTest { + whenever(display.displayId).thenReturn(0) + positionRepository.setDisplayId(1) + activeNotificationRepository.setActiveNotifs(0) + + underTest.start() + + verify(notificationStackRebindingHider, never()).setVisible(eq(false), eq(false)) + verify(notificationStackRebindingHider, never()).setVisible(eq(true), eq(true)) + } + + @Test + fun start_shadeInWrongPosition_waitsUntilMovedToDisplayReceived() = + testScope.runTest { + whenever(display.displayId).thenReturn(0) + positionRepository.setDisplayId(1) + activeNotificationRepository.setActiveNotifs(1) + + underTest.start() + + verify(notificationStackRebindingHider).setVisible(eq(false), eq(false)) + // It's not set to visible yet, as we first need to wait for the view to receive the + // display moved callback. + verify(notificationStackRebindingHider, never()).setVisible(eq(true), eq(true)) + + configurationRepository.onMovedToDisplay(1) + + verify(notificationStackRebindingHider).setVisible(eq(true), eq(true)) + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt index eb8ea8ba15cf..0da1e7f11582 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt @@ -102,12 +102,12 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { @Test @DisableFlags(DualShade.FLAG_NAME) - fun onSystemIconContainerClicked_locked_collapsesShadeToLockscreen() = + fun onSystemIconChipClicked_locked_collapsesShadeToLockscreen() = testScope.runTest { setDeviceEntered(false) setScene(Scenes.Shade) - underTest.onSystemIconContainerClicked() + underTest.onSystemIconChipClicked() runCurrent() assertThat(sceneInteractor.currentScene.value).isEqualTo(Scenes.Lockscreen) @@ -115,16 +115,16 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { @Test @EnableFlags(DualShade.FLAG_NAME) - fun onSystemIconContainerClicked_lockedOnDualShade_collapsesShadeToLockscreen() = + fun onSystemIconChipClicked_lockedOnQsShade_collapsesShadeToLockscreen() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene) val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) setDeviceEntered(false) setScene(Scenes.Lockscreen) - setOverlay(Overlays.NotificationsShade) + setOverlay(Overlays.QuickSettingsShade) assertThat(currentOverlays).isNotEmpty() - underTest.onSystemIconContainerClicked() + underTest.onSystemIconChipClicked() runCurrent() assertThat(currentScene).isEqualTo(Scenes.Lockscreen) @@ -132,13 +132,32 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { } @Test + @EnableFlags(DualShade.FLAG_NAME) + fun onSystemIconChipClicked_lockedOnNotifShade_expandsQsShade() = + testScope.runTest { + val currentScene by collectLastValue(sceneInteractor.currentScene) + val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) + setDeviceEntered(false) + setScene(Scenes.Lockscreen) + setOverlay(Overlays.NotificationsShade) + assertThat(currentOverlays).isNotEmpty() + + underTest.onSystemIconChipClicked() + runCurrent() + + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + assertThat(currentOverlays).contains(Overlays.QuickSettingsShade) + assertThat(currentOverlays).doesNotContain(Overlays.NotificationsShade) + } + + @Test @DisableFlags(DualShade.FLAG_NAME) - fun onSystemIconContainerClicked_unlocked_collapsesShadeToGone() = + fun onSystemIconChipClicked_unlocked_collapsesShadeToGone() = testScope.runTest { setDeviceEntered(true) setScene(Scenes.Shade) - underTest.onSystemIconContainerClicked() + underTest.onSystemIconChipClicked() runCurrent() assertThat(sceneInteractor.currentScene.value).isEqualTo(Scenes.Gone) @@ -146,7 +165,81 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { @Test @EnableFlags(DualShade.FLAG_NAME) - fun onSystemIconContainerClicked_unlockedOnDualShade_collapsesShadeToGone() = + fun onSystemIconChipClicked_unlockedOnQsShade_collapsesShadeToGone() = + testScope.runTest { + val currentScene by collectLastValue(sceneInteractor.currentScene) + val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) + setDeviceEntered(true) + setScene(Scenes.Gone) + setOverlay(Overlays.QuickSettingsShade) + assertThat(currentOverlays).isNotEmpty() + + underTest.onSystemIconChipClicked() + runCurrent() + + assertThat(currentScene).isEqualTo(Scenes.Gone) + assertThat(currentOverlays).isEmpty() + } + + @Test + @EnableFlags(DualShade.FLAG_NAME) + fun onSystemIconChipClicked_unlockedOnNotifShade_expandsQsShade() = + testScope.runTest { + val currentScene by collectLastValue(sceneInteractor.currentScene) + val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) + setDeviceEntered(true) + setScene(Scenes.Gone) + setOverlay(Overlays.NotificationsShade) + assertThat(currentOverlays).isNotEmpty() + + underTest.onSystemIconChipClicked() + runCurrent() + + assertThat(currentScene).isEqualTo(Scenes.Gone) + assertThat(currentOverlays).contains(Overlays.QuickSettingsShade) + assertThat(currentOverlays).doesNotContain(Overlays.NotificationsShade) + } + + @Test + @EnableFlags(DualShade.FLAG_NAME) + fun onNotificationIconChipClicked_lockedOnNotifShade_collapsesShadeToLockscreen() = + testScope.runTest { + val currentScene by collectLastValue(sceneInteractor.currentScene) + val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) + setDeviceEntered(false) + setScene(Scenes.Lockscreen) + setOverlay(Overlays.NotificationsShade) + assertThat(currentOverlays).isNotEmpty() + + underTest.onNotificationIconChipClicked() + runCurrent() + + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + assertThat(currentOverlays).isEmpty() + } + + @Test + @EnableFlags(DualShade.FLAG_NAME) + fun onNotificationIconChipClicked_lockedOnQsShade_expandsNotifShade() = + testScope.runTest { + val currentScene by collectLastValue(sceneInteractor.currentScene) + val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) + setDeviceEntered(false) + setScene(Scenes.Lockscreen) + setOverlay(Overlays.QuickSettingsShade) + assertThat(currentOverlays).isNotEmpty() + + underTest.onNotificationIconChipClicked() + runCurrent() + + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) + assertThat(currentOverlays).contains(Overlays.NotificationsShade) + assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade) + } + + @Test + @EnableFlags(DualShade.FLAG_NAME) + fun onNotificationIconChipClicked_unlockedOnNotifShade_collapsesShadeToGone() = testScope.runTest { val currentScene by collectLastValue(sceneInteractor.currentScene) val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) @@ -155,13 +248,32 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { setOverlay(Overlays.NotificationsShade) assertThat(currentOverlays).isNotEmpty() - underTest.onSystemIconContainerClicked() + underTest.onNotificationIconChipClicked() runCurrent() assertThat(currentScene).isEqualTo(Scenes.Gone) assertThat(currentOverlays).isEmpty() } + @Test + @EnableFlags(DualShade.FLAG_NAME) + fun onNotificationIconChipClicked_unlockedOnQsShade_expandsNotifShade() = + testScope.runTest { + val currentScene by collectLastValue(sceneInteractor.currentScene) + val currentOverlays by collectLastValue(sceneInteractor.currentOverlays) + setDeviceEntered(true) + setScene(Scenes.Gone) + setOverlay(Overlays.QuickSettingsShade) + assertThat(currentOverlays).isNotEmpty() + + underTest.onNotificationIconChipClicked() + runCurrent() + + assertThat(currentScene).isEqualTo(Scenes.Gone) + assertThat(currentOverlays).contains(Overlays.NotificationsShade) + assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade) + } + companion object { private val SUB_1 = SubscriptionModel( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index deaf57999b21..0713a247a4a3 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -225,6 +225,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { Notification notifWithPrivateVisibility = new Notification(); notifWithPrivateVisibility.visibility = VISIBILITY_PRIVATE; + notifWithPrivateVisibility.when = System.currentTimeMillis(); mCurrentUserNotif = new NotificationEntryBuilder() .setNotification(notifWithPrivateVisibility) .setUser(new UserHandle(mCurrentUser.id)) @@ -260,7 +261,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { .setChannel(channel) .setSensitiveContent(true) .setVisibilityOverride(VISIBILITY_NO_OVERRIDE).build()); - mSensitiveNotifPostTime = mSensitiveContentNotif.getSbn().getPostTime(); + mSensitiveNotifPostTime = mSensitiveContentNotif.getSbn().getNotification().getWhen(); when(mNotifCollection.getEntry(mWorkProfileNotif.getKey())).thenReturn(mWorkProfileNotif); when(mKeyguardInteractorLazy.get()).thenReturn(mKeyguardInteractor); when(mKeyguardInteractor.isKeyguardDismissible()) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowControllerTest.kt index 8bca17f72c9f..25ae13fefdd7 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowControllerTest.kt @@ -109,6 +109,7 @@ class ExpandableNotificationRowControllerTest : SysuiTestCase() { private val statusBarService: IStatusBarService = mock() private val uiEventLogger: UiEventLogger = mock() private val msdlPlayer: MSDLPlayer = mock() + private val rebindingTracker: NotificationRebindingTracker = mock() private lateinit var controller: ExpandableNotificationRowController @Before @@ -150,6 +151,7 @@ class ExpandableNotificationRowControllerTest : SysuiTestCase() { statusBarService, uiEventLogger, msdlPlayer, + rebindingTracker, ) whenever(view.childrenContainer).thenReturn(childrenContainer) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTrackerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTrackerTest.kt new file mode 100644 index 000000000000..8bffab617e0a --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTrackerTest.kt @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.row + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.testScope +import com.android.systemui.kosmos.useUnconfinedTestDispatcher +import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository +import com.android.systemui.statusbar.notification.data.repository.setActiveNotifs +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlin.test.Test +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class NotificationRebindingTrackerTest : SysuiTestCase() { + + private val kosmos = testKosmos().useUnconfinedTestDispatcher() + private val testScope = kosmos.testScope + private val activeNotificationRepository = kosmos.activeNotificationListRepository + + private val underTest: NotificationRebindingTracker = kosmos.notificationRebindingTracker + + @Before + fun setup() { + underTest.start() + } + + @Test + fun rebindingInProgressCount_noneStarted_isZero() = + testScope.runTest { + val count by collectLastValue(underTest.rebindingInProgressCount) + + assertThat(count).isEqualTo(0) + } + + @Test + fun rebindingInProgressCount_oneStarted_isOne() = + testScope.runTest { + val count by collectLastValue(underTest.rebindingInProgressCount) + activeNotificationRepository.setActiveNotifs(1) + + underTest.trackRebinding("0") + + assertThat(count).isEqualTo(1) + } + + @Test + fun rebindingInProgressCount_oneStartedThenFinished_goesFromOneToZero() = + testScope.runTest { + val count by collectLastValue(underTest.rebindingInProgressCount) + activeNotificationRepository.setActiveNotifs(1) + + val endRebinding = underTest.trackRebinding("0") + + assertThat(count).isEqualTo(1) + + endRebinding.onFinished() + + assertThat(count).isEqualTo(0) + } + + @Test + fun rebindingInProgressCount_twoStarted_goesToTwo() = + testScope.runTest { + val count by collectLastValue(underTest.rebindingInProgressCount) + activeNotificationRepository.setActiveNotifs(2) + + underTest.trackRebinding("0") + underTest.trackRebinding("1") + + assertThat(count).isEqualTo(2) + } + + @Test + fun rebindingInProgressCount_twoStarted_oneNotActiveAnymore_goesToZero() = + testScope.runTest { + val count by collectLastValue(underTest.rebindingInProgressCount) + activeNotificationRepository.setActiveNotifs(2) + + val finishFirstRebinding = underTest.trackRebinding("0") + underTest.trackRebinding("1") + + assertThat(count).isEqualTo(2) + + activeNotificationRepository.setActiveNotifs(1) + + assertThat(count).isEqualTo(1) + + finishFirstRebinding.onFinished() + + assertThat(count).isEqualTo(0) + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java index b8d18757afbb..c39b252cd795 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java @@ -653,7 +653,8 @@ public class NotificationTestHelper { mock(SmartReplyConstants.class), mock(SmartReplyController.class), mock(IStatusBarService.class), - mock(UiEventLogger.class)); + mock(UiEventLogger.class), + mock(NotificationRebindingTracker.class)); row.setAboveShelfChangedListener(aboveShelf -> { }); mBindStage.getStageParams(entry).requireContentViews(extraInflationFlags); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt new file mode 100644 index 000000000000..d0cc56860ce8 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.panel.component.mediaoutput.domain + +import android.content.mockedContext +import android.content.packageManager +import android.content.pm.PackageManager.FEATURE_PC +import android.testing.TestableLooper +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.kosmos.collectLastValue +import com.android.systemui.kosmos.runTest +import com.android.systemui.kosmos.testScope +import com.android.systemui.testKosmos +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidJUnit4::class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +class MediaOutputAvailabilityCriteriaTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val scope = kosmos.testScope + + private lateinit var underTest: MediaOutputAvailabilityCriteria + + @Before + fun setup() { + with(kosmos) { + underTest = MediaOutputAvailabilityCriteria(kosmos.mockedContext, scope.backgroundScope) + } + } + + @Test + fun isDesktop_unavailable() = + kosmos.runTest { + whenever(mockedContext.getPackageManager()).thenReturn(packageManager) + whenever(packageManager.hasSystemFeature(FEATURE_PC)).thenReturn(true) + + val isAvailable by collectLastValue(underTest.isAvailable()) + + assertThat(isAvailable).isFalse() + } + + @Test + fun notIsDesktop_available() = + kosmos.runTest { + whenever(mockedContext.getPackageManager()).thenReturn(packageManager) + whenever(packageManager.hasSystemFeature(FEATURE_PC)).thenReturn(false) + + val isAvailable by collectLastValue(underTest.isAvailable()) + + assertThat(isAvailable).isTrue() + } +} diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockFaceLayout.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockFaceLayout.kt index a075d0d5b249..37b611f3c6b9 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockFaceLayout.kt +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockFaceLayout.kt @@ -111,28 +111,37 @@ class DefaultClockFaceLayout(val view: View) : ClockFaceLayout { connect(lockscreenClockViewLargeId, START, PARENT_ID, START) connect(lockscreenClockViewLargeId, END, PARENT_ID, END) - // In preview, we'll show UDFPS icon for UDFPS devices - // and nothing for non-UDFPS devices, - // and we're not planning to add this vide in clockHostView - // so we only need position of device entry icon to constrain clock - // Copied calculation codes from applyConstraints in DefaultDeviceEntrySection - clockPreviewConfig.lockId?.let { lockId -> - connect(lockscreenClockViewLargeId, BOTTOM, lockId, TOP) + clockPreviewConfig.udfpsTop?.let { + val screenHeight = context.resources.displayMetrics.heightPixels + connect( + lockscreenClockViewLargeId, + BOTTOM, + PARENT_ID, + BOTTOM, + (screenHeight - it).toInt(), + ) } ?: run { - val bottomPaddingPx = context.getDimen("lock_icon_margin_bottom") - val defaultDensity = - DisplayMetrics.DENSITY_DEVICE_STABLE.toFloat() / - DisplayMetrics.DENSITY_DEFAULT.toFloat() - val lockIconRadiusPx = (defaultDensity * 36).toInt() - val clockBottomMargin = bottomPaddingPx + 2 * lockIconRadiusPx - connect( - lockscreenClockViewLargeId, - BOTTOM, - PARENT_ID, - BOTTOM, - clockBottomMargin, - ) + // Copied calculation codes from applyConstraints in + // DefaultDeviceEntrySection + clockPreviewConfig.lockId?.let { lockId -> + connect(lockscreenClockViewLargeId, BOTTOM, lockId, TOP) + } + ?: run { + val bottomPaddingPx = context.getDimen("lock_icon_margin_bottom") + val defaultDensity = + DisplayMetrics.DENSITY_DEVICE_STABLE.toFloat() / + DisplayMetrics.DENSITY_DEFAULT.toFloat() + val lockIconRadiusPx = (defaultDensity * 36).toInt() + val clockBottomMargin = bottomPaddingPx + 2 * lockIconRadiusPx + connect( + lockscreenClockViewLargeId, + BOTTOM, + PARENT_ID, + BOTTOM, + clockBottomMargin, + ) + } } val smallClockViewId = context.getId("lockscreen_clock_view") diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockPreviewConfig.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockPreviewConfig.kt index c705c51a00d5..abc8e150bfd2 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockPreviewConfig.kt +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockPreviewConfig.kt @@ -25,6 +25,7 @@ data class ClockPreviewConfig( val isShadeLayoutWide: Boolean, val isSceneContainerFlagEnabled: Boolean = false, val lockId: Int? = null, + val udfpsTop: Float? = null, ) { fun getSmallClockTopPadding( statusBarHeight: Int = SystemBarUtils.getStatusBarHeight(context) diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml index b256518e99ac..433c0a71008d 100644 --- a/packages/SystemUI/res-keyguard/values/styles.xml +++ b/packages/SystemUI/res-keyguard/values/styles.xml @@ -128,7 +128,7 @@ <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> - <item name="android:colorBackground">@*android:color/background_material_dark</item> + <item name="android:colorBackground">@android:color/transparent</item> </style> <style name="TextAppearance.Keyguard"> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 5e7d9c4a041b..1c2226925191 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelliet, goeie toestand"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelliet, verbinding is beskikbaar"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satelliet-SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Net noodoproepe of SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"geen sein nie"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"een staaf"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Terug"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Kennisgewings"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Kortpadsleutels"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Wissel sleutelborduitleg"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"of"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Maak soeknavraag skoon"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Kortpadsleutels"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Pasmaak kortpaaie"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Verwyder kortpad?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Stel terug na verstek?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Druk sleutel om kortpad toe te wys"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Dit sal jou gepasmaakte kortpad permanent uitvee."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Dit sal al jou gepasmaakte kortpaaie permanent uitvee."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Soekkortpaaie"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, stel terug"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Kanselleer"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Druk sleutel"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Sleutelkombinasie is reeds in gebruik. Probeer ’n ander sleutel."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Kortpad kan nie gestel word nie."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Voeg kortpad by"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Gaan terug"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Gaan na tuisskerm"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Bekyk onlangse apps"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klaar"</string> <string name="gesture_error_title" msgid="469064941635578511">"Probeer weer!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gaan terug"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Knap gedaan!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Jy het die Bekyk Onlangse Apps-gebaar voltooi."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Swiep op en hou met drie vingers op jou raakpaneel om onlangse apps te bekyk"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Bekyk alle apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Druk die handelingsleutel op jou sleutelbord"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Welgedaan!"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index d969525b7c4a..991f60a3a445 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ሳተላይት፣ ጥሩ ግንኙነት"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ሳተላይት፣ ግንኙነት አለ"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"ሳተላይት ኤስኦኤስ"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"የአደጋ ጥሪዎች ወይም ኤስኦኤስ ብቻ"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>፣ <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>።"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ምንም ምልክት የለም"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"አንድ አሞሌ"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"ተመለስ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ማሳወቂያዎች"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"የቁልፍ ሰሌዳ አቋራጮች"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"የቁልፍ ሰሌዳ ገጽታ ለውጥ"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ወይም"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"የፍለጋ መጠይቅን አጽዳ"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"የቁልፍ ሰሌዳ አቋራጮች"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"አቋራጮችን ያብጁ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"አቋራጭ ይወገድ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ወደ ነባሪ ዳግም ይጀመር?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"አቋራጭ ለመመደብ ቁልፍ ይጫኑ"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ይህ ብጁ አቋራጭዎን በቋሚነት ይሰርዛል።"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ይህ ሁሉንም ብጁ አቋራጮችዎን በቋሚነት ይሰርዛል።"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"የፍለጋ አቋራጮች"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"አዎ፣ ዳግም አስጀምር"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ይቅር"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ቁልፍ ይጫኑ"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"የቁልፍ ጥምረት አስቀድሞ በሥራ ላይ ነው። ሌላ ቁልፍ ይሞክሩ።"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"አቋራጩ ሊቀናበር አይችልም።"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"አቋራጭ አክል"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ወደኋላ ተመለስ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ወደ መነሻ ሂድ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ተከናውኗል"</string> <string name="gesture_error_title" msgid="469064941635578511">"እንደገና ይሞክሩ!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ወደኋላ ተመለስ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ጥሩ ሠርተዋል!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"የቅርብ ጊዜ መተግበሪያዎች አሳይ ምልክትን አጠናቅቀዋል።"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"የቅርብ ጊዜ መተግበሪያዎችን ለማየት የመዳሰሻ ሰሌዳዎ ላይ ሦስት ጣቶችን በመጠቀም ወደላይ ያንሸራትቱ እና ይያዙ"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"ሁሉንም መተግበሪያዎች ይመልከቱ"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"በቁልፍ ሰሌዳዎ ላይ ያለውን የተግባር ቁልፍ ይጫኑ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ጥሩ ሠርተዋል!"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index d46df1d8b348..2917cfcee872 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"قمر صناعي، الاتصال جيد"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"قمر صناعي، الاتصال متوفّر"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"اتصالات الطوارئ بالقمر الصناعي"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"مكالمات الطوارئ أو اتصالات الطوارئ فقط"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"\"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>\"، <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ما مِن أشرطة إشارة"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"شريط إشارة واحد"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"رجوع"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"الإشعارات"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"اختصارات لوحة المفاتيح"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"تبديل تنسيق لوحة المفاتيح"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"أو"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"محو طلب البحث"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"اختصارات لوحة المفاتيح"</string> @@ -1437,11 +1435,11 @@ <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"التطبيق الحالي"</string> <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"تسهيل الاستخدام"</string> <string name="shortcut_helper_title" msgid="8567500639300970049">"اختصارات لوحة المفاتيح"</string> - <!-- no translation found for shortcut_helper_customize_mode_title (8327297960035006036) --> - <skip /> + <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"تخصيص الاختصارات"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"هل تريد إزالة هذا الاختصار؟"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"يُرجى تأكيد إعادة الضبط على الإعدادات التلقائية"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"اضغط على مفتاح لتخصيص الاختصار"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"سيؤدي هذا الإجراء إلى حذف الاختصار المخصّص نهائيًا."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"سيؤدي هذا الإجراء إلى حذف جميع الاختصارات المخصّصة نهائيًا."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"البحث في الاختصارات"</string> @@ -1463,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"نعم، أريد إعادة الضبط"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"إلغاء"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"اضغط على مفتاح"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"يتم حاليًا استخدام مجموعة المفاتيح هذه. يُرجى تجربة مفتاح آخر."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"تعذَّر ضبط الاختصار."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"إضافة اختصار"</string> @@ -1477,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"رجوع"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"الانتقال إلى الصفحة الرئيسية"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"عرض التطبيقات المستخدَمة مؤخرًا"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"تم"</string> <string name="gesture_error_title" msgid="469064941635578511">"يُرجى إعادة المحاولة"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"رجوع"</string> @@ -1494,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"أحسنت."</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"لقد أكملْت التدريب على إيماءة عرض التطبيقات المستخدَمة مؤخرًا."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"لعرض التطبيقات المستخدَمة مؤخرًا، يُرجى التمرير سريعًا للأعلى مع الاستمرار باستخدام ثلاثة أصابع على لوحة اللمس"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"عرض جميع التطبيقات"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"اضغط على مفتاح الإجراء في لوحة المفاتيح"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"أحسنت!"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index ff5e2106a8d2..ec05cb4f37eb 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"উপগ্ৰহ, ভাল সংযোগ"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"উপগ্ৰহ, সংযোগ উপলব্ধ"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"উপগ্ৰহ SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"কেৱল জৰুৰীকালীন কল বা SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"কোনো ছিগনেল নাই"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"এডাল দণ্ড"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"উভতি যাওক"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"জাননীসমূহ"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"কীব\'ৰ্ড শ্বৰ্টকাটসমূহ"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"কীব\'ৰ্ডৰ সজ্জা সলনি কৰক"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"অথবা"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"সন্ধান কৰা প্ৰশ্ন মচক"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"কীব’ৰ্ডৰ শ্বৰ্টকাট"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"শ্বৰ্টকাট কাষ্টমাইজ কৰক"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"শ্বৰ্টকাট আঁতৰাবনে?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ডিফ\'ল্ট হিচাপে পুনৰ ৰিছেট কৰিবনে?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"শ্বৰ্টকাটৰ ভূমিকা অৰ্পণ কৰিবলৈ কী টিপক"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"এই শ্বৰ্টকাটটো সৃষ্টি কৰিবলৈ, কাৰ্য কী আৰু এক বা একাধিক কী একেলগে টিপক"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"এইটোৱে আপোনাৰ কাষ্টম শ্বৰ্টকাট মচিব।"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"এইটোৱে আপোনাৰ আটাইবোৰ কাষ্টম শ্বৰ্টকাট স্থায়ীভাৱে মচিব।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"সন্ধানৰ শ্বৰ্টকাট"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"হয়, ৰিছেট কৰক"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"বাতিল কৰক"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"কী টিপক"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"কীৰ মিশ্ৰণ ইতিমধ্যে ব্যৱহাৰ হৈ আছে। অন্য এটা কী ব্যৱহাৰ কৰি চাওক।"</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"কীৰ মিশ্ৰণ ইতিমধ্যে ব্যৱহাৰ হৈ আছে। অন্য এটা মিশ্ৰণ ব্যৱহাৰ কৰি চাওক।"</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"শ্বৰ্টকাট ছেট কৰিব নোৱাৰি।"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"শ্বৰ্টকাট যোগ দিয়ক"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"উভতি যাওক"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"গৃহ পৃষ্ঠালৈ যাওক"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"শেহতীয়া এপ্সমূহ চাওক"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"হ’ল"</string> <string name="gesture_error_title" msgid="469064941635578511">"পুনৰ চেষ্টা কৰক!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"উভতি যাওক"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"বঢ়িয়া!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"আপুনি শেহতীয়া এপ্ চোৱাৰ নিৰ্দেশনাটো সম্পূৰ্ণ কৰিছে।"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"শেহতীয়া এপ্সমূহ চাবলৈ, আপোনাৰ টাচ্চপেডত তিনিটা আঙুলি ব্যৱহাৰ কৰি ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"আটাইবোৰ এপ্ চাওক"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"আপোনাৰ কীব’ৰ্ডৰ কাৰ্য কীটোত টিপক"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"বঢ়িয়া!"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index dbeacf0bf277..a76a9cc0e281 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Peyk, bağlantı yaxşıdır"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Peyk, bağlantı var"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Təcili peyk bağlantısı"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Təcili zəng və ya sadəcə SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"siqnal yoxdur"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"bir zolaq"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Geri"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirişlər"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klaviatura qısa yolları"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatura düzümünü dəyişin"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"və ya"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Axtarış sorğusunu silin"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Klaviatura qısayolları"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Qısayolları fərdiləşdirin"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Qısayol silinsin?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Defolt vəziyyətə qaytarılsın?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Qısayol təyin etmək üçün düyməni basın"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Bu, fərdi qısayolunuzu həmişəlik siləcək."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Bu, bütün fərdi qısayollarınızı həmişəlik siləcək."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Axtarış qısayolları"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Bəli, sıfırlayın"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Ləğv edin"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Düyməni basın"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Düymə kombinasiyası artıq istifadə olunur. Başqa düyməni sınayın."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Qısayol ayarlana bilməz."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Qısayol əlavə edin"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Geri qayıdın"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Əsas səhifəyə keçin"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Son tətbiqlərə baxın"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hazırdır"</string> <string name="gesture_error_title" msgid="469064941635578511">"Yenidən cəhd edin!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Geri qayıdın"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Əla!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Son tətbiqlərə baxmaq jestini tamamladınız."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Ən son tətbiqlərə baxmaq üçün taçpeddə üç barmağınızla yuxarı çəkin və saxlayın"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Bütün tətbiqlərə baxın"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Klaviaturada fəaliyyət açarına basın"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Əla!"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index ca01a3d89ebe..2dfb37bdf79f 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, veza je dobra"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, veza je dostupna"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Hitna pomoć preko satelita"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Samo hitni pozivi ili hitna pomoć"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"nema signala"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"jedna crta"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Nazad"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obaveštenja"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tasterske prečice"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Promeni raspored tastature"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ili"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Obriši upit za pretragu"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Tasterske prečice"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Prilagodite prečice"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Želite da uklonite prečicu?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Želite da resetujete na podrazumevano?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pritisnite taster da biste dodelili prečicu"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Da biste napravili ovu prečicu, pritisnite zajedno taster radnji i jedan ili više drugih tastera"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ovim ćete trajno izbrisati prilagođenu prečicu."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Time ćete trajno izbrisati sve prilagođene prečice."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pretražite prečice"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Da, resetuj"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Otkaži"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pritisnite taster"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinacija tastera se već koristi. Probajte sa drugim tasterom."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Kombinacija tastera se već koristi. Probajte sa drugom kombinacijom."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Podešavanje prečice nije uspelo."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Dodajte prečicu"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Nazad"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Idi na početni ekran"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Prikaži nedavno korišćene aplikacije"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string> <string name="gesture_error_title" msgid="469064941635578511">"Probajte ponovo."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazad"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Odlično!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Dovršili ste pokret za prikazivanje nedavno korišćenih aplikacija."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Da biste pregledali nedavne aplikacije, prevucite nagore i zadržite sa tri prsta na tačpedu"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Prikaži sve aplikacije"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite taster radnji na tastaturi"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Odlično!"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 40d78c20859b..33b22c397d8d 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Спадарожнікавая сувязь, добрае падключэнне"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Спадарожнікавая сувязь, падключэнне даступнае"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Экстраннае спадарожнікавае падключэнне"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Экстранныя выклікі або толькі экстраннае спадарожнікавае падключэнне"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"няма сігналу"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"адзiн слупок"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Назад"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Апавяшчэнні"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Спалучэнні клавіш"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Пераключыць раскладку клавіятуры"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"або"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Ачысціць пошукавы запыт"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Спалучэнні клавіш"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Наладзіць спалучэнні клавіш"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Выдаліць спалучэнне клавіш?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Скінуць налады да стандартных?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Націсніце клавішу, каб прызначыць спалучэнне клавіш"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Гэта дзеянне назаўсёды выдаліць прызначанае вамі спалучэнне клавіш."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Усе карыстальніцкія спалучэнні клавіш будуць назаўсёды выдалены."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Пошук спалучэнняў клавіш"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Так, скінуць"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Скасаваць"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Націсніце клавішу"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Гэта спалучэнне клавіш ужо выкарыстоўваецца. Паспрабуйце іншую клавішу."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Не ўдаецца наладзіць спалучэнне клавіш."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Дадаць ярлык"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Назад"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"На галоўную старонку"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прагляд нядаўніх праграм"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Гатова"</string> <string name="gesture_error_title" msgid="469064941635578511">"Паспрабуйце яшчэ раз!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Выдатная праца!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Вы скончылі вывучэнне жэсту для прагляду нядаўніх праграм."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Каб праглядзець нядаўнія праграмы, правядзіце трыма пальцамі ўверх па сэнсарным экране і затрымайце пальцы"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Глядзець усе праграмы"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Націсніце клавішу дзеяння на клавіятуры"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Выдатна!"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 95037ab4d29e..7733002996b1 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Сателит, добра връзка"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Сателит, налице е връзка"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS чрез сателит"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Само спешни обаждания или SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"няма сигнал"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"една чертичка"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Назад"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Известия"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Клавишни комбинации"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Превкл. на клавиат. подредба"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"или"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Изчистване на заявката за търсене"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Клавишни комбинации"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Персонализиране на преките пътища"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Да се премахне ли клавишната комбинация?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Да се възстановят ли стандартните настройки?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Натиснете клавиш, за да зададете клавишна комбинация"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Това ще изтрие персонализираната клавишна комбинация за постоянно."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Това ще изтрие всичките ви персонализирани преки пътища за постоянно."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Търсете клавишни комбинации"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Да, нулиране"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Отказ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Натиснете клавиш"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Клавишната комбинация вече се използва. Опитайте с друг клавиш."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Прекият път не може да се зададе."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Добавяне на пряк път"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Назад"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Към началния екран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Преглед на скорошните приложения"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> <string name="gesture_error_title" msgid="469064941635578511">"Опитайте отново!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Отлично!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Изпълнихте жеста за преглед на скорошните приложения."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"За да прегледате скорошните приложения, плъзнете три пръста нагоре по сензорния панел и задръжте"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Преглед на всички приложения"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Натиснете клавиша за действия на клавиатурата си"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Браво!"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 73eddf28bbed..d1f81e2df0cf 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"স্যাটেলাইট, ভালো কানেকশন"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"স্যাটেলাইট, কানেকশন উপলভ্য আছে"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"স্যাটেলাইট SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"শুধুমাত্র জরুরি কল বা SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>।"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"কোনও সিগন্যাল নেই"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"একটি বার"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"পিছনে"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"বিজ্ঞপ্তি"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"কীবোর্ড শর্টকাট"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"কীবোর্ড লে-আউট পাল্টান"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"অথবা"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"সার্চ কোয়েরি মুছুন"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"কীবোর্ড শর্টকাট"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"শর্টকাট কাস্টমাইজ করুন"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"শর্টকাট সরাবেন?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ডিফল্ট শর্টকার্ট আবার রিসেট করতে চান?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"শর্টকাট অ্যাসাইন করতে কী প্রেস করুন"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"এটি আপনার কাস্টম শর্টকাট স্থায়ীভাবে মুছে ফেলবে।"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"এটি আপনার সব কাস্টম শর্টকার্ট স্থায়ীভাবে মুছে দেবে।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"শর্টকাট সার্চ করুন"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"হ্যাঁ, রিসেট করতে চাই"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"বাতিল করুন"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"কী প্রেস করুন"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"কী কম্বিনেশন আগে থেকে ব্যবহার হচ্ছে। অন্য কী ব্যবহার করে দেখুন।"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"শর্টকাট সেট করা যায়নি।"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"শর্টকাট যোগ করুন"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ফিরে যান"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"হোমে যান"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপ দেখুন"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"হয়ে গেছে"</string> <string name="gesture_error_title" msgid="469064941635578511">"আবার চেষ্টা করুন!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ফিরে যান"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"অসাধারণ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপের জেসচার দেখা সম্পূর্ণ করেছেন।"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"সাম্প্রতিক অ্যাপ দেখতে, নিজের টাচপ্যাডে তিনটি আঙুল ব্যবহার করে উপরের দিকে সোয়াইপ করে হোল্ড করুন"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"সব অ্যাপ দেখুন"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"আপনার কীবোর্ডে অ্যাকশন কী প্রেস করুন"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"দারুণ!"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index c16627f86820..9d128b4b1562 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, dobra veza"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, veza je dostupna"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Hitna pomoć putem satelita"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Samo hitni pozivi ili pomoć"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"nema signala"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"jedna crtica"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Nazad"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obavještenja"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Prečice tastature"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Zamijeni raspored tastature"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ili"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Brisanje upita za pretraživanje"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Prečice na tastaturi"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Prilagodite prečice"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Ukloniti prečicu?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vratiti na zadano?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pritisnite tipku da dodijelite prečicu"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Da biste izradili taj prečac, pritisnite tipku za radnju i jednu ili više drugih tipki zajedno"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ovo će trajno izbrisati prilagođenu prečicu."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Ovo će trajno izbrisati sve vaše prilagođene prečice."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pretražite prečice"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Da, vrati na zadano"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Otkaži"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pritisnite tipku"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ta se kombinacija tipki već koristi. Pokušajte s drugom tipkom."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Ta se kombinacija već koristi. Pokušajte s nekom drugom kombinacijom."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Prečica se ne može postaviti."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Dodavanje prečice"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Nazad"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Odlazak na početni ekran"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Prikaži nedavne aplikacije"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string> <string name="gesture_error_title" msgid="469064941635578511">"Pokušajte ponovo!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazad"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Sjajno!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Izvršili ste pokret za prikaz nedavnih aplikacija."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Da pogledate nedavne aplikacije, prevucite nagore i zadržite s tri prsta na dodirnoj podlozi"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Pogledajte sve aplikacije"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite tipku radnji na tastaturi"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Odlično!"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 43ba8fac3dad..b16df77784e6 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satèl·lit, bona connexió"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satèl·lit, connexió disponible"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS per satèl·lit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Només SOS o trucades d\'emergència"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"no hi ha senyal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"una barra"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Enrere"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificacions"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tecles de drecera"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Canvia disposició de teclat"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"o"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Esborra la consulta de cerca"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Tecles de drecera"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalitza les dreceres"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Vols suprimir la drecera?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vols restablir els valors predeterminats?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Prem la tecla per assignar la drecera"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Aquesta acció suprimirà la drecera personalitzada permanentment."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Aquesta acció suprimirà totes les dreceres personalitzades permanentment."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Dreceres de cerca"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sí, restableix"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel·la"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Prem una tecla"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"La combinació de tecles ja s\'està utilitzant. Prova-ho amb una altra tecla."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"No es pot configurar la drecera."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Afegeix una drecera"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Torna"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ves a la pantalla d\'inici"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Mostra les aplicacions recents"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fet"</string> <string name="gesture_error_title" msgid="469064941635578511">"Torna-ho a provar"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Torna"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Ben fet!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Has completat el gest per veure les aplicacions recents."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Per veure les aplicacions recents, llisca cap amunt amb tres dits i mantén-los premuts al ratolí tàctil"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Mostra totes les aplicacions"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Prem la tecla d\'acció al teclat"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Enhorabona!"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 17945a3856d6..7e1ccdb816c7 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, dobré připojení"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, připojení je k dispozici"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS přes satelit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Pouze tísňové hovory nebo SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"není signál"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"jedna čárka"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Zpět"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Oznámení"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klávesové zkratky"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Přepnout rozložení klávesnice"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"nebo"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Vymazat vyhledávaný dotaz"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Klávesové zkratky"</string> @@ -1437,11 +1435,11 @@ <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"Aktuální aplikace"</string> <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"Přístupnost"</string> <string name="shortcut_helper_title" msgid="8567500639300970049">"Klávesové zkratky"</string> - <!-- no translation found for shortcut_helper_customize_mode_title (8327297960035006036) --> - <skip /> + <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Přizpůsobení zkratek"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Odstranit zkratku?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Resetovat do výchozího nastavení?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Nastavte zkratku stisknutím klávesy"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Vlastní zkratka se trvale smaže."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Tím trvale odstraníte všechny své vlastní zkratky."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Vyhledat zkratky"</string> @@ -1463,13 +1461,12 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ano, resetovat"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Zrušit"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Stiskněte klávesu"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinace kláves se už používá. Použijte jinou klávesu."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Zkratku není možné nastavit."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> - <!-- no translation found for shortcut_helper_add_shortcut_button_label (7655779534665954910) --> - <skip /> - <!-- no translation found for shortcut_helper_delete_shortcut_button_label (3148773472696137052) --> - <skip /> + <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Přidat zkratku"</string> + <string name="shortcut_helper_delete_shortcut_button_label" msgid="3148773472696137052">"Smazat zkratku"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigujte pomocí klávesnice"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Naučte se klávesové zkratky"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigujte pomocí touchpadu"</string> @@ -1479,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Zpět"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Přejít na domovskou stránku"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Zobrazit nedávné aplikace"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hotovo"</string> <string name="gesture_error_title" msgid="469064941635578511">"Zkuste to znovu."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Zpět"</string> @@ -1496,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Výborně!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Provedli jste gesto pro zobrazení nedávných aplikací."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Pokud chcete zobrazit poslední aplikace, přejeďte na touchpadu třemi prsty nahoru a podržte je"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Zobrazit všechny aplikace"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Stiskněte akční klávesu na klávesnici"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Výborně!"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 1f8c8659b9cf..4a3ba0e9342a 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellit – god forbindelse"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellit – forbindelsen er tilgængelig"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS-meldinger via satellit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Kun nødopkald eller SOS-meldinger via satellit"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"intet signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"én bjælke"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Tilbage"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifikationer"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tastaturgenveje"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Skift tastaturlayout"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"eller"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Ryd søgeforespørgsel"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Tastaturgenveje"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Tilpas genveje"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Skal genvejen fjernes?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vil du nulstille til standard?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Tryk på en tast for at tildele genvej"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Denne handling sletter din tilpassede genvej permanent."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Denne handling sletter alle dine tilpassede genveje permanent."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Søg efter genveje"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, nulstil"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Annuller"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tryk på en tast"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tastekombinationen er allerede i brug. Prøv en anden tast."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Genvejen kan ikke konfigureres."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Tilføj genvej"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Gå tilbage"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Gå til startsiden"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se seneste apps"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Udfør"</string> <string name="gesture_error_title" msgid="469064941635578511">"Prøv igen!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gå tilbage"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Godt klaret!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du har udført bevægelsen for at se de seneste apps."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Du kan se nyligt brugte apps ved at stryge opad og holde tre fingre nede på touchpladen"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Se alle apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tryk på handlingstasten på dit tastatur"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Flot klaret!"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 213955839a71..32bb148073fa 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellit, Verbindung gut"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellit, Verbindung verfügbar"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Notruf über Satellit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Nur Notrufe oder SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"kein Empfang"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ein Balken"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Zurück"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Benachrichtigungen"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tastenkürzel"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Tastaturlayout wechseln"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"oder"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Suchanfrage löschen"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Tastenkombinationen"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Tastenkombinationen anpassen"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Tastaturkürzel entfernen?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Auf Standardeinstellung zurücksetzen?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Drücke eine Taste, um das Tastaturkürzel einzurichten"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Das benutzerdefinierte Tastenkürzel wird endgültig gelöscht."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Alle deine benutzerdefinierten Tastenkürzel werden endgültig gelöscht."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Tastenkürzel suchen"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, zurücksetzen"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Abbrechen"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Taste drücken"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Diese Tastenkombination wird bereits verwendet. Versuche es mit einer anderen Taste."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Die Tastenkombination kann nicht festgelegt werden."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Verknüpfung hinzufügen"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Zurück"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Zum Startbildschirm"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Letzte Apps aufrufen"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fertig"</string> <string name="gesture_error_title" msgid="469064941635578511">"Noch einmal versuchen"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Zurück"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Gut gemacht!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du hast das Tutorial für die Touch-Geste zum Aufrufen der zuletzt verwendeten Apps abgeschlossen."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Wenn du zuletzt verwendete Apps aufrufen möchtest, wische mit drei Fingern nach oben und halte das Touchpad gedrückt"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Alle Apps anzeigen"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Drücke die Aktionstaste auf deiner Tastatur"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Perfekt!"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 589298ea616b..b26d8623ad2b 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Δορυφορική, καλή σύνδεση"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Δορυφορική, διαθέσιμη σύνδεση"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Δορυφορικό SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Μόνο κλήσεις έκτακτης ανάγκης ή SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"δεν υπάρχει σήμα"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"μία γραμμή"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Πίσω"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ειδοποιήσεις"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Συντομεύσεις πληκτρολογίου"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Αλλαγή διάταξης πληκτρολογίου"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ή"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Διαγραφή ερωτήματος αναζήτησης"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Συντομεύσ. πληκτρολογίου"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Προσαρμογή συντομεύσεων"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Κατάργηση συντόμευσης;"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Επαναφορά στις προεπιλογές;"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Πατήστε το πλήκτρο για ανάθεση της συντόμευσης"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Με αυτή την ενέργεια, η προσαρμοσμένη συντόμευση θα διαγραφεί οριστικά."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Με αυτή την ενέργεια θα διαγραφούν οριστικά όλες οι προσαρμοσμένες συντομεύσεις."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Συντομεύσεις αναζήτησης"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ναι, επαναφορά"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Ακύρωση"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Πατήστε ένα πλήκτρο"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ο συνδυασμός πλήκτρων χρησιμοποιείται ήδη. Δοκιμάστε άλλο πλήκτρο."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Δεν είναι δυνατή η ρύθμιση της συντόμευσης."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Προσθήκη συντόμευσης"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Επιστροφή"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Αρχική"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Προβολή πρόσφατων εφαρμογών"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Τέλος"</string> <string name="gesture_error_title" msgid="469064941635578511">"Δοκιμάστε ξανά!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Επιστροφή"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Μπράβο!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ολοκληρώσατε την κίνηση για την προβολή πρόσφατων εφαρμογών."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Για προβολή πρόσφατων εφαρμογών, σύρετε προς τα επάνω με τρία δάχτυλα και κρατήστε τα δάχτυλά σας στην επιφάνεια αφής"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Προβολή όλων των εφαρμογών"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Πατήστε το πλήκτρο ενέργειας στο πληκτρολόγιό σας"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Μπράβο!"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index f31e51f7f3da..ad4e510d20d4 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellite, good connection"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellite, connection available"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Emergency calls or SOS only"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"No signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"one bar"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Back"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"or"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Clear search query"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Keyboard shortcuts"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Customise shortcuts"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remove shortcut?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset back to default?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Press key to assign shortcut"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"This will delete your custom shortcut permanently."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"This will delete all your custom shortcuts permanently."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Search shortcuts"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yes, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Press key"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Key combination already in use. Try another key."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Shortcut cannot be set."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Add shortcut"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Go back"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Go home"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string> <string name="gesture_error_title" msgid="469064941635578511">"Try again."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"To view recent apps, swipe up and hold using three fingers on your touchpad"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"View all apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Press the action key on your keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Well done!"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index be09504a5cd6..7c5328cd5951 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellite, good connection"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellite, connection available"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Emergency calls or SOS only"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"no signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"one bar"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Back"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard Shortcuts"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"or"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Clear search query"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Keyboard Shortcuts"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Customize shortcuts"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remove shortcut?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset back to default?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Press key to assign shortcut"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"To create this shortcut, press the Action key and one or more other keys together"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"This will delete your custom shortcut permanently."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"This will delete all your custom shortcuts permanently."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Search shortcuts"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yes, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Press key"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Key combination already in use. Try another key."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Key combination already in use. Try another combination."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Shortcut cannot be set."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Add shortcut"</string> @@ -1476,6 +1474,7 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Go back"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Go home"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string> + <string name="touchpad_tutorial_switch_apps_gesture_button" msgid="7768255095423767779">"Switch apps"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string> <string name="gesture_error_title" msgid="469064941635578511">"Try again!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string> @@ -1493,6 +1492,11 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Great job!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"To view recent apps, swipe up and hold using three fingers on your touchpad"</string> + <string name="touchpad_switch_apps_gesture_action_title" msgid="6835222344612924512">"Switch apps"</string> + <string name="touchpad_switch_apps_gesture_guidance" msgid="6859830005390732562">"Swipe left or right using four fingers on your touchpad"</string> + <string name="touchpad_switch_apps_gesture_success_title" msgid="4894947244328032458">"Great job!"</string> + <string name="touchpad_switch_apps_gesture_success_body" msgid="8151089866035126312">"You completed the switch apps gesture."</string> + <string name="touchpad_switch_gesture_error_body" msgid="2211950382592343759">"Swipe left or right using four fingers on your touchpad to switch apps"</string> <string name="tutorial_action_key_title" msgid="8172535792469008169">"View all apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Press the action key on your keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Well done!"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index f31e51f7f3da..ad4e510d20d4 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellite, good connection"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellite, connection available"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Emergency calls or SOS only"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"No signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"one bar"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Back"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"or"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Clear search query"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Keyboard shortcuts"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Customise shortcuts"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remove shortcut?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset back to default?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Press key to assign shortcut"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"This will delete your custom shortcut permanently."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"This will delete all your custom shortcuts permanently."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Search shortcuts"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yes, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Press key"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Key combination already in use. Try another key."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Shortcut cannot be set."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Add shortcut"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Go back"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Go home"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string> <string name="gesture_error_title" msgid="469064941635578511">"Try again."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"To view recent apps, swipe up and hold using three fingers on your touchpad"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"View all apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Press the action key on your keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Well done!"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index f31e51f7f3da..ad4e510d20d4 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellite, good connection"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellite, connection available"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Emergency calls or SOS only"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"No signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"one bar"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Back"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"or"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Clear search query"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Keyboard shortcuts"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Customise shortcuts"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remove shortcut?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset back to default?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Press key to assign shortcut"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"This will delete your custom shortcut permanently."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"This will delete all your custom shortcuts permanently."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Search shortcuts"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yes, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Press key"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Key combination already in use. Try another key."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Shortcut cannot be set."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Add shortcut"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Go back"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Go home"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"View recent apps"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Done"</string> <string name="gesture_error_title" msgid="469064941635578511">"Try again."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Well done!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"You completed the view recent apps gesture."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"To view recent apps, swipe up and hold using three fingers on your touchpad"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"View all apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Press the action key on your keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Well done!"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index dacea9ff1b61..7188fa3701ce 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satélite, buena conexión"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satélite, conexión disponible"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS por satélite"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Solo llamadas de emergencia o SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"sin señal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"una barra"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Atrás"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificaciones"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ver combinaciones de teclas"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar diseño del teclado"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"o"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Borrar búsqueda"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Combinaciones de teclas"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalizar combinaciones de teclas"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"¿Quieres quitar la combinación?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"¿Quieres restablecer la configuración predeterminada?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Presiona una tecla para asignar la combinación"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Esta acción borrará tu combinación personalizada de forma permanente."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Esta acción borrará todas tus combinaciones personalizadas de forma permanente."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Buscar combinaciones de teclas"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sí, restablecer"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Presiona una tecla"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"La combinación de teclas ya está en uso. Prueba con otra."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"No se puede establecer la combinación de teclas."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Agregar combinación de teclas"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Atrás"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ir a la página principal"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver apps recientes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Listo"</string> <string name="gesture_error_title" msgid="469064941635578511">"Vuelve a intentarlo"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atrás"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"¡Bien hecho!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Completaste el gesto para ver las apps recientes."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Para ver las apps recientes, desliza tres dedos hacia arriba y mantenlos presionados en el panel táctil"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ver todas las apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Presiona la tecla de acción en el teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"¡Bien hecho!"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 1799055627c1..88a6aa461e2f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satélite, buena conexión"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satélite, conexión disponible"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS por satélite"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Solo llamadas de emergencia o SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"no hay señal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"una barra"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Atrás"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificaciones"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ver combinaciones de teclas"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar diseño del teclado"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"o"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Borrar la consulta de búsqueda"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Combinaciones de teclas"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalizar combinaciones de teclas"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"¿Eliminar combinación de teclas?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"¿Restablecer valores predeterminados?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pulsa una tecla para asignar una combinación de teclas"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Se eliminará tu combinación de teclas personalizada de forma permanente."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Se eliminarán todos tus accesos directos personalizados de forma permanente."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Buscar accesos directos"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sí, restablecer"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pulsa una tecla"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"La combinación de teclas ya se está usando. Prueba con otra tecla."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"No se puede configurar la combinación de teclas."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Añadir combinación de teclas"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Volver"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ir a Inicio"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver aplicaciones recientes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hecho"</string> <string name="gesture_error_title" msgid="469064941635578511">"Vuelve a intentarlo."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atrás"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"¡Bien hecho!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Has completado el gesto para ver las aplicaciones recientes."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Para ver las aplicaciones recientes, desliza tres dedos hacia arriba y mantén pulsado en el panel táctil"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ver todas las aplicaciones"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pulsa la tecla de acción de tu teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"¡Muy bien!"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index a91e3dcc7b2f..173a6ab4fa15 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelliit, hea ühendus"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelliit, ühendus on saadaval"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satelliit-SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Ainult hädaabikõned või satelliit-SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"signaal puudub"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"üks pulk"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Tagasi"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Märguanded"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klaviatuuri otseteed"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatuuripaigutuse vahetus"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"või"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Otsingupäringu tühjendamine"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Klaviatuuri otseteed"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Otseteede kohandamine"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Kas soovite otsetee eemaldada?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Kas lähtestada vaikeseadele?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Otsetee lisamiseks vajutage klahvi"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"See kustutab teie kohandatud otsetee jäädavalt."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"See kustutab kõik teie kohandatud otseteed jäädavalt."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Otsige otseteid"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Lähtesta"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Tühista"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Vajutage klahvi"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinatsioon on juba kasutusel. Proovige mõnda muud klahvi."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Otseteed ei saa seadistada."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Otsetee lisamine"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Mine tagasi"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Avakuvale"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Hiljutiste rakenduste vaatamine"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Valmis"</string> <string name="gesture_error_title" msgid="469064941635578511">"Proovige uuesti!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Tagasi"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Väga hea!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Tegite hiljutiste rakenduste vaatamise liigutuse."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Hiljutiste rakenduste kuvamiseks pühkige puuteplaadil kolme sõrmega üles ja hoidke sõrmi puuteplaadil"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Kõigi rakenduste kuvamine"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Vajutage klaviatuuril toiminguklahvi"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Hästi tehtud!"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 3a3c9cc144a6..4bf602b8ae4b 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelitea, konexio ona"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelitea, konexioa erabilgarri"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satelite bidezko SOS komunikazioa"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Larrialdi-deiak edo SOS komunikazioa soilik"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ez dago seinalerik"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"barra bat"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Atzera"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Jakinarazpenak"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Lasterbideak"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Aldatu tekl. diseinua"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"edo"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Garbitu bilaketa-kontsulta"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Lasterbideak"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Pertsonalizatu lasterbideak"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Lasterbidea kendu nahi duzu?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Balio lehenetsia berrezarri nahi duzu?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Sakatu tekla lasterbidea esleitzeko"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Betiko ezabatuko da lasterbide pertsonalizatua."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Lasterbide pertsonalizatu guztiak betiko ezabatuko dira."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Bilatu lasterbideak"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Bai, berrezarri"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Utzi"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Sakatu tekla"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tekla-konbinazio hori erabili da dagoeneko. Probatu beste tekla bat."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Ezin da ezarri lasterbidea."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Gehitu lasterbide bat"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Egin atzera"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Joan orri nagusira"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ikusi azkenaldiko aplikazioak"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Eginda"</string> <string name="gesture_error_title" msgid="469064941635578511">"Saiatu berriro!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Egin atzera"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bikain!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Osatu duzu azkenaldiko aplikazioak ikusteko keinua."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Azkenaldiko aplikazioak ikusteko, pasatu 3 hatz gora eta eduki sakatuta ukipen-panelean"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ikusi aplikazio guztiak"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Sakatu teklatuko ekintza-tekla"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bikain!"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 2caaf1415470..9a06c8d487be 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ماهواره، اتصال خوب است"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ماهواره، اتصال دردسترس است"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"درخواست کمک ماهوارهای"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"فقط تماس اضطراری یا درخواست کمک اضطراری"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>، <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"سیگنال وجود ندارد"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"یک خط"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"برگشت"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"اعلانها"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"میانبرهای صفحهکلید"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"تغییر جانمایی صفحهکلید"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"یا"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"پاک کردن پُرسمان جستجو"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"میانبرهای صفحهکلید"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"سفارشیسازی میانبرها"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"میانبر حذف شود؟"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"به تنظیم پیشفرض بازنشانی میکنید؟"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"برای اختصاص دادن میانبر، کلید را فشار دهید"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"با این کار، میانبر سفارشی شما برای همیشه حذف میشود."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"با این کار، همه میانبرهای سفارشی برای همیشه حذف خواهند شد."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"جستجوی میانبرها"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"بله، بازنشانی شود"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"لغو"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"کلید را فشار دهید"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ترکیب کلید ازقبل درحال استفاده است. کلید دیگری را امتحان کنید."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"میانبر تنظیم نشد."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"افزودن میانبر"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"برگشتن"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"رفتن به صفحه اصلی"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"مشاهده برنامههای اخیر"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"تمام"</string> <string name="gesture_error_title" msgid="469064941635578511">"دوباره امتحان کنید!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"برگشتن"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"عالی است!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"اشاره «مشاهده برنامههای اخیر» را تمام کردید"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"برای مشاهده برنامههای اخیر، با سه انگشت روی صفحه لمسی تند بهبالا بکشید و نگه دارید"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"مشاهده همه برنامهها"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"دکمه کنش را روی صفحه لمسی فشار دهید"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"عالی بود!"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 0bd79100a959..4139472efd66 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -761,8 +761,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelliitti, hyvä yhteys"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelliitti, yhteys saatavilla"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Vain hätäpuhelut tai Satellite SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ei signaalia"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"yksi palkki"</string> @@ -859,7 +858,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Takaisin"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ilmoitukset"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pikanäppäimet"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Vaihda näppäimistöasettelu"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"tai"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Tyhjennä hakulauseke"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Pikanäppäimet"</string> @@ -1442,7 +1440,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Muokkaa pikanäppäimiä"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Poistetaanko pikanäppäin?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Palautetaanko oletusasetukset?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Määritä pikanäppäin painamalla näppäintä"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Oma pikanäppäin poistetaan pysyvästi."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Kaikki omat pikanäppäimet poistetaan pysyvästi."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pikahaut"</string> @@ -1464,7 +1463,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Kyllä, nollaa"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Peru"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Paina näppäintä"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Näppäinyhdistelmä on jo käytössä. Kokeile toista näppäintä."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Pikakuvaketta ei voi lisätä."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Lisää pikanäppäin"</string> @@ -1478,6 +1478,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Takaisin"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Siirry etusivulle"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Katso viimeisimmät sovellukset"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Valmis"</string> <string name="gesture_error_title" msgid="469064941635578511">"Yritä uudelleen."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Takaisin"</string> @@ -1495,6 +1497,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Hienoa!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Olet oppinut Katso viimeisimmät sovellukset ‑eleen."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Näet äskeiset sovellukset, kun pyyhkäiset ylös ja pidät kosketuslevyä painettuna kolmella sormella."</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Näytä kaikki sovellukset"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Paina näppäimistön toimintonäppäintä"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Hienoa!"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index f93ceb498f4c..5247b395a493 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Bonne connexion satellite"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Connexion satellite accessible"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS par satellite"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Appels d\'urgence ou SOS seulement"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"aucun signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"une barre"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Précédent"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Raccourcis clavier"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Changer la disposition du clavier"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Effacez la requête de recherche"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Raccourcis-clavier"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personnaliser les raccourcis"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Supprimer le raccourci?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Réinitialiser aux raccourcis par défaut?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Appuyez sur la touche pour attribuer un raccourci"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Cela supprimera définitivement votre raccourci personnalisé."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Cette action supprimera définitivement tous vos raccourcis personnalisés."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Rechercher des raccourcis"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Oui, réinitialiser"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Annuler"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Appuyez sur la touche"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"La combinaison de touches est déjà utilisée. Essayez une autre touche."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Le raccourci ne peut pas être défini."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Ajouter un raccourci"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Retour"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Retour à la page d\'accueil"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Afficher les applis récentes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"OK"</string> <string name="gesture_error_title" msgid="469064941635578511">"Réessayez!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Retour"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bon travail!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Vous avez effectué le geste pour afficher les applis récentes."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Pour afficher vos applis récentes, balayez votre pavé tactile vers le haut avec trois doigts et maintenez-les en place"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Afficher toutes les applis"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Appuyez sur la touche d\'action de votre clavier"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Félicitations!"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index f0cc3b52fa02..6fc2434b8d24 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Bonne connexion satellite"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Connexion satellite disponible"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS par satellite"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Appels d\'urgence ou SOS uniquement"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"aucun signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"faible"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Précédent"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Raccourcis clavier"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Changer disposition du clavier"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Effacer la requête de recherche"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Raccourcis clavier"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personnaliser les raccourcis"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Supprimer le raccourci ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Rétablir les paramètres par défaut ?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Appuyez sur une touche pour attribuer un raccourci"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Votre raccourci personnalisé sera définitivement supprimé."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Tous vos raccourcis personnalisés seront définitivement supprimés."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Rechercher des raccourcis"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Oui, rétablir"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Annuler"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Appuyez sur la touche"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Combinaison de touches déjà utilisée. Essayez une autre touche."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Impossible de définir le raccourci."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Ajouter un raccourci"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Retour"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Retour à l\'accueil"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Afficher les applis récentes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"OK"</string> <string name="gesture_error_title" msgid="469064941635578511">"Essayez encore."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Retour"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bravo !"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Vous avez appris le geste pour afficher les applis récentes"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Pour afficher les applis récentes, balayez le pavé tactile vers le haut avec trois doigts et maintenez la position"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Afficher toutes les applications"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Appuyez sur la touche d\'action de votre clavier"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bravo !"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index a449530050e5..f7ee84c1cc06 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satélite, boa conexión"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satélite, conexión dispoñible"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS por satélite"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Só chamadas de emerxencia ou SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"non hai cobertura"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"unha barra"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Volver"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificacións"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atallos de teclado"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar deseño do teclado"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Borrar a busca"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Atallos de teclado"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalizar os atallos"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Queres quitar o atallo?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Queres restablecer a opción predeterminada?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Preme a tecla para asignar o atallo"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Eliminarase de forma permanente o teu atallo personalizado."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Eliminaranse permanentemente todos os teus atallos personalizados."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Busca atallos"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Si, restablecer"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Preme unha tecla"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Xa se está usando esta combinación de teclas. Proba con outra."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Non se puido definir o atallo."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Engadir un atallo"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Volver"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ir ao inicio"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Consultar aplicacións recentes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Feito"</string> <string name="gesture_error_title" msgid="469064941635578511">"Téntao de novo."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Volver"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Moi ben!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Completaches o titorial do xesto de consultar aplicacións recentes."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Para ver as aplicacións recentes, pasa tres dedos cara arriba e mantenos premidos no panel táctil"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ver todas as aplicacións"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Preme a tecla de acción do teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Ben feito!"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 727d11248e8c..d243e1925dae 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"સૅટલાઇટ, સારું કનેક્શન"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"સૅટલાઇટ, કનેક્શન ઉપલબ્ધ છે"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"ઇમર્જન્સી સૅટલાઇટ સહાય"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"માત્ર ઇમર્જન્સી કૉલ કે ઇમર્જન્સી સૅટલાઇટ સહાય"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"કોઈ સિગ્નલ નથી"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"એક બાર"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"પાછળ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"નોટિફિકેશન"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"કીબોર્ડ શૉર્ટકટ"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"કીબોર્ડ લેઆઉટ સ્વિચ કરો"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"અથવા"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"શોધ ક્વેરી સાફ કરો"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"કીબોર્ડ શૉર્ટકટ"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"શૉર્ટકટ કસ્ટમાઇઝ કરો"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"શું શૉર્ટકટ કાઢી નાખીએ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"પાછા ડિફૉલ્ટ પર રીસેટ કરીએ?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"શૉર્ટકટ સોંપવા માટે કી દબાવો"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"આ તમારા કસ્ટમ શૉર્ટકટને કાયમી રીતે ડિલીટ કરશે."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"આ તમારા બધા કસ્ટમ શૉર્ટકટને કાયમ માટે ડિલીટ કરશે."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"શૉર્ટકટ શોધો"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"હા, રીસેટ કરો"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"રદ કરો"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"કી દબાવો"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"કી સંયોજન પહેલેલેથી ઉપયોગમાં છે. અન્ય કી અજમાવી જુઓ."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"શૉર્ટકટ સેટ કરી શકાતો નથી."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"શૉર્ટકટ ઉમેરો"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"પાછા જાઓ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"હોમ પર જાઓ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"તાજેતરની ઍપ જુઓ"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"થઈ ગયું"</string> <string name="gesture_error_title" msgid="469064941635578511">"ફરી પ્રયાસ કરો!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"પાછા જાઓ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ખૂબ સરસ કામ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"તમે \'તાજેતરની ઍપ જુઓ\' સંકેત પૂર્ણ કર્યો."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"તાજેતરની ઍપ જોવા માટે, તમારા ટચપૅડ પર ત્રણ આંગળી વડે ઉપરની તરફ સ્વાઇપ કરો અને દબાવી રાખો"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"બધી ઍપ જુઓ"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"તમારા કીબોર્ડ પરની ઍક્શન કી દબાવો"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"વાહ!"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index f58512db0863..271ba1652c4b 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"सैटलाइट कनेक्शन अच्छा है"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"सैटलाइट कनेक्शन उपलब्ध है"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"सैटलाइट एसओएस"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"सिर्फ़ आपातकालीन कॉल या एसओएस का इस्तेमाल करें"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"सिग्नल नहीं है"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"एक सिग्नल बार"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"वापस जाएं"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचनाएं"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"कीबोर्ड शॉर्टकट"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"कीबोर्ड लेआउट बदलें"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"या"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"सर्च क्वेरी साफ़ करें"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"कीबोर्ड शॉर्टकट"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"पसंद के मुताबिक शॉर्टकट बनाएं"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"क्या आपको शॉर्टकट हटाना है?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"क्या आपको फिर से डिफ़ॉल्ट सेटिंग चालू करनी है?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"शॉर्टकट असाइन करने के लिए बटन दबाएं"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ऐसा करने पर, पसंद के मुताबिक बनाया गया आपका शॉर्टकट हमेशा के लिए मिट जाएगा."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ऐसा करने पर, पसंद के मुताबिक बनाए गए आपके सभी शॉर्टकट हमेशा के लिए मिट जाएंगे."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"शॉर्टकट खोजें"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"हां, रीसेट करें"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"रद्द करें"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"बटन दबाएं"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"बटन का यह कॉम्बिनेशन पहले से इस्तेमाल किया जा रहा है. कोई दूसरा कॉम्बिनेशन आज़माएं."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"शॉर्टकट सेट नहीं किया जा सकता."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"शॉर्टकट जोड़ें"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"वापस जाएं"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"होम स्क्रीन पर जाएं"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखें"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"हो गया"</string> <string name="gesture_error_title" msgid="469064941635578511">"फिर से कोशिश करें!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"वापस जाएं"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"बहुत बढ़िया!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"अब आपको हाथ के जेस्चर का इस्तेमाल करके, हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखने का तरीका पता चल गया है."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखने के लिए, अपने टचपैड पर तीन उंगलियों से ऊपर की ओर स्वाइप करें और दबाकर रखें"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"सभी ऐप्लिकेशन देखें"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"अपने कीबोर्ड पर ऐक्शन बटन दबाएं"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"बहुत खूब!"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index b8b5f82dbf71..345df1940ded 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, dobra veza"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, veza je dostupna"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS putem satelita"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Samo hitni pozivi ili SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"nema signala"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"jedna crtica"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Natrag"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obavijesti"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tipkovni prečaci"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Promjena rasporeda tipkovnice"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ili"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Brisanje upita za pretraživanje"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Tipkovni prečaci"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Prilagodite prečace"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Želite li ukloniti prečac?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Želite li vratiti na zadano?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pritisnite tipku da biste dodijelili prečac"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Da biste izradili taj prečac, pritisnite tipku za radnju i jednu ili više drugih tipki zajedno"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Time će se vaš prilagođeni prečac trajno izbrisati."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Time će se trajno izbrisati svi vaši prilagođeni prečaci."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Prečaci za pretraživanje"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Da, vrati"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Odustani"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pritisnite tipku"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ta se kombinacija već koristi. Pokušajte s nekom drugom."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Ta se kombinacija već koristi. Pokušajte s nekom drugom kombinacijom."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Prečac se ne može postaviti."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Dodaj prečac"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Natrag"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Na početni zaslon"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Pregled nedavnih aplikacija"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string> <string name="gesture_error_title" msgid="469064941635578511">"Pokušajte ponovno!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Natrag"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Sjajno!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Napravili ste pokret za prikaz nedavno korištenih aplikacija."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Za prikaz nedavnih aplikacija prijeđite trima prstima prema gore na dodirnoj podlozi i zadržite pritisak"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Prikaži sve aplikacije"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite tipku za radnju na tipkovnici"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Izvrsno!"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index e914e755a934..80f4d24aa652 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Műhold, jó kapcsolat"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Műhold, van rendelkezésre álló kapcsolat"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Műholdas SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Csak segélyhívás vagy SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"nincs jel"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"egy sáv"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Vissza"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Értesítések"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Billentyűkódok"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Billentyűzetkiosztás váltása"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"vagy"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Keresőkifejezés törlése"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Billentyűparancsok"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Gyorsparancsok személyre szabása"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Eltávolítja a billentyűparancsot?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Visszaállítja az alapértelmezett beállításokat?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Nyomja meg a billentyűt a billentyűparancs hozzárendeléséhez"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ezzel véglegesen törli az egyéni billentyűparancsot."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Ezzel véglegesen törli az összes egyéni billentyűparancsot."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Billentyűparancsok keresése"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Igen, visszaállítom"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Mégse"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Nyomja le a billentyűt"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"A billentyűkombináció már használatban van. Próbálkozzon másik billentyűvel."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Nem lehet beállítani a billentyűparancsot."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Billentyűparancs hozzáadása"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Vissza"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ugrás a főoldalra"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Legutóbbi alkalmazások megtekintése"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Kész"</string> <string name="gesture_error_title" msgid="469064941635578511">"Próbálja újra"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Vissza"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Kiváló!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Teljesítette a legutóbbi alkalmazások megtekintésének kézmozdulatát."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"A legutóbbi appokért csúsztasson gyorsan három ujjal felfelé az érintőpadon, és tartsa lenyomva ujjait."</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Összes alkalmazás megtekintése"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Nyomja meg a műveletbillentyűt az érintőpadon."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Szép munka!"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 262c3dd93cdd..5e17aedba083 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Արբանյակային լավ կապ"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Հասանելի է արբանյակային կապ"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Միայն շտապ կանչեր կամ SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>։"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ազդանշան չկա"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"մեկ գիծ"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Հետ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ծանուցումներ"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ստեղնային դյուրանցումներ"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Դասավորության փոխարկում"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"կամ"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Ջնջել որոնման հարցումը"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Ստեղնային դյուրանցումներ"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Դյուրանցումների անհատականացում"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Հեռացնե՞լ դյուրանցումը"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Վերականգնե՞լ կանխադրվածները"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Սեղմեք որևէ ստեղն՝ դյուրանցում նշանակելու համար"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ձեր հատուկ դյուրանցումն ընդմիշտ կջնջվի։"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Բոլոր հատուկ դյուրանցումներն ընդմիշտ կջնջվեն։"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Դյուրանցումների որոնում"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Վերականգնել"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Չեղարկել"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Սեղմեք որևէ ստեղն"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ստեղների համակցությունն արդեն օգտագործվում է։ Ընտրեք ուրիշը։"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Դյուրանցումը հնարավոր չէ ստեղծել։"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Ավելացնել դյուրանցում"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Ինչպես հետ գնալ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ինչպես անցնել հիմնական էկրան"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Դիտել վերջին հավելվածները"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Պատրաստ է"</string> <string name="gesture_error_title" msgid="469064941635578511">"Նորից փորձեք։"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Հետ գնալ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Կեցցե՛ք"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Դուք կատարեցիք վերջին օգտագործված հավելվածների դիտման ժեստը։"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Վերջին հավելվածները տեսնելու համար երեք մատը սահեցրեք վերև և սեղմած պահեք հպահարթակին"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ինչպես դիտել բոլոր հավելվածները"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Սեղմեք գործողության ստեղնը ստեղնաշարի վրա"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Հիանալի՛ է"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 8e1118c76e24..c848527591c6 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, koneksi baik"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, koneksi tersedia"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS via Satelit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Panggilan darurat atau SOS saja"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"tidak ada sinyal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"satu batang"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Kembali"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifikasi"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pintasan keyboard"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Ganti tata letak keyboard"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"atau"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Hapus kueri penelusuran"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Pintasan Keyboard"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Sesuaikan pintasan"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Hapus pintasan?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Reset kembali ke pintasan default?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Tekan tombol untuk menetapkan pintasan"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Tindakan ini akan menghapus pintasan kustom Anda secara permanen."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Tindakan ini akan menghapus semua pintasan kustom Anda secara permanen."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Telusuri pintasan"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ya, reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Batal"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tekan tombol"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinasi tombol sudah digunakan. Coba tombol lain."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Pintasan tidak dapat disetel."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Tambahkan pintasan"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Kembali"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Buka layar utama"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Lihat aplikasi terbaru"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Selesai"</string> <string name="gesture_error_title" msgid="469064941635578511">"Coba lagi"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kembali"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bagus!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Anda telah menyelesaikan gestur untuk melihat aplikasi terbaru."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Untuk melihat aplikasi terbaru, geser ke atas dan tahan menggunakan tiga jari di touchpad"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Lihat semua aplikasi"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tekan tombol tindakan di keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Oke!"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index f5488e0939de..6bfaab975f58 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Gervihnöttur, góð tenging"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Gervihnöttur, tenging tiltæk"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Gervihnattar-SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Neyðarsímtöl eða SOS eingöngu"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ekkert samband"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"eitt strik"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Til baka"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Tilkynningar"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Flýtilyklar"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Skipta um lyklaskipan"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"eða"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Hreinsa leitarfyrirspurn"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Flýtilyklar"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Sérsníða flýtilykla"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Fjarlægja flýtileið?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Endurstilla á sjálfgefið?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Ýttu á lykil til að stilla flýtileið"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Þetta eyðir sérsniðnu flýtileiðinni varanlega."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Þetta verður til þess að öllum sérsniðnu flýtileiðunum þínum verður eytt varanlega."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Leita að flýtileiðum"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Já, endurstilla"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Hætta við"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Ýttu á lykil"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Lyklasamsetningin er þegar í notkun. Prófaðu annan lykil."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Ekki er hægt að stilla flýtileið."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Bæta flýtileið við"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Til baka"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Fara á heimaskjá"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Sjá nýleg forrit"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Lokið"</string> <string name="gesture_error_title" msgid="469064941635578511">"Reyndu aftur!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Til baka"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Vel gert!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Þú framkvæmdir bendinguna til að sjá nýleg forrit."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Strjúktu upp og haltu þremur fingrum inni á snertifletinum til að sjá nýleg forrit"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Sjá öll forrit"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Ýttu á aðgerðalykilinn á lyklaborðinu"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Vel gert!"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 81367f369159..299107784637 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellitare, connessione buona"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellitare, connessione disponibile"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS satellitare"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Solo chiamate di emergenza o SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"nessun segnale"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"una barra"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Indietro"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifiche"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Scorciatoie da tastiera"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambia layout della tastiera"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"o"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Cancella la query di ricerca"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Scorciatoie da tastiera"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalizza scorciatoie"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Rimuovere scorciatoia?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vuoi ripristinare le impostazioni predefinite?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Premi un tasto per assegnare una scorciatoia"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"La scorciatoia personalizzata verrà eliminata definitivamente."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Tutte le tue scorciatoie personalizzate verranno eliminate definitivamente."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Cerca scorciatoie"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sì, ripristina"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Annulla"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Premi un tasto"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Combinazione di tasti già in uso. Prova con un altro tasto."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Impossibile impostare la scorciatoia."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Aggiungi scorciatoia"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Indietro"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Vai alla schermata Home"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Visualizza app recenti"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fine"</string> <string name="gesture_error_title" msgid="469064941635578511">"Riprova."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Indietro"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Ottimo lavoro!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Hai completato il gesto Visualizza app recenti."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Per visualizzare le app recenti, scorri verso l\'alto e tieni premuto con tre dita sul touchpad"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Visualizza tutte le app"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Premi il tasto azione sulla tastiera"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Ben fatto!"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index a40dd62c4620..4a0469464555 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"לוויין, חיבור באיכות טובה"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"לוויין, יש חיבור זמין"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"תקשורת לוויינית למצב חירום"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"רק שיחות חירום או תקשורת לוויינית למצב חירום"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"אין קליטה"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"פס אחד"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"חזרה"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"התראות"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"מקשי קיצור במקלדת"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"החלפה של פריסת מקלדת"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"או"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ניקוי שאילתת החיפוש"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"מקשי קיצור"</string> @@ -1437,11 +1435,11 @@ <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"האפליקציה הנוכחית"</string> <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"נגישות"</string> <string name="shortcut_helper_title" msgid="8567500639300970049">"מקשי קיצור"</string> - <!-- no translation found for shortcut_helper_customize_mode_title (8327297960035006036) --> - <skip /> + <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"התאמה אישית של מקשי הקיצור"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"להסיר את קיצור הדרך?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"לאפס לברירת המחדל?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"צריך להקיש על מקש כדי להקצות מקש קיצור"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"קיצור הדרך יימחק לתמיד."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"הפעולה הזו תמחק לתמיד את כל קיצורי הדרך שמותאמים אישית."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"חיפוש מקשי קיצור"</string> @@ -1463,13 +1461,12 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"כן, לאפס"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ביטול"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"יש ללחוץ על מקש"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"שילוב המקשים הזה כבר בשימוש. אפשר לנסות מקש אחר."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"לא ניתן להגדיר את קיצור הדרך."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> - <!-- no translation found for shortcut_helper_add_shortcut_button_label (7655779534665954910) --> - <skip /> - <!-- no translation found for shortcut_helper_delete_shortcut_button_label (3148773472696137052) --> - <skip /> + <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"הוספת קיצור דרך"</string> + <string name="shortcut_helper_delete_shortcut_button_label" msgid="3148773472696137052">"מחיקת קיצור הדרך"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ניווט באמצעות המקלדת"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"מידע על מקשי קיצור"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ניווט באמצעות לוח המגע"</string> @@ -1479,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"חזרה"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"חזרה לדף הבית"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"הצגת האפליקציות האחרונות"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"סיום"</string> <string name="gesture_error_title" msgid="469064941635578511">"צריך לנסות שוב."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"חזרה"</string> @@ -1496,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"מעולה!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"סיימת לתרגל את התנועה להצגת האפליקציות האחרונות."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"כדי לראות את האפליקציות האחרונות, צריך להחליק למעלה וללחוץ לחיצה ארוכה עם שלוש אצבעות על לוח המגע"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"צפייה בכל האפליקציות"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"צריך להקיש על מקש הפעולה במקלדת"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"כל הכבוד!"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 8941217e8cbd..e764514b6a43 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"衛生、接続状態良好"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"衛生、接続利用可能"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"衛星 SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"緊急通報または SOS のみ"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>、<xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>。"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"圏外"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"レベル 1"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"戻る"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"キーボード ショートカット"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"キーボード レイアウトの切り替え"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"または"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"検索クエリをクリア"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"キーボード ショートカット"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ショートカットのカスタマイズ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ショートカットを削除しますか?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"デフォルトにリセットしますか?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ショートカットを割り当てるキーを押してください"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"この操作を行うと、カスタム ショートカットが完全に削除されます。"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"この操作を行うと、すべてのカスタム ショートカットが完全に削除されます。"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ショートカットの検索"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"リセット"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"キャンセル"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"キーを押してください"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"このキーの組み合わせはすでに使用されています。別のキーを試してください。"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"ショートカットを設定できません。"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"ショートカットを追加"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"戻る"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ホームに移動"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"最近使ったアプリを表示する"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完了"</string> <string name="gesture_error_title" msgid="469064941635578511">"もう一度お試しください。"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"戻る"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"よくできました!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"「最近使ったアプリを表示する」ジェスチャーを学習しました。"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"最近使ったアプリを表示するには、3 本の指でタッチパッドを上にスワイプして長押しします"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"すべてのアプリを表示"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"キーボードのアクションキーを押します"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"完了です!"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 6937048c1826..0e790505a6bd 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"კარგი სატელიტური კავშირი"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ხელმისაწვდომია სატელიტური კავშირი"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"სატელიტური SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"გადაუდებელი ზარი ან მხოლოდ SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"სიგნალი არ არის"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ერთი ხაზი"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"უკან"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"შეტყობინებები"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"კლავიატურის მალსახმობები"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"კლავიატურის განლაგების გადართვა"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ან"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"საძიებო ფრაზის გასუფთავება"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"კლავიატურის მალსახმობები"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"მალსახმობების მორგება"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"გსურთ მალსახმობის წაშლა?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"გსურთ ნაგულისხმევზე გადაყენება?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"მალსახმობის მინიჭებისთვის დააჭირეთ კლავიშს"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"ამ მალსახმობის შესაქმნელად ერთად დააჭირეთ მოქმედების კლავიშს და ერთ ან მეტ სხვა კლავიშს"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ეს თქვენს მორგებულ მალსახმობებს სამუდამოდ წაშლის."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ეს სამუდამოდ წაშლის თქვენს ყველა მორგებულ მალსახმობს."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ძიების მალსახმობები"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"დიახ, გადაყენდეს"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"გაუქმება"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"დააჭირეთ კლავიშს"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"კლავიშების კომბინაცია უკვე გამოიყენება. ცადეთ სხვა კლავიში."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"კლავიშების კომბინაცია უკვე გამოიყენება. ცადეთ სხვა კომბინაცია."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"მალსახმობის დაყენება ვერ ხერხდება."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"მალსახმობის დამატება"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"უკან დაბრუნება"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"მთავარ ეკრანზე გადასვლა"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ბოლო აპების ნახვა"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"მზადაა"</string> <string name="gesture_error_title" msgid="469064941635578511">"ცადეთ ხელახლა!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"უკან დაბრუნება"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"შესანიშნავია!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"თქვენ დაასრულეთ ბოლო აპების ხედის ჟესტი."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ბოლო აპების სანახავად თქვენს სენსორულ პანელზე სამი თითით გადაფურცლეთ ზევით და ხანგრძლივად დააჭირეთ"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"ყველა აპის ნახვა"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"დააჭირეთ მოქმედების კლავიშს თქვენს კლავიატურაზე"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ყოჩაღ!"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index d6f0a006f588..f7369d2cd5be 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Жерсерік, байланыс жақсы."</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Жерсерік, байланыс бар."</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Тек құтқару қызметіне қоңырау шалу немесе SOS сигналын жіберу"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"сигнал жоқ"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"бір жолақ"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Артқа"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Хабарландырулар"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Перне тіркесімдері"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Пернетақта форматын ауыстыру"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"немесе"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Іздеу сұрауын өшіру"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Перне тіркесімдері"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Пернелер тіркесімін бейімдеу"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Тіркесімді өшіру керек пе?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Әдепкі тіркесімге қайтару керек пе?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Тіркесім тағайындау үшін пернені басыңыз."</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Арнаулы тіркесіміңіз біржола жойылады."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Мұндайда барлық арнаулы тіркесім біржола жойылады."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Тіркесімдерді іздеу"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Иә, қайтару"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Бас тарту"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Пернені басыңыз"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Бұл пернелер тіркесімі қазір қолданыста. Басқа перне таңдаңыз."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Перне тіркесімін орнату мүмкін емес."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Жылдам пәрмен қосу"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Артқа"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Негізгі бетке өту"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Соңғы қолданбаларды көру"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Дайын"</string> <string name="gesture_error_title" msgid="469064941635578511">"Қайталап көріңіз"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Артқа"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Жарайсыз!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Соңғы қолданбаларды көру қимылын орындадыңыз."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Соңғы қолданбаларды көру үшін сенсорлық тақтада үш саусақпен жоғары сырғытып, ұстап тұрыңыз."</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Барлық қолданбаны көру"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Пернетақтадағы әрекет пернесін басыңыз."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Жарайсыз!"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index efbc0aa0d68c..3b07faeef89d 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ផ្កាយរណប មានការតភ្ជាប់ល្អ"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ផ្កាយរណប អាចតភ្ជាប់បាន"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"ការប្រកាសអាសន្នតាមផ្កាយរណប"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"សម្រាប់ការហៅទៅលេខសង្គ្រោះបន្ទាន់ ឬការប្រកាសអាសន្នតែប៉ុណ្ណោះ"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>។"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"គ្មានសញ្ញា"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"មួយកាំ"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"ថយក្រោយ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ការជូនដំណឹង"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ផ្លូវកាត់ក្ដារចុច"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ប្ដូរប្លង់ក្ដារចុច"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ឬ"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"សម្អាតសំណួរស្វែងរក"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"ផ្លូវកាត់ក្ដារចុច"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ប្ដូរផ្លូវកាត់តាមបំណង"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ដកផ្លូវកាត់ចេញឬ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"កំណត់ឡើងវិញទៅលំនាំដើមឬ?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ចុចគ្រាប់ចុច ដើម្បីកំណត់ផ្លូវកាត់"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ការធ្វើបែបនេះនឹងលុបផ្លូវកាត់ផ្ទាល់ខ្លួនរបស់អ្នកជាអចិន្ត្រៃយ៍។"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"សកម្មភាពនេះនឹងលុបផ្លូវកាត់ផ្ទាល់ខ្លួនរបស់អ្នកទាំងអស់ជាអចិន្ត្រៃយ៍។"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ស្វែងរកផ្លូវកាត់"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"បាទ/ចាស កំណត់ឡើងវិញ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"បោះបង់"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ចុចគ្រាប់ចុច"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"បន្សំគ្រាប់ចុចនេះត្រូវបានប្រើប្រាស់ហើយ។ សាកល្បងគ្រាប់ចុចផ្សេង។"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"មិនអាចកំណត់ផ្លូវកាត់បានទេ។"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"បញ្ចូលផ្លូវកាត់"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ថយក្រោយ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ទៅទំព័រដើម"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"មើលកម្មវិធីថ្មីៗ"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"រួចរាល់"</string> <string name="gesture_error_title" msgid="469064941635578511">"សូមព្យាយាមម្ដងទៀត!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ថយក្រោយ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ធ្វើបានល្អ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"អ្នកបានបញ្ចប់ការមើលចលនាកម្មវិធីថ្មីៗ។"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ដើម្បីមើលកម្មវិធីថ្មីៗ សូមអូសឡើងលើ រួចសង្កត់ឱ្យជាប់លើផ្ទាំងប៉ះរបស់អ្នក ដោយប្រើម្រាមដៃបី"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"មើលកម្មវិធីទាំងអស់"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ចុចគ្រាប់ចុចសកម្មភាពលើក្ដារចុចរបស់អ្នក"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ធ្វើបានល្អ!"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index ded267feee65..544c81040ce9 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ಸ್ಯಾಟಲೈಟ್, ಕನೆಕ್ಷನ್ ಉತ್ತಮವಾಗಿದೆ"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ಸ್ಯಾಟಲೈಟ್, ಕನೆಕ್ಷನ್ ಲಭ್ಯವಿದೆ"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"ಸ್ಯಾಟಲೈಟ್ SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"ತುರ್ತು ಕರೆಗಳು ಅಥವಾ SOS ಮಾತ್ರ"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ಸಿಗ್ನಲ್ ಇಲ್ಲ"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ಒಂದು ಬಾರ್"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"ಹಿಂದೆ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ನೋಟಿಫಿಕೇಶನ್ಗಳು"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಬದಲಾಯಿಸಿ"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ಅಥವಾ"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ಹುಡುಕಾಟದ ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸಿ"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ತೆಗೆದುಹಾಕಬೇಕೇ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ಡೀಫಾಲ್ಟ್ಗೆ ರೀಸೆಟ್ ಮಾಡಬೇಕೆ?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ನಿಯೋಜಿಸಲು ಕೀಯನ್ನು ಒತ್ತಿರಿ"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ಇದು ನಿಮ್ಮ ಕಸ್ಟಮ್ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸುತ್ತದೆ."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ಇದು ನಿಮ್ಮ ಎಲ್ಲಾ ಕಸ್ಟಮ್ ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸುತ್ತದೆ."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ಹುಡುಕಾಟದ ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ಹೌದು, ರೀಸೆಟ್ ಮಾಡಿ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ರದ್ದುಮಾಡಿ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ಕೀ ಅನ್ನು ಒತ್ತಿರಿ"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ಕೀ ಸಂಯೋಜನೆಯು ಈಗಾಗಲೇ ಬಳಕೆಯಲ್ಲಿದೆ. ಮತ್ತೊಂದು ಕೀ ಬಳಸಿ ನೋಡಿ."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಸೆಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"ಶಾರ್ಟ್ಕಟ್ ಸೇರಿಸಿ"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ಹಿಂದಿರುಗಿ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ಮುಖಪುಟಕ್ಕೆ ಹೋಗಿ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ಮುಗಿದಿದೆ"</string> <string name="gesture_error_title" msgid="469064941635578511">"ಪುನಃ ಪ್ರಯತ್ನಿಸಿ!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ಹಿಂತಿರುಗಿ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ಭೇಷ್!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ನೀವು ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳ ಜೆಸ್ಚರ್ ವೀಕ್ಷಣೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿ ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ನಲ್ಲಿ ಆ್ಯಕ್ಷನ್ ಕೀಯನ್ನು ಒತ್ತಿ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ಭೇಷ್!"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 732c9bc8620c..759a2aa85ef3 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"위성, 연결 상태 양호"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"위성, 연결 가능"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"위성 긴급 SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"긴급 전화 또는 SOS만 허용"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"신호가 없습니다"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"신호 막대가 1개입니다"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"뒤로"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"알림"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"단축키"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"키보드 레이아웃 전환"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"또는"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"검색어 삭제"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"단축키"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"단축키 맞춤설정"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"단축키를 삭제하시겠어요?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"기본값으로 재설정하시겠어요?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"키를 눌러 단축키 지정"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"맞춤 단축키가 영구적으로 삭제됩니다."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"모든 맞춤 단축키가 완전히 삭제됩니다."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"단축키 검색"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"재설정"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"취소"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"키를 누르세요."</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"이미 사용 중인 키 조합입니다. 다른 키를 사용해 보세요."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"단축키를 설정할 수 없습니다."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"단축키 추가"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"뒤로 이동"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"홈으로 이동"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"최근 앱 보기"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"완료"</string> <string name="gesture_error_title" msgid="469064941635578511">"다시 시도해 보세요"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"뒤로"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"아주 좋습니다"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"최근 앱 보기 동작을 완료했습니다."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"최근 앱을 보려면 터치패드에서 세 손가락을 사용해 위로 스와이프한 채로 유지하세요."</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"모든 앱 보기"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"키보드의 작업 키를 누르세요."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"잘하셨습니다"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index eb5960fa23cd..c1427567fe3b 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Спутник, байланыш жакшы"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Спутник, байланыш бар"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Спутник SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Шашылыш чалуулар же SOS гана"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"сигнал жок"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"бир мамыча"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Артка"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Билдирмелер"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ыкчам баскычтар"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Баскычтоп калыбын которуштуруу"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"же"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Изделген суроону тазалоо"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Ыкчам баскычтар"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Ыкчам баскычтарды тууралоо"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Ыкчам баскыч өчүрүлсүнбү?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Баштапкы абалга келтиресизби?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Ыкчам баскычты дайындоо үчүн баскычты басыңыз"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ушуну менен жеке ыкчам баскычыңыз биротоло өчүрүлөт."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Ушуну менен жеке ыкчам баскычтарыңыздын баары биротоло өчүрүлөт."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Ыкчам баскычтарды издөө"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ооба, баштапкы абалга келтирилсин"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancel"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Баскычты басыңыз"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ачкычтардын айкалышы колдонулууда. Башка ачкычты байкап көрүңүз."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Ыкчам баскычты коюу мүмкүн эмес."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Ыкчам баскыч кошуу"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Артка кайтуу"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Башкы бетке өтүү"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Акыркы колдонмолорду көрүү"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Бүттү"</string> <string name="gesture_error_title" msgid="469064941635578511">"Кайталап көрүңүз!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Артка кайтуу"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Азаматсыз!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Акыркы колдонмолорду көрүү жаңсоосун аткардыңыз."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Соңку колдонмолорду көрүү үчүн сенсордук тактаны үч манжаңыз менен жогору сүрүп, кармап туруңуз"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Бардык колдонмолорду көрүү"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Баскычтобуңуздагы аракет баскычын басыңыз"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Эң жакшы!"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 19ddc7aa5c9a..26e70af28bee 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ດາວທຽມ, ການເຊື່ອມຕໍ່ດີ"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ດາວທຽມ, ການເຊື່ອມຕໍ່ທີ່ພ້ອມນຳໃຊ້"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS ດາວທຽມ"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"ໂທສຸກເສີນ ຫຼື SOS ເທົ່ານັ້ນ"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ບໍ່ມີສັນຍານ"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"1 ຂີດ"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"ກັບຄືນ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ການແຈ້ງເຕືອນ"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ປຸ່ມລັດແປ້ນພິມ"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ສະຫຼັບແປ້ນພິມ"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ຫຼື"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ລຶບລ້າງຄຳຊອກຫາ"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"ຄີລັດ"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ປັບແຕ່ງທາງລັດ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ລຶບທາງລັດອອກບໍ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ຣີເຊັດກັບຄືນເປັນຄ່າເລີ່ມຕົ້ນບໍ?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ກົດປຸ່ມເພື່ອກຳນົດທາງລັດ"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"ເພື່ອສ້າງທາງລັດນີ້, ໃຫ້ກົດປຸ່ມຄຳສັ່ງ ແລະ ໜຶ່ງ ຫຼື ຫຼາຍປຸ່ມອື່ນໆຮ່ວມກັນ"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ການດຳເນີນການນີ້ຈະລຶບທາງລັດທີ່ກຳນົດເອງຂອງທ່ານຢ່າງຖາວອນ."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ການດຳເນີນການນີ້ຈະລຶບທາງລັດທີ່ກຳນົດເອງທັງໝົດຂອງທ່ານຢ່າງຖາວອນ."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ທາງລັດການຊອກຫາ"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ແມ່ນ, ຣີເຊັດ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ຍົກເລີກ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ກົດປຸ່ມ"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ນໍາໃຊ້ປຸ່ມປະສົມຢູ່ແລ້ວ. ໃຫ້ລອງປຸ່ມອື່ນ."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"ນໍາໃຊ້ປຸ່ມປະສົມຢູ່ແລ້ວ. ລອງໃຊ້ການປະສົມປະສານອື່ນໆ."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"ຕັ້ງທາງລັດບໍ່ໄດ້."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"ເພີ່ມທາງລັດ"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ກັບຄືນ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ໄປຫາໜ້າຫຼັກ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ເບິ່ງແອັບຫຼ້າສຸດ"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ແລ້ວໆ"</string> <string name="gesture_error_title" msgid="469064941635578511">"ກະລຸນາລອງໃໝ່!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ກັບຄືນ"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ດີຫຼາຍ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ທ່ານເບິ່ງທ່າທາງຂອງແອັບຫຼ້າສຸດສຳເລັດແລ້ວ."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ເພື່ອເບິ່ງແອັບຫຼ້າສຸດ, ໃຫ້ປັດຂຶ້ນແລ້ວຄ້າງໄວ້ໂດຍໃຊ້ສາມນິ້ວເທິງແຜ່ນສຳຜັດຂອງທ່ານ"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"ເບິ່ງແອັບທັງໝົດ"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ກົດປຸ່ມຄຳສັ່ງຢູ່ແປ້ນພິມຂອງທ່ານ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ດີຫຼາຍ!"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 71ce30db0a02..d8de5c0f8997 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Palydovas, geras ryšys"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Palydovas, pasiekiamas ryšys"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Prisijungimas prie palydovo kritiniu atveju"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Tik skambučiai pagalbos numeriu arba prisijungimas prie palydovo kritiniu atveju"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"„<xliff:g id="CARRIER_NAME">%1$s</xliff:g>“, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"nėra signalo"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"viena juosta"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Atgal"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Pranešimai"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Spartieji klavišai"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Perjungti klaviat. išdėstymą"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"arba"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Išvalyti paieškos užklausą"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Spartieji klavišai"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Sparčiųjų klavišų tinkinimas"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Pašalinti spartųjį klavišą?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Iš naujo nustatyti numatytąjį nustatymą?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Paspauskite klavišą, kad priskirtumėte spartųjį klavišą"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Jei norite sukurti šį spartųjį klavišą, paspauskite veiksmų klavišą ir vieną ar daugiau kitų klavišų"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Bus visam laikui ištrintas tinkintas spartusis klavišas."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Bus visam laikui ištrinti visi tinkinti šaukiniai."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Ieškoti sparčiųjų klavišų"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Taip, nustatyti iš naujo"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Atšaukti"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Paspauskite klavišą"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Klavišų derinys jau naudojamas. Bandykite naudoti kitą klavišą."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Klavišų derinys jau naudojamas. Bandykite naudoti kitą derinį."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Sparčiojo klavišo nustatyti negalima."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Pridėti spartųjį klavišą"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Grįžti"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Eikite į pagrindinį puslapį"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Peržiūrėti naujausias programas"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Atlikta"</string> <string name="gesture_error_title" msgid="469064941635578511">"Bandykite dar kartą!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Grįžti"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Puiku!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Atlikote naujausių programų peržiūros gestą."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Peržiūrėkite naujausias programas, jutiklinėje dalyje perbraukę aukštyn trimis pirštais ir palaikę"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Žr. visas programas"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Paspauskite klaviatūros veiksmų klavišą"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Puikiai padirbėta!"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 271c081ea3a9..4cce539f73df 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelīts, labs savienojums"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelīts, ir pieejams savienojums"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satelīta SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Tikai ārkārtas izsaukumi vai SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"nav signāla"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"viena josla"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Atpakaļ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Paziņojumi"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Īsinājumtaustiņi"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Mainīt tastatūras izkārtojumu"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"vai"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Notīrīt meklēšanas vaicājumu"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Īsinājumtaustiņi"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Īsinājumtaustiņu pielāgošana"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Vai noņemt saīsni?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vai atiestatīt noklusējuma vērtības?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Lai piešķirtu īsinājumtaustiņu, nospiediet taustiņu"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Veicot šo darbību, jūsu pielāgotā saīsne tiks neatgriezeniski izdzēsta."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Veicot šo darbību, visas jūsu pielāgotās saīsnes tiks neatgriezeniski dzēstas."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Meklēt saīsnes"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Jā, atiestatīt"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Atcelt"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Nospiediet taustiņu"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Taustiņu kombinācija jau tiek izmantota. Izmēģiniet citu taustiņu."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Nevar iestatīt saīsni."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Pievienot saīsni"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Atpakaļ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Pāriet uz sākuma ekrānu"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Skatīt nesen izmantotās lietotnes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gatavs"</string> <string name="gesture_error_title" msgid="469064941635578511">"Mēģiniet vēlreiz."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atpakaļ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Lieliski!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Jūs sekmīgi veicāt nesen izmantoto lietotņu skatīšanas žestu."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Lai skatītu nesenās lietotnes, skārienpaliktnī ar trīs pirkstiem velciet augšup un turiet"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Skatīt visas lietotnes"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tastatūrā nospiediet darbību taustiņu."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Lieliski!"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index b478a5b38c4b..d6a5181582fe 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Добра сателитска врска"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Достапна е сателитска врска"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Сателитски SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Само итни повици или SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"нема сигнал"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"една цртичка"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Назад"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Известувања"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Кратенки на тастатурата"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Промени јазик на тастатура"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"или"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Бришење поим за пребарување"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Кратенки од тастатура"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Приспособете ги кратенките"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Да се отстрани кратенката?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Да се ресетира на стандардните поставки?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Притиснете копче за да доделите кратенка"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Ова ќе ја избрише вашата приспособена кратенка трајно."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Ова ќе ги избрише трајно сите ваши приспособени кратенки."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Пребарувајте кратенки"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Да, ресетирај"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Откажи"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Притиснете копче"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Комбинацијата на копчиња веќе се користи. Обидете се со друго копче."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Кратенката не може да се постави."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Додај кратенка"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Врати се назад"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Оди на почетниот екран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прикажи ги неодамнешните апликации"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> <string name="gesture_error_title" msgid="469064941635578511">"Обидете се повторно!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Одлично!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Го завршивте движењето за прегледување на неодамнешните апликации."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Повлечете нагоре со три прста на допирната подлога и задржете за да ги видите неодамнешните апликации"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Прегледајте ги сите апликации"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Притиснете го копчето за дејство на тастатурата"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Браво!"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 4885595c860b..20a7729da105 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"സാറ്റലൈറ്റ്, മികച്ച കണക്ഷൻ"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"സാറ്റലൈറ്റ്, കണക്ഷൻ ലഭ്യമാണ്"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"സാറ്റലൈറ്റ് SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"എമർജൻസി കോളുകൾ അല്ലെങ്കിൽ SOS മാത്രം"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"സിഗ്നൽ ഇല്ല"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ഒരു ബാർ"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"മടങ്ങുക"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"അറിയിപ്പുകൾ"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"കീബോർഡ് കുറുക്കുവഴികൾ"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"കീബോർഡ് ലേഔട്ട് മാറുക"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"അല്ലെങ്കിൽ"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"തിരയൽ ചോദ്യം മായ്ക്കുക"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"കീബോർഡ് കുറുക്കുവഴികൾ"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"കുറുക്കുവഴികൾ ഇഷ്ടാനുസൃതമാക്കുക"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"കുറുക്കുവഴി നീക്കം ചെയ്യണോ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ഡിഫോൾട്ടിലേക്ക് തിരികെ റീസെറ്റ് ചെയ്യണോ?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"കുറുക്കുവഴി അസൈൻ ചെയ്യാൻ കീ അമർത്തുക"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ഇത് നിങ്ങളുടെ ഇഷ്ടാനുസൃത കുറുക്കുവഴി ശാശ്വതമായി ഇല്ലാതാക്കും."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"നിങ്ങളുടെ എല്ലാ ഇഷ്ടാനുസൃത കുറുക്കുവഴികളും ശാശ്വതമായി ഇത് ഇല്ലാതാക്കും."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"തിരയൽ കുറുക്കുവഴികൾ"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ഉവ്വ്, റീസെറ്റ് ചെയ്യുക"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"റദ്ദാക്കുക"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"കീ അമർത്തുക"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"കീ കോമ്പിനേഷൻ ഇതിനകം ഉപയോഗത്തിലുണ്ട്. മറ്റൊരു കീ പരീക്ഷിക്കുക."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"കുറുക്കുവഴി സജ്ജീകരിക്കാനാകില്ല."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"കുറുക്കുവഴി ചേർക്കുക"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"മടങ്ങുക"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ഹോമിലേക്ക് പോകുക"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"പൂർത്തിയായി"</string> <string name="gesture_error_title" msgid="469064941635578511">"വീണ്ടും ശ്രമിക്കുക!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"മടങ്ങുക"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"കൊള്ളാം!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക എന്ന ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"സമീപകാല ആപ്പുകൾ കാണുന്നതിന്, നിങ്ങളുടെ ടച്ച്പാഡിൽ മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"എല്ലാ ആപ്പുകളും കാണുക"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"നിങ്ങളുടെ കീബോർഡിലെ ആക്ഷൻ കീ അമർത്തുക"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"അഭിനന്ദനങ്ങൾ!"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 52dff9e8afdd..31b058bce4f9 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Хиймэл дагуул, холболт сайн байна"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Хиймэл дагуул, холболт боломжтой"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Хиймэл дагуул SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Зөвхөн яаралтай дуудлага эсвэл SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"дохио байхгүй"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"нэг шон"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Буцах"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Мэдэгдэл"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Гарын товчлол"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Гарын бүдүүвч рүү сэлгэх"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"эсвэл"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Хайлтын асуулгыг арилгах"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Товчлуурын шууд холбоос"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Товчлолыг өөрчлөх"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Товчлолыг хасах уу?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Өгөгдмөл рүү буцааж шинэчлэх үү?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Товчлол оноохын тулд товч дарна уу"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Энэ нь таны захиалгат товчлолыг бүрмөсөн устгана."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Энэ нь таны бүх захиалгат товчлолыг бүрмөсөн устгана."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Товчлолууд хайх"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Тэгье, шинэчилье"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Цуцлах"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Товч дарна уу"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Товчийн хослолыг аль хэдийн ашиглаж байна. Өөр товч туршиж үзнэ үү."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Товчлол тохируулах боломжгүй."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Товчлол нэмэх"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Буцах"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Нүүр хуудас руу очих"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Саяхны аппуудыг харах"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Болсон"</string> <string name="gesture_error_title" msgid="469064941635578511">"Дахин оролдоно уу!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Буцах"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Сайн байна!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Та саяхны аппуудыг харах зангааг гүйцэтгэсэн."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Саяхны аппуудыг харахын тулд мэдрэгч самбар дээрээ гурван хуруугаараа дээш шудраад, удаан дарна уу"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Бүх аппыг харах"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Гар дээрх тусгай товчлуурыг дарна уу"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Сайн байна!"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 85ae835df9fe..4beed1731b97 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"सॅटेलाइट, चांगले कनेक्शन"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"सॅटेलाइट, कनेक्शन उपलब्ध"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"सॅटेलाइट SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"फक्त आणीबाणी कॉल किंवा SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"कोणताही सिग्नल नाही"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"एक बार"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"परत"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचना"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"कीबोर्ड शॉर्टकट"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"कीबोर्ड लेआउट स्विच करा"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"किंवा"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"शोध क्वेरी साफ करा"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"कीबोर्ड शॉर्टकट"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"शॉर्टकट कस्टमाइझ करा"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"शॉर्टकट काढून टाकायचा आहे का?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"डीफॉल्टवर पुन्हा रीसेट करायचे आहे का?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"शॉर्टकट असाइन करण्यासाठी की प्रेस करा"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"हा शॉर्टकट तयार करण्यासाठी, ॲक्शन की आणि एक किंवा त्याहून अधिक की एकत्र प्रेस करा"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"यामुळे तुमचा कस्टम शॉर्टकट कायमचा हटवला जाईल."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"हे तुमचे सर्व कस्टम शॉर्टकट कायमचे हटवेल."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"शोधण्यासाठी शॉर्टकट"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"होय, रीसेट करा"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"रद्द करा"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"की प्रेस करा"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"की कॉम्बिनेशन आधीपासून वापरले जात आहे. दुसरी की वापरून पहा."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"की कॉम्बिनेशन आधीपासून वापरले जात आहे. दुसरे कॉम्बिनेशन वापरून पहा."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"शॉर्टकट सेट करू शकत नाही."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"शॉर्टकट जोडा"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"मागे जा"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"होमवर जा"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"अलीकडील अॅप्स पहा"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"पूर्ण झाले"</string> <string name="gesture_error_title" msgid="469064941635578511">"पुन्हा प्रयत्न करा!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"मागे जा"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"उत्तम कामगिरी!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"तुम्ही अलीकडील ॲप्स पाहण्याचे जेश्चर पूर्ण केले आहे."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"अलीकडील अॅप्स पाहण्यासाठी, तुमच्या टचपॅडवर तीन बोटांनी वर स्वाइप करून धरून ठेवा"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"सर्व अॅप्स पहा"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"तुमच्या कीबोर्डवर अॅक्शन की प्रेस करा"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"खूप छान!"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index b5f0d147f972..ea1f79bac39c 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, sambungan yang baik"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, sambungan tersedia"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS via Satelit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Panggilan kecemasan atau SOS sahaja"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"tiada isyarat"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"satu bar"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Kembali"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Pemberitahuan"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pintasan Papan Kekunci"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Tukar reka letak papan kekunci"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"atau"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Kosongkan pertanyaan carian"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Pintasan Papan Kekunci"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Sesuaikan pintasan"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Alih keluar pintasan?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Tetapkan kembali kepada lalai?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Tekan kekunci untuk menetapkan pintasan"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Untuk membuat pintasan ini, tekan kekunci Tindakan dan sekurang-kurangnya satu kekunci lain bersama"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Tindakan ini akan memadamkan pintasan tersuai anda secara kekal."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Tindakan ini akan memadamkan semua pintasan tersuai anda secara kekal."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pintasan carian"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ya, tetapkan semula"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Batal"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tekan kekunci"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Gabungan kekunci sudah digunakan. Cuba kekunci lain."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Gabungan kekunci sudah digunakan. Cuba kombinasi lain."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Pintasan tidak boleh ditetapkan."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Tambahkan pintasan"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Kembali"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Akses laman utama"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Lihat apl terbaharu"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Selesai"</string> <string name="gesture_error_title" msgid="469064941635578511">"Cuba lagi!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kembali"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Syabas!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Anda telah melengkapkan gerak isyarat lihat apl terbaharu."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Untuk melihat apl terbaharu, leret ke atas dan tahan menggunakan tiga jari pada pad sentuh anda"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Lihat semua apl"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tekan kekunci tindakan pada papan kekunci anda"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Syabas!"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index d24c4a0b1631..044c1aa43cb8 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ဂြိုဟ်တု၊ ချိတ်ဆက်မှု ကောင်းသည်"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ဂြိုဟ်တု၊ ချိတ်ဆက်မှု ရနိုင်သည်"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"အရေးပေါ်ဖုန်းခေါ်ခြင်း (သို့) SOS သီးသန့်"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>၊ <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>။"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"လိုင်းမရှိပါ"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"တစ်ဘား"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"နောက်သို့"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"အကြောင်းကြားချက်များ"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ကီးဘုတ် ဖြတ်လမ်းများ"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ကီးဘုတ်အပြင်အဆင် ပြောင်းခြင်း"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"သို့မဟုတ်"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ရှာဖွေစာလုံး ရှင်းထုတ်ရန်"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"လက်ကွက်ဖြတ်လမ်းများ"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ဖြတ်လမ်းများ စိတ်ကြိုက်ပြင်ဆင်ခြင်း"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ဖြတ်လမ်းလင့်ခ် ဖယ်ရှားမလား။"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"မူရင်းသို့ ပြန်လည်ပြင်ဆင်သတ်မှတ်မလား။"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ဖြတ်လမ်းလင့်ခ်သတ်မှတ်ရန် ကီးကို နှိပ်ပါ"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"၎င်းသည် သင့်စိတ်ကြိုက် ဖြတ်လမ်းလင့်ခ်ကို အပြီးဖျက်ပါမည်။"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"၎င်းသည် သင့်စိတ်ကြိုက်ဖြတ်လမ်းလင့်ခ်အားလုံးကို အပြီးဖျက်မည်။"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ရှာဖွေစာလုံး ဖြတ်လမ်း"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ပြင်ဆင်ရန်"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"မလုပ်တော့"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ကီးကို နှိပ်ပါ"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ကီးပေါင်းစပ်ခြင်းကို သုံးနေပြီးဖြစ်သည်။ အခြားကီးကို စမ်းကြည့်ပါ။"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"ဖြတ်လမ်းလင့်ခ် သတ်မှတ်၍မရပါ။"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"ဖြတ်လမ်းလင့်ခ် ထည့်ရန်"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"နောက်သို့"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ပင်မစာမျက်နှာသို့ သွားရန်"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"မကြာသေးမီကအက်ပ်များကို ကြည့်ရန်"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ပြီးပြီ"</string> <string name="gesture_error_title" msgid="469064941635578511">"ထပ်စမ်းကြည့်ပါ။"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ပြန်သွားရန်"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"တော်ပါပေသည်။"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"မကြာသေးမီကအက်ပ်များကို ကြည့်ခြင်းလက်ဟန် သင်ခန်းစာပြီးပါပြီ။"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"လတ်တလောအက်ပ်များကြည့်ရန် တာ့ချ်ပက်တွင် လက်သုံးချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"အက်ပ်အားလုံးကို ကြည့်ခြင်း"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ကီးဘုတ်တွင် လုပ်ဆောင်ချက်ကီး နှိပ်ပါ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"အလွန်ကောင်းပါသည်။"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 871ffe921f89..0c7ff3cd341b 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellitt – god tilkobling"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellitt – tilkobling tilgjengelig"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS-alarm via satellitt"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Bare nødanrop eller SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ikke noe signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"én strek"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Tilbake"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Varsler"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Hurtigtaster"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Bytt tastaturoppsett"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"eller"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Fjern søket"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Hurtigtaster"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Tilpass snarveier"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Vil du fjerne hurtigtasten?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vil du tilbakestille til standard?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Trykk på en tast for å tilordne hurtigtasten"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Dette fører til at den egendefinerte hurtigtasten slettes permanent."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Dette fører til at alle de egendefinerte snarveiene dine slettes permanent."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Søk etter snarveier"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Tilbakestill"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Avbryt"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Trykk på tasten"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tastekombinasjonen brukes allerede. Prøv en annen tast."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Kan ikke angi snarveien."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Legg til snarvei"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Gå tilbake"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Gå til startsiden"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se nylige apper"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Ferdig"</string> <string name="gesture_error_title" msgid="469064941635578511">"Prøv på nytt."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gå tilbake"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bra jobbet!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du har fullført bevegelsen for å se nylige apper."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"For å se nylige apper, sveip opp og hold med tre fingre på styreflaten"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Se alle apper"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Trykk på handlingstasten på tastaturet"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bra!"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 58307c49ada7..e2fe85aff01f 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"स्याटलाइट, राम्रो कनेक्सन"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"स्याटलाइट, कनेक्सन उपलब्ध छ"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"स्याटलाइट SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"आपत्कालीन कल वा SOS मात्र"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>।"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"सिग्नल छैन"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"एउटा बार"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"पछाडि"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचनाहरू"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"किबोर्ड सर्टकटहरू"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"किबोर्डको लेआउट बदल्नुहोस्"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"वा"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"किवर्ड हटाउनुहोस्"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"किबोर्डका सर्टकटहरू"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"सर्टकटहरू कस्टमाइज गर्नुहोस्"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"सर्टकट हटाउने हो?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"सर्टकट रिसेट गरी डिफल्ट बनाउने हो?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"सर्टकट असाइन गर्न की थिच्नुहोस्"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"यसो गर्नुभयो भने तपाईंको कस्टम सर्टकट सदाका लागि मेटिने छ।"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"तपाईंले यसो गर्नुभयो भने तपाईंका सबै कस्टम सर्टकटहरू सदाका लागि मेटाइने छन्।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"सर्टकटहरू खोज्नुहोस्"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"अँ, रिसेट गर्नुहोस्"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"रद्द गर्नुहोस्"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"की थिच्नुहोस्"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"यो की कम्बिनेसन प्रयोग गरिसकिएको छ। अर्कै की प्रयोग गरी हेर्नुहोस्।"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"सर्टकट सेट गर्न सकिएन।"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"सर्टकट हाल्नुहोस्"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"पछाडि जानुहोस्"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"होम स्क्रिनमा जानुहोस्"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"हालसालै चलाइएका एपहरू हेर्नुहोस्"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"सम्पन्न भयो"</string> <string name="gesture_error_title" msgid="469064941635578511">"फेरि प्रयास गर्नुहोस्!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"पछाडि जानुहोस्"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"अद्भुत!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"तपाईंले जेस्चर प्रयोग गरी हालसालै चलाइएका एपहरू हेर्ने तरिका सिक्नुभएको छ।"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"हालसालैका एपहरू हेर्न तीन औँला प्रयोग गरी टचप्याडमा माथितिर स्वाइप गर्नुहोस् र होल्ड गर्नुहोस्"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"सबै एपहरू हेर्नुहोस्"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"आफ्नो किबोर्डमा भएको एक्सन की थिच्नुहोस्"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"स्याबास!"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 6e8d328c1896..bae1489af501 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelliet, goede verbinding"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelliet, verbinding beschikbaar"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS via satelliet"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Alleen noodoproepen of SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"geen signaal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"1 streepje"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Terug"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Meldingen"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Sneltoetsen"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Toetsenbordindeling wisselen"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"of"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Zoekopdracht wissen"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Sneltoetsen"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Snelkoppelingen aanpassen"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Sneltoets verwijderen?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Resetten naar standaard?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Druk op de toets om de sneltoets toe te wijzen"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Hiermee wordt je aangepaste sneltoets definitief verwijderd."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Hiermee worden al je aangepaste snelkoppelingen definitief verwijderd."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Sneltoetsen zoeken"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, resetten"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Annuleren"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Druk op een toets"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Toetsencombinatie is al in gebruik. Probeer een andere toets."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Sneltoets kan niet worden ingesteld."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Snelkoppeling toevoegen"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Terug"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Naar startscherm"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Recente apps bekijken"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klaar"</string> <string name="gesture_error_title" msgid="469064941635578511">"Probeer het nog eens."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Terug"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Goed gedaan!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Je weet nu hoe je het gebaar Recente apps bekijken maakt."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Als je recente apps wilt bekijken, swipe je met 3 vingers omhoog op de touchpad en houd je vast"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Alle apps bekijken"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Druk op de actietoets op het toetsenbord"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Goed gedaan!"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 9986c11b49fd..1201e4ccbe93 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ସାଟେଲାଇଟ, ଭଲ କନେକ୍ସନ"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ସାଟେଲାଇଟ, କନେକ୍ସନ ଉପଲବ୍ଧ"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"ସେଟେଲାଇଟ SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"କେବଳ ଜରୁରୀକାଳୀନ କଲ କିମ୍ବା SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>।"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"କୌଣସି ସିଗନାଲ ନାହିଁ"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ଗୋଟିଏ ବାର"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"ଫେରନ୍ତୁ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ବିଜ୍ଞପ୍ତି"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"କୀବୋର୍ଡ ସର୍ଟକଟ"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"କୀ\'ବୋର୍ଡ୍ର ଲେଆଉଟ୍କୁ ବଦଳାନ୍ତୁ"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"କିମ୍ବା"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ସର୍ଚ୍ଚ କ୍ୱେରୀକୁ ଖାଲି କରନ୍ତୁ"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"କୀବୋର୍ଡ ସର୍ଟକଟ"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ସର୍ଟକଟଗୁଡ଼ିକୁ କଷ୍ଟମାଇଜ କରନ୍ତୁ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ସର୍ଟକଟକୁ କାଢ଼ି ଦେବେ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ଡିଫଲ୍ଟରେ ପୁଣି ରିସେଟ କରିବେ?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ସର୍ଟକଟ ଆସାଇନ କରିବା ପାଇଁ କୀ\'କୁ ଦବାନ୍ତୁ"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ଏହା ଆପଣଙ୍କ କଷ୍ଟମ ସର୍ଟକଟକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିଦେବ।"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ଏହା ଆପଣଙ୍କର ସମସ୍ତ କଷ୍ଟମ ସର୍ଟକଟକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିଦେବ।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ସର୍ଚ୍ଚ ସର୍ଟକଟ"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ହଁ, ରିସେଟ କରନ୍ତୁ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ବାତିଲ କରନ୍ତୁ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"କୀ ଦବାନ୍ତୁ"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"କୀ କମ୍ବିନେସନ ପୂର୍ବରୁ ବ୍ୟବହାର କରାଯାଉଛି। ଅନ୍ୟ ଏକ କୀ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ।"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"ସର୍ଟକଟ ସେଟ କରାଯାଇପାରିବ ନାହିଁ।"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"ସର୍ଟକଟ ଯୋଗ କରନ୍ତୁ"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ପଛକୁ ଫେରନ୍ତୁ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ହୋମକୁ ଯାଆନ୍ତୁ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରନ୍ତୁ"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ହୋଇଗଲା"</string> <string name="gesture_error_title" msgid="469064941635578511">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ପଛକୁ ଫେରନ୍ତୁ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ବଢ଼ିଆ କାମ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ଆପଣ ବର୍ତ୍ତମାନର ଆପ୍ସ ଜେଶ୍ଚରକୁ ଭ୍ୟୁ କରିବା ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରିବାକୁ, ଆପଣଙ୍କ ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠି ବ୍ୟବହାର କରି ଉପରକୁ ସ୍ୱାଇପ କରି ଧରି ରଖନ୍ତୁ"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"ସବୁ ଆପ ଭ୍ୟୁ କରନ୍ତୁ"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ଆପଣଙ୍କର କୀବୋର୍ଡରେ ଆକ୍ସନ କୀ\'କୁ ଦବାନ୍ତୁ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ବହୁତ ବଢ଼ିଆ!"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 45888847bc2e..807abf3df40e 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ਸੈਟੇਲਾਈਟ, ਕਨੈਕਸ਼ਨ ਵਧੀਆ ਹੈ"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ਸੈਟੇਲਾਈਟ, ਕਨੈਕਸ਼ਨ ਉਪਲਬਧ ਹੈ"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"ਸੈਟੇਲਾਈਟ SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"ਸਿਰਫ਼ ਐਮਰਜੈਂਸੀ ਕਾਲਾਂ ਜਾਂ ਸਹਾਇਤਾ"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ਕੋਈ ਸਿਗਨਲ ਨਹੀਂ"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ਇੱਕ ਸਿਗਨਲ ਪੱਟੀ"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"ਪਿੱਛੇ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ਸੂਚਨਾਵਾਂ"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ਕੀ-ਬੋਰਡ ਖਾਕਾ ਬਦਲੋ"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ਜਾਂ"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ਖੋਜ ਪੁੱਛਗਿੱਛ ਕਲੀਅਰ ਕਰੋ"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ਸ਼ਾਰਟਕੱਟਾਂ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ਕੀ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ਕੀ ਵਾਪਸ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ \'ਤੇ ਰੀਸੈੱਟ ਕਰਨਾ ਹੈ?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ਸ਼ਾਰਟਕੱਟ ਨਿਰਧਾਰਿਤ ਕਰਨ ਲਈ ਕੁੰਜੀ ਦਬਾਓ"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ਇਸ ਨਾਲ ਤੁਹਾਡੇ ਵਿਉਂਤੇ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ਇਸ ਨਾਲ ਤੁਹਾਡੇ ਸਾਰੇ ਵਿਉਂਤਬੱਧ ਸ਼ਾਰਟਕੱਟ ਪੱਕੇ ਤੌਰ \'ਤੇ ਮਿਟ ਜਾਣਗੇ।"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ਸ਼ਾਰਟਕੱਟ ਖੋਜੋ"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ਹਾਂ, ਰੀਸੈੱਟ ਕਰੋ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ਰੱਦ ਕਰੋ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"ਕੁੰਜੀ ਦਬਾਓ"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"ਕੁੰਜੀ ਸੁਮੇਲ ਪਹਿਲਾਂ ਹੀ ਵਰਤੋਂ ਵਿੱਚ ਹੈ। ਕੋਈ ਹੋਰ ਕੁੰਜੀ ਵਰਤ ਕੇ ਦੇਖੋ।"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"ਸ਼ਾਰਟਕੱਟ ਸ਼ਾਮਲ ਕਰੋ"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ਵਾਪਸ ਜਾਓ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ਹੋਮ \'ਤੇ ਜਾਓ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ਹੋ ਗਿਆ"</string> <string name="gesture_error_title" msgid="469064941635578511">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ਵਾਪਸ ਜਾਓ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ਬਹੁਤ ਵਧੀਆ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ਤੁਸੀਂ \'ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ ਹੈ।"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖਣ ਲਈ, ਆਪਣੇ ਟੱਚਪੈਡ \'ਤੇ ਤਿੰਨ ਉਂਗਲਾਂ ਵਰਤ ਕੇ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਰੋਕ ਕੇ ਰੱਖੋ"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"ਸਾਰੀਆਂ ਐਪਾਂ ਦੇਖੋ"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ਆਪਣੇ ਕੀ-ਬੋਰਡ \'ਤੇ ਕਾਰਵਾਈ ਕੁੰਜੀ ਨੂੰ ਦਬਾਓ"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ਬਹੁਤ ਵਧੀਆ!"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 67ca4393ee64..2554396b596f 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelita – połączenie dobre"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelita – połączenie dostępne"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satelitarne połączenie alarmowe"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Tylko połączenia alarmowe lub SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"brak sygnału"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"1 pasek"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Wstecz"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Powiadomienia"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Skróty klawiszowe"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Przełącz układ klawiatury"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"lub"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Wyczyść wyszukiwanie hasło"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Skróty klawiszowe"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Dostosuj skróty"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Usunąć skrót?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Zresetować do ustawień domyślnych?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Naciśnij klawisz, aby przypisać skrót"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Aby utworzyć ten skrót, naciśnij jednocześnie klawisz działania i co najmniej 1 inny klawisz"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Spowoduje to trwałe usunięcie skrótu niestandardowego."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Spowoduje to trwałe usunięcie wszystkich skrótów niestandardowych."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Szukaj skrótów"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Tak, zresetuj"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Anuluj"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Naciśnij klawisz"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ta kombinacja klawiszy jest już używana. Użyj innego klawisza."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Ta kombinacja klawiszy jest już używana. Użyj innej."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Nie można ustawić skrótu."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Dodaj skrót"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Wróć"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Otwórz stronę główną"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Wyświetlanie ostatnich aplikacji"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotowe"</string> <string name="gesture_error_title" msgid="469064941635578511">"Spróbuj jeszcze raz"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Wróć"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Brawo!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Znasz już gest wyświetlania ostatnio używanych aplikacji."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Aby wyświetlić ostatnie aplikacje, przesuń 3 palcami w górę na touchpadzie i przytrzymaj"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Wyświetl wszystkie aplikacje"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Naciśnij klawisz działania na klawiaturze"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Brawo!"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index ead72a21e432..9d73d06c4806 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satélite, conexão boa"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satélite, conexão disponível"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS via satélite"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Apenas chamadas de emergência ou SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"sem sinal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"uma barra"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Voltar"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos do teclado"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar layout do teclado"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Limpar a consulta de pesquisa"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Atalhos do teclado"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalizar atalhos"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remover atalho?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Redefinir para o padrão?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pressione a tecla para atribuir o atalho"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Para criar esse atalho, pressione a tecla de ação e uma ou mais outras teclas"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Essa ação vai excluir permanentemente seu atalho personalizado."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Essa ação vai excluir permanentemente todos os seus atalhos personalizados."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pesquisar atalhos"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sim, redefinir"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pressione a tecla"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Essa combinação de teclas já está em uso. Tente outra tecla."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Essa combinação de teclas já está em uso. Tente outra."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Não é possível definir o atalho."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Adicionar atalho"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Voltar"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ir para a página inicial"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver os apps recentes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluído"</string> <string name="gesture_error_title" msgid="469064941635578511">"Tente de novo"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Você concluiu o gesto para ver os apps recentes."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Se quiser ver os apps recentes, deslize para cima e pressione o touchpad com três dedos"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ver todos os apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pressione a tecla de ação no teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Muito bem!"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 303a2808d552..d7fcb758c71f 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satélite, boa ligação"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satélite, ligação disponível"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satélite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Apenas chamadas de emergência ou SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"sem sinal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"1 barra"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Anterior"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos de teclado"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar esquema de teclado"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Limpar consulta de pesquisa"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Atalhos de teclado"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalize os atalhos"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remover atalho?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Repor para a predefinição?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Prima a tecla para atribuir o atalho"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Para criar este atalho, prima a tecla de ação e uma ou mais teclas adicionais em simultâneo"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Esta ação elimina o atalho personalizado permanentemente."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Esta ação elimina todos os seus atalhos personalizados permanentemente."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pesquisar atalhos"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sim, repor"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Prima a tecla"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"A combinação de teclas já está a ser usada. Experimente outra tecla."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"A combinação de teclas já está a ser usada. Experimente outra combinação."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Não é possível definir o atalho."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Adicionar atalho"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Voltar"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Aceder ao ecrã principal"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver apps recentes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluir"</string> <string name="gesture_error_title" msgid="469064941635578511">"Tente novamente!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Concluiu o gesto para ver as apps recentes."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Para ver as apps recentes, deslize rapidamente para cima sem soltar com 3 dedos no touchpad"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ver todas as apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Prima a tecla de ação no teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Muito bem!"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index ead72a21e432..9d73d06c4806 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satélite, conexão boa"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satélite, conexão disponível"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS via satélite"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Apenas chamadas de emergência ou SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"sem sinal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"uma barra"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Voltar"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos do teclado"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar layout do teclado"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Limpar a consulta de pesquisa"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Atalhos do teclado"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalizar atalhos"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Remover atalho?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Redefinir para o padrão?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pressione a tecla para atribuir o atalho"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Para criar esse atalho, pressione a tecla de ação e uma ou mais outras teclas"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Essa ação vai excluir permanentemente seu atalho personalizado."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Essa ação vai excluir permanentemente todos os seus atalhos personalizados."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Pesquisar atalhos"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sim, redefinir"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pressione a tecla"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Essa combinação de teclas já está em uso. Tente outra tecla."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Essa combinação de teclas já está em uso. Tente outra."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Não é possível definir o atalho."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Adicionar atalho"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Voltar"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ir para a página inicial"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ver os apps recentes"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluído"</string> <string name="gesture_error_title" msgid="469064941635578511">"Tente de novo"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Muito bem!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Você concluiu o gesto para ver os apps recentes."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Se quiser ver os apps recentes, deslize para cima e pressione o touchpad com três dedos"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ver todos os apps"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pressione a tecla de ação no teclado"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Muito bem!"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index afd18f12cbf5..3991604d2cee 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, conexiune bună"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, conexiune disponibilă"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS prin satelit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Numai apeluri de urgență sau SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"fără semnal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"o bară"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Înapoi"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificări"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Comenzi rapide de la tastatură"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Schimbă aspectul tastaturii"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"sau"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Șterge termenul de căutare"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Comenzi rapide de la tastatură"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalizează comenzile rapide"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Elimini comanda rapidă?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Resetezi la valorile prestabilite?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Apasă tasta pentru a atribui comanda rapidă"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Astfel, se va șterge definitiv comanda rapidă personalizată."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Astfel, se vor șterge definitiv toate comenzile rapide personalizate."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Comenzi directe de căutare"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Resetează"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Anulează"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Apasă tasta"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Combinația de taste este deja folosită. Încearcă altă tastă."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Comanda rapidă nu poate fi setată."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Adaugă o comandă rapidă"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Înapoi"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Înapoi la pagina de pornire"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Vezi aplicațiile recente"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gata"</string> <string name="gesture_error_title" msgid="469064941635578511">"Încearcă din nou!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Înapoi"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Excelent!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ai finalizat gestul pentru afișarea aplicațiilor recente."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Ca să vezi aplicațiile recente, glisează în sus și ține apăsat cu trei degete pe touchpad"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Vezi toate aplicațiile"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Apasă tasta de acțiuni de pe tastatură"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Felicitări!"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 10dc51d71683..ff5bd2e50537 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Спутниковая связь, хорошее качество соединения"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Доступно соединение по спутниковой связи"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Спутниковый SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Только экстренные вызовы или спутниковый SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"нет сигнала"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"одно деление"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Назад"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Уведомления"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Сочетания клавиш"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Переключение раскладки"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"или"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Удалить поисковый запрос"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Сочетания клавиш"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Настройки сочетаний клавиш"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Удалить сочетание клавиш?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Сбросить настройки?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Нажмите клавишу, чтобы назначить сочетание клавиш."</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Настроенное сочетание будет безвозвратно удалено."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Все настроенные сочетания клавиш будут безвозвратно удалены."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Найти"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Сбросить"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Отмена"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Нажмите клавишу"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Это сочетание клавиш уже используется. Попробуйте другое."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Это сочетание клавиш выбрать нельзя."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Добавить сочетание клавиш"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Назад"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"На главный экран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Просмотр недавних приложений"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> <string name="gesture_error_title" msgid="469064941635578511">"Попробуйте ещё раз"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Отлично!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Вы выполнили жест для просмотра недавних приложений."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Чтобы увидеть недавние приложения, проведите по сенсорной панели тремя пальцами вверх и удерживайте."</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Все приложения"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Нажмите клавишу действия на клавиатуре."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Блестяще!"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 5a7a6a377527..46ee1df1ee45 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"චන්ද්රිකාව, හොඳ සම්බන්ධතාවයක්"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"චන්ද්රිකාව, සම්බන්ධතාවය තිබේ"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"චන්ද්රිකා SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"හදිසි ඇමතුම් හෝ SOS පමණි"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"සංඥාව නැත"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"තීරු එකක්"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"ආපසු"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"දැනුම්දීම්"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"යතුරු පුවරු කෙටිමං"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"යතුරුපුවරු පිරිසැලසුම මාරු කරන්න"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"හෝ"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"සෙවීම් විමසුම හිස් කරන්න"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"යතුරු පුවරු කෙටිමං"</string> @@ -1437,11 +1435,10 @@ <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"වත්මන් යෙදුම"</string> <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"ප්රවේශ්යතාව"</string> <string name="shortcut_helper_title" msgid="8567500639300970049">"යතුරු පුවරු කෙටි මං"</string> - <!-- no translation found for shortcut_helper_customize_mode_title (8327297960035006036) --> - <skip /> + <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"කෙටිමං අභිරුචිකරණය කරන්න"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"කෙටිමඟ ඉවත් කරන්න ද?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"පෙරනිමියට යළි සකසන්න ද?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"කෙටිමඟ පැවරීමට යතුර ඔබන්න"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"මෙම කෙටිමඟ නිර්මාණය කිරීමට, ක්රියාකාරී යතුර සහ තවත් යතුරු එකක් හෝ කිහිපයක් එකවර ඔබන්න"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"මෙය ඔබේ අභිරුචි කෙටිමඟ ස්ථිරවම මකනු ඇත."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"මෙය ඔබේ සියලු අභිරුචි කෙටිමං ස්ථිරවම මකනු ඇත."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"කෙටි මං සොයන්න"</string> @@ -1463,13 +1460,11 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ඔව්, යළි සකසන්න"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"අවලංගු කරන්න"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"යතුර ඔබන්න"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"යතුරු සංයෝජනය දැනටමත් භාවිත වේ. වෙනත් යතුරක් උත්සාහ කරන්න."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"යතුරු සංයෝජනය දැනටමත් භාවිත වේ. තවත් සංයෝජනයක් උත්සාහ කරන්න."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"කෙටිමඟ සැකසිය නොහැක."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> - <!-- no translation found for shortcut_helper_add_shortcut_button_label (7655779534665954910) --> - <skip /> - <!-- no translation found for shortcut_helper_delete_shortcut_button_label (3148773472696137052) --> - <skip /> + <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"කෙටිමඟ එක් කරන්න"</string> + <string name="shortcut_helper_delete_shortcut_button_label" msgid="3148773472696137052">"කෙටිමඟ මකන්න"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"ඔබේ යතුරු පුවරුව භාවිතයෙන් සංචාලනය කරන්න"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"යතුරුපුවරු කෙටිමං ඉගෙන ගන්න"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"ඔබේ ස්පර්ශ පෑඩ් භාවිතයෙන් සංචාලනය කරන්න"</string> @@ -1479,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ආපසු යන්න"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"මුල් පිටුවට යන්න"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"මෑත යෙදුම් බලන්න"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"නිමයි"</string> <string name="gesture_error_title" msgid="469064941635578511">"නැවත උත්සාහ කරන්න!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ආපස්සට යන්න"</string> @@ -1496,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"අනර්ඝ වැඩක්!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ඔබ මෑත යෙදුම් ඉංගිත බැලීම සම්පූර්ණ කර ඇත."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"මෑත කාලීන යෙදුම් බැලීමට, ඔබේ ස්පර්ශක පෑඩයේ ඇඟිලි තුනක් භාවිතයෙන් ඉහළට ස්වයිප් කරගෙන සිටින්න"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"සියලු යෙදුම් බලන්න"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"ඔබේ යතුරු පුවරුවේ ක්රියාකාරී යතුර ඔබන්න"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"හොඳින් කළා!"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index d2d9cdeed413..0aa3be7dd5d7 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, dobrá kvalita pripojenia"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, pripojenie je k dispozícii"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Pomoc cez satelit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Len tiesňové volania alebo pomoc v tiesni"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"žiadny signál"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"jedna čiarka"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Späť"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Upozornenia"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klávesové skratky"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Prepnúť rozloženie klávesnice"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"alebo"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Vymazať vyhľadávací dopyt"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Klávesové skratky"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Prispôsobenie skratiek"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Chcete skratku odstrániť?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Chcete resetovať na predvolené nastavenie?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Stlačením klávesa priraďte skratku"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Ak chcete vytvoriť túto skratku, stlačte súčasne akčný kláves a minimálne jeden ďalší kláves"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Týmto natrvalo odstránite vlastnú skratku."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Týmto natrvalo odstránite všetky vlastné odkazy."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Prehľadávať skratky"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Áno, resetovať"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Zrušiť"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Stlačte kláves"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinácia klávesov sa už používa. Skúste iný kláves."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Kombinácia klávesov sa už používa. Skúste inú kombináciu."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Skratku nie je možné nastaviť."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Pridať skratku"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Prechod späť"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Prejsť na plochu"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Zobrazenie nedávnych aplikácií"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hotovo"</string> <string name="gesture_error_title" msgid="469064941635578511">"Skúste to znova."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Prejdenie späť"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Skvelé!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Použili ste gesto na zobrazenie nedávnych aplikácií."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Ak si chcete zobraziť nedávne aplikácie, potiahnite troma prstami na touchpade nahor a pridržte ich"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Zobrazenie všetkých aplikácií"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Stlačte na klávesnici akčný kláves"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Dobre!"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index c473962ca1ba..e929f9290726 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satelit, dobra povezava"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satelit, povezava je na voljo"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS prek satelita"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Samo klici v sili ali SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ni signala"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ena črtica"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Nazaj"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obvestila"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Bližnjične tipke"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Preklop postavitve tipkovnice"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ali"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Čiščenje iskalne poizvedbe"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Bližnjične tipke"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Prilagajanje bližnjic"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Želite odstraniti bližnjico?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Želite ponastaviti na privzete bližnjice?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pritisnite tipko za dodelitev bližnjice"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"S tem boste trajno izbrisali bližnjico po meri."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"S tem boste trajno izbrisali vse bližnjice po meri."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Iskanje po bližnjicah"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Da"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Prekliči"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pritisnite tipko"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinacija tipk je že v uporabi. Poskusite z drugo tipko."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Bližnjice ni mogoče nastaviti."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Dodajanje bližnjice"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Pomik nazaj"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Pomik na začetni zaslon"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Ogled nedavnih aplikacij"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Končano"</string> <string name="gesture_error_title" msgid="469064941635578511">"Poskusite znova"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazaj"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Odlično!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Izvedli ste potezo za ogled nedavnih aplikacij."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Za ogled nedavnih aplikacij povlecite s tremi prsti navzgor po sledilni ploščici in pridržite"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Ogled vseh aplikacij"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pritisnite tipko za dejanja na tipkovnici"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Odlično!"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 3c7d05b2e318..fe9abbb585b9 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Sateliti. Lidhje e mirë"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Sateliti. Ofrohet lidhje"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS satelitor"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Vetëm telefonata urgjence ose SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"nuk ka sinjal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"një vijë"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Prapa"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Njoftimet"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Shkurtoret e tastierës"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Ndërro strukturën e tastierës"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ose"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Pastro pyetjen e kërkimit"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Shkurtoret e tastierës"</string> @@ -1437,11 +1435,11 @@ <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"Aplikacioni aktual"</string> <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"Qasshmëria"</string> <string name="shortcut_helper_title" msgid="8567500639300970049">"Shkurtoret e tastierës"</string> - <!-- no translation found for shortcut_helper_customize_mode_title (8327297960035006036) --> - <skip /> + <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Personalizo shkurtoret"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Të hiqet shkurtorja?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Të rivendosen përsëri te parazgjedhjet?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Shtyp tastin për të caktuar shkurtoren"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Kjo do ta fshijë përgjithmonë shkurtoren tënde të personalizuar."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Kjo do të fshijë përgjithmonë të gjitha shkurtoret e tua të personalizuara."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Kërko për shkurtoret"</string> @@ -1463,13 +1461,12 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Po"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Anulo"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Shtyp tastin"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Kombinimi i tasteve është tashmë në përdorim. Provo një tast tjetër."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Shkurtorja nuk mund të caktohet."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> - <!-- no translation found for shortcut_helper_add_shortcut_button_label (7655779534665954910) --> - <skip /> - <!-- no translation found for shortcut_helper_delete_shortcut_button_label (3148773472696137052) --> - <skip /> + <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Shto shkurtore"</string> + <string name="shortcut_helper_delete_shortcut_button_label" msgid="3148773472696137052">"Fshi shkurtoren"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Navigo duke përdorur tastierën tënde"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Mëso shkurtoret e tastierës"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Navigo duke përdorur bllokun me prekje"</string> @@ -1479,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Kthehu prapa"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Shko tek ekrani bazë"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Shiko aplikacionet e fundit"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"U krye"</string> <string name="gesture_error_title" msgid="469064941635578511">"Provo përsëri!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kthehu prapa"</string> @@ -1496,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Punë e shkëlqyer!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Përfundove gjestin për shikimin e aplikacioneve të fundit."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Për të shikuar aplikacionet e fundit, rrëshqit shpejt lart dhe mbaj shtypur me tre gishta në bllokun me prekje"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Shiko të gjitha aplikacionet"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Shtyp tastin e veprimit në tastierë"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Shumë mirë!"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index b7ddd4d7c6d2..56cac9863626 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Сателит, веза је добра"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Сателит, веза је доступна"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Хитна помоћ преко сателита"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Само хитни позиви или хитна помоћ"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"нема сигнала"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"једна црта"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Назад"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Обавештења"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Тастерске пречице"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Промени распоред тастатуре"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"или"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Обриши упит за претрагу"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Тастерске пречице"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Прилагодите пречице"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Желите да уклоните пречицу?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Желите да ресетујете на подразумевано?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Притисните тастер да бисте доделили пречицу"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Да бисте направили ову пречицу, притисните заједно тастер радњи и један или више других тастера"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Овим ћете трајно избрисати прилагођену пречицу."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Тиме ћете трајно избрисати све прилагођене пречице."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Претражите пречице"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Да, ресетуј"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Откажи"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Притисните тастер"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Комбинација тастера се већ користи. Пробајте са другим тастером."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Комбинација тастера се већ користи. Пробајте са другом комбинацијом."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Подешавање пречице није успело."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Додајте пречицу"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Назад"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Иди на почетни екран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прикажи недавно коришћене апликације"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> <string name="gesture_error_title" msgid="469064941635578511">"Пробајте поново."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Одлично!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Довршили сте покрет за приказивање недавно коришћених апликација."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Да бисте прегледали недавне апликације, превуците нагоре и задржите са три прста на тачпеду"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Прикажи све апликације"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Притисните тастер радњи на тастатури"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Одлично!"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 2d2a94d4e7b2..2d07a4307bf3 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellit, bra anslutning"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellit, anslutning tillgänglig"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS-larm via satellit"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Endast nödsamtal eller SOS-larm"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ingen signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"en stapel"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Tillbaka"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Aviseringar"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Kortkommandon"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Byt tangentbordslayout"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"eller"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Rensa sökfråga"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Kortkommandon"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Anpassa kortkommandon"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Vill du ta bort kortkommandot?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Vill du återställa till standardinställningarna?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Tryck på tangenten för att tilldela ett kortkommando"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Det anpassade kortkommandot raderas permanent."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Alla anpassade genvägar raderas permanent."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Sökgenvägar"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ja, återställ"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Avbryt"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tryck på tangenten"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tangentkombinationen används redan. Testa en annan tangent."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Det går inte att ställa in kortkommandot."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Lägg till genväg"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Tillbaka"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Återvänd till startsidan"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Se de senaste apparna"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klar"</string> <string name="gesture_error_title" msgid="469064941635578511">"Försök igen!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Tillbaka"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Bra jobbat!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Du är klar med rörelsen för att se de senaste apparna."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Svep uppåt på styrplattan med tre fingrar och håll kvar för att se nyligen använda appar"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Visa alla appar"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Tryck på åtgärdstangenten på tangentbordet"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Bra gjort!"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 424434d182a7..1ee8f61e27a2 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Setilaiti, muunganisho thabiti"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Setilaiti, muunganisho unapatikana"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Msaada kupitia Setilaiti"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Simu ya dharura au kipengele cha Msaada kupitia Setilaiti pekee"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"hakuna mtandao"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"upau mmoja"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Nyuma"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Arifa"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Mikato ya Kibodi"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Badili mkao wa kibodi"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"au"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Futa hoja ya utafutaji"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Mikato ya Kibodi"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Kuweka mapendeleo ya njia za mkato"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Ungependa kuondoa njia ya mkato?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Ungependa kurejesha njia za mkato chaguomsingi?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Bonyeza kitufe ukabidhi njia ya mkato"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Hatua hii itaondoa kabisa njia yako maalum ya mkato."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Hatua hii itafuta kabisa njia zako zote maalum za mkato."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Njia mkato za kutafutia"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ndiyo"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Acha"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Bonyeza kitufe"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tayari unatumia mchanganyiko wa vitufe. Jaribu kitufe kingine."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Haiwezi kuweka njia ya mkato."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Weka njia ya mkato"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Rudi nyuma"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Nenda kwenye ukurasa wa mwanzo"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Angalia programu za hivi majuzi"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Nimemaliza"</string> <string name="gesture_error_title" msgid="469064941635578511">"Jaribu tena!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Rudi nyuma"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Kazi nzuri!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Umekamilisha mafunzo ya mguso wa kuangalia programu za hivi majuzi."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Telezesha vidole vitatu juu na ushikilie kwenye padi yako ya kugusa ili uangalie programu za hivi majuzi"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Angalia programu zote"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Bonyeza kitufe cha vitendo kwenye kibodi yako"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Vizuri sana!"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index cb340789345e..7ef59b11633c 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"சாட்டிலைட், நிலையான இணைப்பு"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"சாட்டிலைட், இணைப்பு கிடைக்கிறது"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"சாட்டிலைட் SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"அவசர அழைப்புகள் அல்லது SOS மட்டும்"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"சிக்னல் இல்லை"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ஒரு கோடு"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"முந்தையது"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"அறிவிப்புகள்"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"கீபோர்டு ஷார்ட்கட்கள்"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"கீபோர்டு லே அவுட்டை மாற்று"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"அல்லது"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"தேடல் வினவலை அழிக்கும்"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"கீபோர்டு ஷார்ட்கட்கள்"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ஷார்ட்கட்களைப் பிரத்தியேகமாக்குதல்"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"ஷார்ட்கட்டை அகற்றவா?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"மீண்டும் இயல்புநிலைக்கு மீட்டமைக்கவா?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"ஷார்ட்கட்டை அமைக்க பட்டனை அழுத்துங்கள்"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"இது உங்கள் பிரத்தியேக ஷார்ட்கட்டை நிரந்தரமாக நீக்கும்."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"இது உங்கள் பிரத்தியேக ஷார்ட்கட்கள் அனைத்தையும் நிரந்தரமாக நீக்கும்."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ஷார்ட்கட்களைத் தேடுக"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ஆம். மீட்டமை"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ரத்துசெய்"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"பட்டனை அழுத்துங்கள்"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"பட்டன் சேர்க்கை ஏற்கெனவே பயன்பாட்டில் உள்ளது. வேறொரு பட்டனைப் பயன்படுத்திப் பார்க்கவும்."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"ஷார்ட்கட்டை அமைக்க முடியாது."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"ஷார்ட்கட்டைச் சேர்க்கும்"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"பின்செல்"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"முகப்பிற்குச் செல்"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"முடிந்தது"</string> <string name="gesture_error_title" msgid="469064941635578511">"மீண்டும் முயலவும்!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"பின்செல்"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"அருமை!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"சமீபத்தில் பயன்படுத்திய ஆப்ஸுக்கான சைகை பயிற்சியை நிறைவுசெய்துவிட்டீர்கள்."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"சமீபத்திய ஆப்ஸைப் பார்க்க, உங்கள் டச்பேடில் மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"அனைத்து ஆப்ஸையும் காட்டு"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"உங்கள் கீபோர்டில் ஆக்ஷன் பட்டனை அழுத்தவும்"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"அருமை!"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 8dac7651ae49..190bc0ee109a 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"శాటిలైట్, కనెక్షన్ బాగుంది"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"శాటిలైట్, కనెక్షన్ అందుబాటులో ఉంది"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"ఎమర్జెన్సీ శాటిలైట్ సహాయం"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"ఎమర్జెన్సీ కాల్స్ లేదా SOS మాత్రమే"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"సిగ్నల్ లేదు"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"సిగ్నల్ ఒక బార్ ఉంది"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"వెనుకకు"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"నోటిఫికేషన్లు"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"కీబోర్డ్ షార్ట్కట్లు"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"కీబోర్డ్ లేఅవుట్ను మార్చండి"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"లేదా"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"సెర్చ్ క్వెరీని క్లియర్ చేయండి"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"కీబోర్డ్ షార్ట్కట్లు"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"షార్ట్కట్లను అనుకూలంగా మార్చండి"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"షార్ట్కట్ను తీసివేయాలా?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"తిరిగి ఆటోమేటిక్ సెట్టింగ్కు రీసెట్ చేయాలా?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"షార్ట్కట్ను కేటాయించడానికి కీని నొక్కండి"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"ఇది మీ అనుకూల షార్ట్కట్ను శాశ్వతంగా తొలగిస్తుంది."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"ఇది మీ అనుకూల షార్ట్కట్లన్నింటిని శాశ్వతంగా తొలగిస్తుంది."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"షార్ట్కట్లను వెతకండి"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"అవును, రీసెట్ చేయాలి"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"రద్దు చేయండి"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"కీని నొక్కండి"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"కీ కాంబినేషన్ ఇప్పటికే వినియోగంలో ఉంది. వేరొక కీని ట్రై చేయండి."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"షార్ట్కట్ను సెట్ చేయడం సాధ్యం కాదు."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"షార్ట్కట్ను జోడించండి"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"వెనుకకు వెళ్లండి"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"మొదటి ట్యాబ్కు వెళ్లండి"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ఇటీవలి యాప్లను చూడండి"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"పూర్తయింది"</string> <string name="gesture_error_title" msgid="469064941635578511">"మళ్లీ ట్రై చేయండి!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"వెనుకకు"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"చక్కగా పూర్తి చేశారు!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ఇటీవలి యాప్లను చూడడానికి ఉపయోగించే సంజ్ఞకు సంబంధించిన ట్యుటోరియల్ను మీరు పూర్తి చేశారు."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ఇటీవలి యాప్లను చూడటానికి, మీ టచ్ప్యాడ్లో మూడు వేళ్లను ఉపయోగించి పైకి స్వైప్ చేసి, హోల్డ్ చేయండి"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"అన్ని యాప్లను చూడండి"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"మీ కీబోర్డ్లో యాక్షన్ కీని నొక్కండి"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"చక్కగా చేశారు!"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index cd111fd54d02..3ee58e818c94 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"ดาวเทียม, การเชื่อมต่อดี"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"ดาวเทียม, การเชื่อมต่อที่พร้อมใช้งาน"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"SOS ดาวเทียม"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"โทรฉุกเฉินหรือ SOS เท่านั้น"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ไม่มีสัญญาณ"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"1 ขีด"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"กลับ"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"การแจ้งเตือน"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"แป้นพิมพ์ลัด"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"สลับรูปแบบแป้นพิมพ์"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"หรือ"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ล้างคำค้นหา"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"แป้นพิมพ์ลัด"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"ปรับแต่งแป้นพิมพ์ลัด"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"นำแป้นพิมพ์ลัดออกใช่ไหม"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"รีเซ็ตกลับเป็นค่าเริ่มต้นไหม"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"กดแป้นเพื่อกำหนดแป้นพิมพ์ลัด"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"การดำเนินการนี้จะลบแป้นพิมพ์ลัดที่กำหนดเองอย่างถาวร"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"การดำเนินการนี้จะลบแป้นพิมพ์ลัดที่กำหนดเองทั้งหมดอย่างถาวร"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"ค้นหาแป้นพิมพ์ลัด"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ใช่ รีเซ็ต"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ยกเลิก"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"กดแป้น"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"มีการใช้แป้นที่กดร่วมกันนี้แล้ว โปรดลองใช้แป้นอื่น"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"ตั้งค่าแป้นพิมพ์ลัดไม่ได้"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"เพิ่มทางลัด"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"ย้อนกลับ"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ไปที่หน้าแรก"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ดูแอปล่าสุด"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"เสร็จสิ้น"</string> <string name="gesture_error_title" msgid="469064941635578511">"ลองอีกครั้งนะ"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ย้อนกลับ"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"เยี่ยมมาก"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"คุณทำท่าทางสัมผัสเพื่อดูแอปล่าสุดสำเร็จแล้ว"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"หากต้องการดูแอปล่าสุด ให้ใช้ 3 นิ้วปัดขึ้นแล้วค้างไว้บนทัชแพด"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"ดูแอปทั้งหมด"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"กดปุ่มดำเนินการบนแป้นพิมพ์"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"ยอดเยี่ยม"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 3c5448e20664..771a9e28c21e 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Satellite, malakas ang koneksyon"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Satellite, may koneksyon"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Satellite SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Mga emergency na tawag o SOS lang"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"walang signal"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"isang bar"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Bumalik"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Mga Notification"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Mga Keyboard Shortcut"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Magpalit ng layout ng keyboard"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"o"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"I-clear ang query sa paghahanap"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Mga Keyboard Shortcut"</string> @@ -1440,7 +1438,7 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"I-customize ang mga shortcut"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Alisin ang shortcut?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"I-reset pabalik sa default?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Pindutin ang key para magtalaga ng shortcut"</string> + <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Para gawin ang shortcut na ito, pindutin nang magkasabay ang Action key at isa o higit pang key"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Permanente nitong ide-delete ang iyong custom na shortcut."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Permanente nitong ide-delete ang lahat ng iyong custom na shortcut."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Mga shortcut ng paghahanap"</string> @@ -1462,7 +1460,7 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Oo, i-reset"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Kanselahin"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Pindutin ang key"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Ginagamit na ang kumbinasyon ng key. Sumubok ng ibang key."</string> + <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="3325858369539848162">"Ginagamit na ang kumbinasyon ng key. Sumubok ng ibang kumbinasyon."</string> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Hindi maitakda ang shortcut."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Maglagay ng shortcut"</string> @@ -1476,6 +1474,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Bumalik"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Pumunta sa home"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Tingnan ang mga kamakailang app"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Tapos na"</string> <string name="gesture_error_title" msgid="469064941635578511">"Subukan ulit!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Bumalik"</string> @@ -1493,6 +1493,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Magaling!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Nakumpleto mo ang galaw sa pag-view ng mga kamakailang app."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Para tingnan ang mga kamakailang app, mag-swipe pataas at i-hold gamit ang tatlong daliri sa iyong touchpad"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Tingnan ang lahat ng app"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Pindutin ang action key sa iyong keyboard"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Magaling!"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 61ed4e54209b..f18c5535611f 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Uydu, bağlantı güçlü"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Uydu, bağlantı mevcut"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Acil Uydu Bağlantısı"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Yalnızca acil durum aramaları veya acil yardım"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"sinyal yok"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"tek çubuk"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Geri"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirimler"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klavye Kısayolları"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klavye düzenini değiştir"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"veya"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Arama sorgusunu temizle"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Klavye Kısayolları"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Kısayolları özelleştirin"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Kısayol kaldırılsın mı?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Varsayılan kısayollara sıfırlansın mı?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Kısayol atamak için tuşa basın"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Bu işlem, özel kısayolunuzu kalıcı olarak siler."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Bu işlem, tüm özel kısayollarınızı kalıcı olarak siler."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Kısayollarda ara"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sıfırla"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"İptal"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tuşa basın"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tuş kombinasyonu zaten kullanılıyor. Başka bir tuş deneyin."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Kısayol ayarlanamıyor."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Kısayol ekle"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Geri dön"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ana sayfaya git"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Son uygulamaları görüntüle"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Bitti"</string> <string name="gesture_error_title" msgid="469064941635578511">"Tekrar deneyin."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Geri dön"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Tebrikler!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Son uygulamaları görüntüleme hareketini tamamladınız."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Son kullanılan uygulamaları görüntülemek için dokunmatik alanda üç parmağınızla yukarı kaydırıp basılı tutun"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Tüm uygulamaları göster"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Klavyenizde eylem tuşuna basın"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Tebrikler!"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 778b25bf4651..e7e145f339c0 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Хороше з’єднання із супутником"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Доступне з’єднання із супутником"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Супутниковий сигнал SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Лише екстрені виклики або сигнал SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"немає сигналу"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"одна смужка сигналу"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Назад"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Сповіщення"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Комбінації клавіш"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Змінити розкладку клавіатури"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"або"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Очистити пошуковий запит"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Комбінації клавіш"</string> @@ -1290,7 +1288,7 @@ <string name="accessibility_enter_hint" msgid="2617864063504824834">"відкрити пристрій"</string> <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Щоб відкрити, використайте відбиток пальця"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Пройдіть автентифікацію. Для цього торкніться сканера відбитків пальців."</string> - <string name="ongoing_call_content_description" msgid="6394763878322348560">"Поточний виклик"</string> + <string name="ongoing_call_content_description" msgid="6394763878322348560">"Поточний дзвінок"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобільний трафік"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Підключено"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Тимчасово з’єднано"</string> @@ -1437,11 +1435,11 @@ <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"Поточний додаток"</string> <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"Доступність"</string> <string name="shortcut_helper_title" msgid="8567500639300970049">"Комбінації клавіш"</string> - <!-- no translation found for shortcut_helper_customize_mode_title (8327297960035006036) --> - <skip /> + <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Налаштуйте комбінації клавіш"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Видалити комбінацію клавіш?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Відновити комбінації клавіш за умовчанням?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Натисніть клавішу, щоб призначити комбінацію клавіш"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Вашу власну комбінацію клавіш буде видалено назавжди."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Усі ваші власні комбінації клавіш буде видалено назавжди."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Пошук комбінацій клавіш"</string> @@ -1463,13 +1461,12 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Так, відновити"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Скасувати"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Натисніть клавішу"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Комбінація клавіш уже використовується. Спробуйте іншу клавішу."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Не вдалося встановити комбінацію клавіш."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> - <!-- no translation found for shortcut_helper_add_shortcut_button_label (7655779534665954910) --> - <skip /> - <!-- no translation found for shortcut_helper_delete_shortcut_button_label (3148773472696137052) --> - <skip /> + <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Додати комбінацію клавіш"</string> + <string name="shortcut_helper_delete_shortcut_button_label" msgid="3148773472696137052">"Видалити комбінацію клавіш"</string> <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Навігація за допомогою клавіатури"</string> <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Дізнайтеся більше про комбінації клавіш"</string> <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Навігація за допомогою сенсорної панелі"</string> @@ -1479,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Назад"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Перейти на головний екран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Переглянути нещодавні додатки"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> <string name="gesture_error_title" msgid="469064941635578511">"Спробуйте ще"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> @@ -1496,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Чудово!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ви виконали жест для перегляду нещодавно відкритих додатків."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Щоб переглянути останні додатки, проведіть трьома пальцями вгору й утримуйте їх на сенсорній панелі"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Переглянути всі додатки"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Натисніть клавішу дії на клавіатурі"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Чудово!"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 2f3e6f4bcfe8..344c3911c144 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"سیٹلائٹ، کنکشن اچھا ہے"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"سیٹلائٹ، کنکشن دستیاب ہے"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"سیٹلائٹ SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"صرف ایمرجنسی کالز یا SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>، <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>۔"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"کوئی سگنل نہیں"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ایک بار"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"پیچھے"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"اطلاعات"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"کی بورڈ شارٹ کٹس"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"کی بورڈ لے آؤٹ سوئچ کریں"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"یا"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"تلاش کا استفسار صاف کریں"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"کی بورڈ شارٹ کٹس"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"شارٹ کٹس کو حسب ضرورت بنائیں"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"شارٹ کٹ ہٹائیں؟"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"ڈیفالٹ پر واپس ری سیٹ کریں؟"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"شارٹ کٹ تفویض کرنے کے لیے کلید کو دبائیں"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"اس سے آپ کا حسب ضرورت شارٹ کٹ مستقل طور پر حذف ہو جائے گا۔"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"اس سے آپ کے تمام حسب ضرورت شارٹ کٹس مستقل طور پر حذف ہو جائیں گے۔"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"تلاش کے شارٹ کٹس"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"ہاں، ری سیٹ کریں"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"منسوخ کریں"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"کلید کو دبائیں"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"کلیدی مجموعہ پہلے سے استعمال میں ہے۔ دوسری کلید آزمائیں۔"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"شارٹ کٹ سیٹ نہیں کیا جا سکتا۔"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"شارٹ کٹ شامل کریں"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"واپس جائیں"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ہوم پر جائیں"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"حالیہ ایپس دیکھیں"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ہو گیا"</string> <string name="gesture_error_title" msgid="469064941635578511">"دوبارہ کوشش کریں!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"واپس جائیں"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"بہترین!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"آپ نے حالیہ ایپس دیکھیں کا اشارہ مکمل کر لیا ہے۔"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"حالیہ ایپس دیکھنے کے لیے، اپنے ٹچ پیڈ پر تین انگلیوں کی مدد سے اوپر کی طرف سوائپ کریں اور دبائے رکھیں"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"سبھی ایپس دیکھیں"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"اپنے کی بورڈ پر ایکشن کلید دبائیں"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"بہت خوب!"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 23137bd9898c..c8f4c182003e 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Sputnik, aloqa sifati yaxshi"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Sputnik, aloqa mavjud"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Sputnik SOS"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Faqat favqulodda chaqiruvlar yoki SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"signal yoʻq"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"bitta ustun"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Orqaga"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirishnomalar"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tezkor tugmalar"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatura terilmasini almashtirish"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"yoki"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Qidiruv soʻrovini tozalash"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Tezkor tugmalar"</string> @@ -1437,11 +1435,11 @@ <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"Joriy ilova"</string> <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"Qulayliklar"</string> <string name="shortcut_helper_title" msgid="8567500639300970049">"Tezkor tugmalar"</string> - <!-- no translation found for shortcut_helper_customize_mode_title (8327297960035006036) --> - <skip /> + <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Yorliqlarni moslash"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Tezkor tugma olib tashlansinmi?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Asliga qaytarilsinmi?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Tezkor tugma sozlash uchun tugmani bosing"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Bunda maxsus tezkor tugma butunlay oʻchirib tashlanadi."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Bunda barcha maxsus yorliqlaringiz butunlay oʻchirib tashlanadi."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Tezkor tugmalar qidiruvi"</string> @@ -1463,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Ha, asliga qaytarilsin"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Bekor qilish"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Tugmani bosing"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Bu tugmalar birikmasi band. Boshqasini ishlating."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Buyruq sozlanmadi."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Yorliq yaratish"</string> @@ -1477,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Orqaga"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Boshiga qaytish"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Oxirgi ilovalarni koʻrish"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Tayyor"</string> <string name="gesture_error_title" msgid="469064941635578511">"Qayta urining!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Orqaga qaytish"</string> @@ -1494,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Barakalla!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Oxirgi ilovalarni koʻrish ishorasini tugalladingiz."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Oxirgi ochilgan ilovalarni koʻrish uchun sensorli panelda uchta barmoq bilan tepega surib, ushlab turing"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Barcha ilovalarni koʻrish"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Klaviaturadagi amal tugmasini bosing"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Barakalla!"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 3b4b132698f3..3b03652a36eb 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Kết nối vệ tinh tốt"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Hiện có kết nối vệ tinh"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Liên lạc khẩn cấp qua vệ tinh"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Chỉ cuộc gọi khẩn cấp hoặc SOS"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"không có tín hiệu"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"1 vạch"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Quay lại"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Thông báo"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Phím tắt"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Chuyển đổi bố cục bàn phím"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"hoặc"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Xoá cụm từ tìm kiếm"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Phím tắt"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Tuỳ chỉnh phím tắt"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Xoá phím tắt?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Đặt lại về phím tắt mặc định?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Nhấn phím để chỉ định phím tắt"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Thao tác này sẽ xoá vĩnh viễn phím tắt tuỳ chỉnh của bạn."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Thao tác này sẽ xoá vĩnh viễn mọi phím tắt tuỳ chỉnh của bạn."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Tìm phím tắt"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Có, đặt lại"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Huỷ"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Nhấn phím"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Tổ hợp phím đã được sử dụng. Hãy thử một phím khác."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Không đặt được lối tắt."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Thêm phím tắt"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Quay lại"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Chuyển đến màn hình chính"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Xem các ứng dụng gần đây"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Xong"</string> <string name="gesture_error_title" msgid="469064941635578511">"Hãy thử lại!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Quay lại"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Tuyệt vời!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Bạn đã hoàn tất cử chỉ xem ứng dụng gần đây."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Để xem các ứng dụng gần đây, hãy dùng 3 ngón tay vuốt lên và giữ trên bàn di chuột"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Xem tất cả các ứng dụng"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Nhấn phím hành động trên bàn phím"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Rất tốt!"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index e66048e8022a..296cf61a7221 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"卫星,连接质量良好"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"卫星,可连接"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"卫星紧急呼救"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"仅限紧急呼叫或紧急求救"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>,<xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>。"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"无信号"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"信号强度为一格"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"返回"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"键盘快捷键"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切换键盘布局"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"或"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"清除搜索查询"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"键盘快捷键"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"自定义快捷方式"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"要移除快捷键吗?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"要重置为默认快捷键吗?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"按下按键即可指定快捷键"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"此操作会永久删除您的自定义快捷键。"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"此操作会永久删除您的所有自定义快捷键。"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"搜索快捷键"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"是,重置"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"取消"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"按下按键"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"按键组合已被使用,请尝试使用其他按键。"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"无法设置快捷方式。"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"添加快捷方式"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"返回"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"前往主屏幕"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近用过的应用"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string> <string name="gesture_error_title" msgid="469064941635578511">"再试一次!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"您已完成“查看最近用过的应用”的手势教程。"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"如需查看最近用过的应用,请用三根手指在触控板上向上滑动并按住"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"查看所有应用"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"按键盘上的快捷操作按键"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"非常棒!"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index f9631f267948..0776af084be2 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"衛星,連線質素好"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"衛星,可以連線"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"緊急衛星連接"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"只限緊急電話或緊急求救"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>,<xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>。"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"無訊號"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"一格"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"返回"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"鍵盤快速鍵"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切換鍵盤配置"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"或"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"清除搜尋查詢"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"鍵盤快速鍵"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"自訂快速鍵"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"要移除快速鍵嗎?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"要重設至預設捷徑嗎?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"按鍵即可指派快速鍵"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"這將永久刪除你的自訂快速鍵。"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"這將永久刪除你的所有自訂捷徑。"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"搜尋快速鍵"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"是,請重設"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"取消"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"按鍵"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"此按鍵組合已在使用,請改用其他按鍵。"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"無法設定快速鍵。"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"新增捷徑"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"返回"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"返回主畫面"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近使用的應用程式"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string> <string name="gesture_error_title" msgid="469064941635578511">"請再試一次!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"做得好!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢的教學課程。"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"如要查看最近使用的應用程式,請用三隻手指在觸控板上向上滑動並按住"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"查看所有應用程式"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"按下鍵盤上的快捷操作鍵"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"做得好!"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 4394dd9a0bd7..bf1f1921eb13 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -759,8 +759,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"衛星,連線品質良好"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"衛星,可連線"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"緊急衛星連線"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"僅限緊急電話或需要求救的情況"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>,<xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>。"</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"沒有訊號"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"訊號強度一格"</string> @@ -857,7 +856,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"返回"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"鍵盤快速鍵"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切換鍵盤配置"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"或"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"清除搜尋查詢"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"鍵盤快速鍵"</string> @@ -1440,7 +1438,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"自訂快速鍵"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"要移除快速鍵嗎?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"要重設為預設值嗎?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"按下按鍵即可指派快速鍵"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"這項操作會永久刪除自訂快速鍵。"</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"這麼做會永久刪除所有快速鍵。"</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"搜尋快速鍵"</string> @@ -1462,7 +1461,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"是,請重設"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"取消"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"按下按鍵"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"按鍵組合重複,請改用其他按鍵。"</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"無法設定捷徑。"</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"新增快速鍵"</string> @@ -1476,6 +1476,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"返回"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"返回主畫面"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近使用的應用程式"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string> <string name="gesture_error_title" msgid="469064941635578511">"請再試一次!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string> @@ -1493,6 +1495,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢教學課程。"</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"如要查看最近使用的應用程式,請在觸控板上用三指向上滑動並按住"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"查看所有應用程式"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"按下鍵盤上的快捷操作鍵"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"非常好!"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index f7f4bcfcdc83..9f8fa879fe86 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -761,8 +761,7 @@ <string name="accessibility_status_bar_satellite_good_connection" msgid="308079391708578704">"Isethelayithi, uxhumano oluhle"</string> <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"Isethelayithi, uxhumano luyatholakala"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"Isethelayithi yokuxhumana ngezimo eziphuthumayo"</string> - <!-- no translation found for satellite_emergency_only_carrier_text (9103913890116841786) --> - <skip /> + <string name="satellite_emergency_only_carrier_text" msgid="9103913890116841786">"Izingcingo eziphuthumayo noma i-SOS kuphela"</string> <string name="accessibility_phone_string_format" msgid="7798841417881811812">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="SIGNAL_STRENGTH_DESCRIPTION">%2$s</xliff:g>."</string> <string name="accessibility_no_signal" msgid="7052827511409250167">"ayikho isignali"</string> <string name="accessibility_one_bar" msgid="5342012847647834506">"ibha eyodwa"</string> @@ -859,7 +858,6 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"Emuva"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Izaziso"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Izinqamulelo Zekhibhodi"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Shintsha isakhiwo sekhibhodi"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"noma"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Sula umbuzo wosesho"</string> <string name="keyboard_shortcut_search_list_title" msgid="4271769465397671138">"Izinqamuleli Zekhibhodi"</string> @@ -1442,7 +1440,8 @@ <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"Qamba ngokwabahlinzekelwayo izinqamuleli"</string> <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"Susa isinqamuleli?"</string> <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"Setha kabusha ubuyele kokuzenzakalelayo?"</string> - <string name="shortcut_customize_mode_add_shortcut_description" msgid="6866025005347407696">"Cindezela ukhiye ukuze unikeze isinqamuleli"</string> + <!-- no translation found for shortcut_customize_mode_add_shortcut_description (7636040209946696120) --> + <skip /> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Lokhu kuzosula isinqamuleli sakho somuntu ngamunye unomphela."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Lokhu kuzosula unomphela zonke izinqamuleli zakho zangokwezifiso."</string> <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Sesha izinqamuleli"</string> @@ -1464,7 +1463,8 @@ <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Yebo, setha kabusha"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Khansela"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"Cindezela ukhiye"</string> - <string name="shortcut_customizer_key_combination_in_use_error_message" msgid="7693234470526626327">"Inhlanganisela yokhiye isiyasetshenziswa kakade. Zama omunye ukhiye."</string> + <!-- no translation found for shortcut_customizer_key_combination_in_use_error_message (3325858369539848162) --> + <skip /> <string name="shortcut_customizer_generic_error_message" msgid="3128454624049722741">"Isinqamuleli asikwazi ukusethwa."</string> <string name="shortcut_helper_plus_symbol" msgid="4534843157353732011">"+"</string> <string name="shortcut_helper_add_shortcut_button_label" msgid="7655779534665954910">"Faka isinqamuleli"</string> @@ -1478,6 +1478,8 @@ <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Iya emuva"</string> <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Iya ekhasini lokuqala"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Buka ama-app akamuva"</string> + <!-- no translation found for touchpad_tutorial_switch_apps_gesture_button (7768255095423767779) --> + <skip /> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Kwenziwe"</string> <string name="gesture_error_title" msgid="469064941635578511">"Zama futhi!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Buyela emuva"</string> @@ -1495,6 +1497,16 @@ <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Umsebenzi omuhle!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Uqedele ukubuka ukuthinta kwama-app akamuva."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Ukuze ubuke ama-app akamuva, swayiphela phezulu futhi ubambe usebenzisa iminwe emithathu kuphedi yakho yokuthinta"</string> + <!-- no translation found for touchpad_switch_apps_gesture_action_title (6835222344612924512) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_guidance (6859830005390732562) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_title (4894947244328032458) --> + <skip /> + <!-- no translation found for touchpad_switch_apps_gesture_success_body (8151089866035126312) --> + <skip /> + <!-- no translation found for touchpad_switch_gesture_error_body (2211950382592343759) --> + <skip /> <string name="tutorial_action_key_title" msgid="8172535792469008169">"Buka wonke ama-app"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"Cindezela inkinobho yokufinyelela kukhibhodi yakho"</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"Wenze kahle!"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index f9904e336f24..8a0ffb90bf09 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -2057,6 +2057,8 @@ <dimen name="dream_overlay_status_bar_ambient_text_shadow_dy">0.5dp</dimen> <dimen name="dream_overlay_status_bar_ambient_text_shadow_radius">3dp</dimen> <dimen name="dream_overlay_icon_inset_dimen">0dp</dimen> + <dimen name="dream_overlay_icon_shadow_radius">1dp</dimen> + <dimen name="dream_overlay_icon_ambient_shadow_radius">2dp</dimen> <!-- Default device corner radius, used for assist UI --> <dimen name="config_rounded_mask_size">0px</dimen> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index c06b0784092c..dc089e707ca3 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -218,6 +218,7 @@ <item type="id" name="accessibility_actions_view" /> <item type="id" name="ambient_indication_container" /> <item type="id" name="aod_notification_icon_container" /> + <item type="id" name="aod_promoted_notification_frame" /> <item type="id" name="burn_in_layer" /> <item type="id" name="burn_in_layer_empty_view" /> <item type="id" name="communal_tutorial_indicator" /> @@ -291,4 +292,5 @@ <item type="id" name="brightness_dialog_slider" /> + <item type="id" name="aod_promoted_notification_view_updater_tag" /> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index c800b0374155..79fa41949b57 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -3779,6 +3779,11 @@ that shows the user which keyboard shortcuts they can use. The "Split screen" shortcuts are for example "Move current app to left split". [CHAR LIMIT=NONE] --> <string name="shortcutHelper_category_split_screen">Split screen</string> + <!-- Title of the keyboard shortcut helper category "Accessibility". This category contains shortcuts + for android accessibility and disability inclusion features such as screen readers, voice control, + switch access, talkback, etc. The helper is a component that shows the user which keyboard + shortcuts they can use. [CHAR LIMIT=NONE] --> + <string name="shortcutHelper_category_accessibility">Accessibility</string> <!-- Title of the keyboard shortcut helper category "Input". The helper is a component that shows the user which keyboard shortcuts they can use. The "Input" shortcuts are the ones provided by the keyboard. Examples are "Access emoji" or "Switch to next language" diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt index 9b852df88604..71b622aa0608 100644 --- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt @@ -61,8 +61,6 @@ import com.android.systemui.plugins.clocks.ClockTickRate import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.plugins.clocks.ZenData import com.android.systemui.plugins.clocks.ZenData.ZenMode -import com.android.systemui.power.domain.interactor.PowerInteractor -import com.android.systemui.power.shared.model.ScreenPowerState import com.android.systemui.res.R as SysuiR import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.settings.UserTracker @@ -108,7 +106,6 @@ constructor( private val zenModeController: ZenModeController, private val zenModeInteractor: ZenModeInteractor, private val userTracker: UserTracker, - private val powerInteractor: PowerInteractor, ) { var loggers = listOf( @@ -380,12 +377,12 @@ constructor( override fun onTimeChanged() { refreshTime() } - } - private fun refreshTime() { - clock?.smallClock?.events?.onTimeTick() - clock?.largeClock?.events?.onTimeTick() - } + private fun refreshTime() { + clock?.smallClock?.events?.onTimeTick() + clock?.largeClock?.events?.onTimeTick() + } + } @VisibleForTesting internal fun listenForDnd(scope: CoroutineScope): Job { @@ -477,7 +474,6 @@ constructor( listenForAnyStateToAodTransition(this) listenForAnyStateToLockscreenTransition(this) listenForAnyStateToDozingTransition(this) - listenForScreenPowerOn(this) } } smallTimeListener?.update(shouldTimeListenerRun) @@ -647,17 +643,6 @@ constructor( } } - @VisibleForTesting - internal fun listenForScreenPowerOn(scope: CoroutineScope): Job { - return scope.launch { - powerInteractor.screenPowerState.collect { powerState -> - if (powerState != ScreenPowerState.SCREEN_OFF) { - refreshTime() - } - } - } - } - class TimeListener(val clockFace: ClockFaceController, val executor: DelayableExecutor) { val predrawListener = ViewTreeObserver.OnPreDrawListener { diff --git a/packages/SystemUI/src/com/android/keyguard/ConnectedDisplayKeyguardPresentation.kt b/packages/SystemUI/src/com/android/keyguard/ConnectedDisplayKeyguardPresentation.kt index 3f332f769c6e..8f6a54c4ae36 100644 --- a/packages/SystemUI/src/com/android/keyguard/ConnectedDisplayKeyguardPresentation.kt +++ b/packages/SystemUI/src/com/android/keyguard/ConnectedDisplayKeyguardPresentation.kt @@ -91,6 +91,10 @@ constructor( super.onCreate(savedInstanceState) onCreateV2() + val window = window ?: return + val layoutParams = window.attributes + layoutParams.flags = layoutParams.flags or WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER + window.attributes = layoutParams } fun onCreateV2() { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 8cfb4c5592aa..ff7b2b025539 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -1242,7 +1242,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard public void reinflateViewFlipper( KeyguardSecurityViewFlipperController.OnViewInflatedCallback onViewInflatedListener) { mSecurityViewFlipperController.clearViews(); - mSecurityViewFlipperController.asynchronouslyInflateView(mCurrentSecurityMode, + mSecurityViewFlipperController.getSecurityView(mCurrentSecurityMode, mKeyguardSecurityCallback, (controller) -> { mView.updateSecurityViewFlipper(); onViewInflatedListener.onViewInflated(controller); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java index 120045fc058b..641cac51785f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java @@ -23,7 +23,6 @@ import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE; import android.util.Log; import android.view.LayoutInflater; -import androidx.annotation.Nullable; import androidx.asynclayoutinflater.view.AsyncLayoutInflater; import com.android.internal.annotations.VisibleForTesting; @@ -35,7 +34,9 @@ import com.android.systemui.res.R; import com.android.systemui.util.ViewController; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.inject.Inject; @@ -56,6 +57,8 @@ public class KeyguardSecurityViewFlipperController private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory; private final Factory mKeyguardSecurityViewControllerFactory; private final FeatureFlags mFeatureFlags; + private final List<OnViewInflatedCallback> mOnViewInflatedListeners = new ArrayList<>(); + private final Set<SecurityMode> mSecurityModeInProgress = new HashSet<>(); @Inject protected KeyguardSecurityViewFlipperController(KeyguardSecurityViewFlipper view, @@ -106,7 +109,13 @@ public class KeyguardSecurityViewFlipperController } } - asynchronouslyInflateView(securityMode, keyguardSecurityCallback, onViewInflatedCallback); + // Prevent multiple inflations for the same security mode. Instead, add callback to a list + // and then notify each in order when the view is inflated. + mOnViewInflatedListeners.add(onViewInflatedCallback); + if (!mSecurityModeInProgress.contains(securityMode)) { + mSecurityModeInProgress.add(securityMode); + asynchronouslyInflateView(securityMode, keyguardSecurityCallback); + } } /** @@ -117,9 +126,8 @@ public class KeyguardSecurityViewFlipperController * @param securityMode * @param keyguardSecurityCallback */ - public void asynchronouslyInflateView(SecurityMode securityMode, - KeyguardSecurityCallback keyguardSecurityCallback, - @Nullable OnViewInflatedCallback onViewInflatedListener) { + private void asynchronouslyInflateView(SecurityMode securityMode, + KeyguardSecurityCallback keyguardSecurityCallback) { int layoutId = mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE) ? getLayoutIdFor(securityMode) : getLegacyLayoutIdFor(securityMode); if (layoutId != 0) { @@ -129,24 +137,26 @@ public class KeyguardSecurityViewFlipperController mAsyncLayoutInflater.inflate(layoutId, mView, (view, resId, parent) -> { mView.addView(view); + mSecurityModeInProgress.remove(securityMode); KeyguardInputViewController<KeyguardInputView> childController = mKeyguardSecurityViewControllerFactory.create( (KeyguardInputView) view, securityMode, keyguardSecurityCallback); childController.init(); mChildren.add(childController); - if (onViewInflatedListener != null) { - onViewInflatedListener.onViewInflated(childController); - // Single bouncer constrains are default - if (mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)) { - boolean useSplitBouncer = - getResources().getBoolean(R.bool.update_bouncer_constraints) - && getResources().getConfiguration().orientation - == ORIENTATION_LANDSCAPE; + for (OnViewInflatedCallback callback : mOnViewInflatedListeners) { + callback.onViewInflated(childController); + } + mOnViewInflatedListeners.clear(); - updateConstraints(useSplitBouncer); - } + // Single bouncer constrains are default + if (mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)) { + boolean useSplitBouncer = + getResources().getBoolean(R.bool.update_bouncer_constraints) + && getResources().getConfiguration().orientation + == ORIENTATION_LANDSCAPE; + updateConstraints(useSplitBouncer); } }); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 61038ef1a72d..101fcdfce7e5 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -3332,6 +3332,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } } + /** Triggers an out of band time update */ + public void triggerTimeUpdate() { + mHandler.sendEmptyMessage(MSG_TIME_UPDATE); + } + /** * Handle {@link #MSG_TIME_UPDATE} */ diff --git a/packages/SystemUI/src/com/android/systemui/ambient/statusbar/ui/AmbientStatusBarView.java b/packages/SystemUI/src/com/android/systemui/ambient/statusbar/ui/AmbientStatusBarView.java index 081d2a087b07..b7b31566a5e9 100644 --- a/packages/SystemUI/src/com/android/systemui/ambient/statusbar/ui/AmbientStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/ambient/statusbar/ui/AmbientStatusBarView.java @@ -75,8 +75,8 @@ public class AmbientStatusBarView extends ConstraintLayout { private ShadowInfo mAmbientShadowInfo; private int mDrawableSize; private int mDrawableInsetSize; - private static final float KEY_SHADOW_ALPHA = 0.8f; - private static final float AMBIENT_SHADOW_ALPHA = 0.6f; + private static final float KEY_SHADOW_ALPHA = 0.9f; + private static final float AMBIENT_SHADOW_ALPHA = 0.7f; public AmbientStatusBarView(Context context) { this(context, null); @@ -102,14 +102,14 @@ public class AmbientStatusBarView extends ConstraintLayout { super.onFinishInflate(); mKeyShadowInfo = createShadowInfo( - R.dimen.dream_overlay_status_bar_key_text_shadow_radius, + R.dimen.dream_overlay_icon_shadow_radius, R.dimen.dream_overlay_status_bar_key_text_shadow_dx, R.dimen.dream_overlay_status_bar_key_text_shadow_dy, KEY_SHADOW_ALPHA ); mAmbientShadowInfo = createShadowInfo( - R.dimen.dream_overlay_status_bar_ambient_text_shadow_radius, + R.dimen.dream_overlay_icon_ambient_shadow_radius, R.dimen.dream_overlay_status_bar_ambient_text_shadow_dx, R.dimen.dream_overlay_status_bar_ambient_text_shadow_dy, AMBIENT_SHADOW_ALPHA diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt index 7fcdd9596049..5671fa49c716 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt @@ -19,15 +19,16 @@ package com.android.systemui.common.ui.data.repository import android.content.Context import android.content.res.Configuration +import android.view.Display import android.view.DisplayInfo import androidx.annotation.DimenRes import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging -import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.wrapper.DisplayUtilsWrapper +import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import dagger.Binds import dagger.Module import dagger.Provides @@ -57,7 +58,7 @@ interface ConfigurationRepository { val configurationValues: Flow<Configuration> /** Emits the latest display this configuration controller has been moved to. */ - val onMovedToDisplay: Flow<Int> + val onMovedToDisplay: StateFlow<Int> fun getResolutionScale(): Float @@ -121,20 +122,21 @@ constructor( configurationController.addCallback(callback) awaitClose { configurationController.removeCallback(callback) } } - override val onMovedToDisplay: Flow<Int> - get() = conflatedCallbackFlow { - val callback = - object : ConfigurationController.ConfigurationListener { - override fun onMovedToDisplay( - newDisplayId: Int, - newConfiguration: Configuration?, - ) { - trySend(newDisplayId) + override val onMovedToDisplay: StateFlow<Int> = + conflatedCallbackFlow { + val callback = + object : ConfigurationController.ConfigurationListener { + override fun onMovedToDisplay( + newDisplayId: Int, + newConfiguration: Configuration?, + ) { + trySend(newDisplayId) + } } - } - configurationController.addCallback(callback) - awaitClose { configurationController.removeCallback(callback) } - } + configurationController.addCallback(callback) + awaitClose { configurationController.removeCallback(callback) } + } + .stateIn(scope, SharingStarted.Eagerly, Display.DEFAULT_DISPLAY) override val scaleForResolution: StateFlow<Float> = onConfigurationChange diff --git a/packages/SystemUI/src/com/android/systemui/communal/DevicePosturingCommandListener.kt b/packages/SystemUI/src/com/android/systemui/communal/DevicePosturingCommandListener.kt deleted file mode 100644 index c7b7050340a0..000000000000 --- a/packages/SystemUI/src/com/android/systemui/communal/DevicePosturingCommandListener.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.communal - -import android.annotation.SuppressLint -import android.app.DreamManager -import com.android.systemui.CoreStartable -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.statusbar.commandline.Command -import com.android.systemui.statusbar.commandline.CommandRegistry -import java.io.PrintWriter -import javax.inject.Inject - -@SysUISingleton -class DevicePosturingCommandListener -@Inject -constructor(private val commandRegistry: CommandRegistry, private val dreamManager: DreamManager) : - CoreStartable { - private val command = DevicePosturingCommand() - - override fun start() { - commandRegistry.registerCommand(COMMAND_ROOT) { command } - } - - internal inner class DevicePosturingCommand : Command { - @SuppressLint("MissingPermission") - override fun execute(pw: PrintWriter, args: List<String>) { - val arg = args.getOrNull(0) - if (arg == null || arg.lowercase() == "help") { - help(pw) - return - } - - when (arg.lowercase()) { - "true" -> dreamManager.setDevicePostured(true) - "false" -> dreamManager.setDevicePostured(false) - else -> { - pw.println("Invalid argument!") - help(pw) - } - } - } - - override fun help(pw: PrintWriter) { - pw.println("Usage: $ adb shell cmd statusbar device-postured <true|false>") - } - } - - private companion object { - const val COMMAND_ROOT = "device-postured" - } -} diff --git a/packages/SystemUI/src/com/android/systemui/communal/DevicePosturingListener.kt b/packages/SystemUI/src/com/android/systemui/communal/DevicePosturingListener.kt new file mode 100644 index 000000000000..47040fa4a572 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/DevicePosturingListener.kt @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal + +import android.annotation.SuppressLint +import android.app.DreamManager +import android.service.dreams.Flags.allowDreamWhenPostured +import com.android.app.tracing.coroutines.launchInTraced +import com.android.systemui.CoreStartable +import com.android.systemui.communal.posturing.domain.interactor.PosturingInteractor +import com.android.systemui.communal.posturing.shared.model.PosturedState +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.log.dagger.CommunalTableLog +import com.android.systemui.log.table.TableLogBuffer +import com.android.systemui.log.table.logDiffsForTable +import com.android.systemui.statusbar.commandline.Command +import com.android.systemui.statusbar.commandline.CommandRegistry +import java.io.PrintWriter +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.onEach + +@SysUISingleton +class DevicePosturingListener +@Inject +constructor( + private val commandRegistry: CommandRegistry, + private val dreamManager: DreamManager, + private val interactor: PosturingInteractor, + @Background private val bgScope: CoroutineScope, + @CommunalTableLog private val tableLogBuffer: TableLogBuffer, +) : CoreStartable { + private val command = DevicePosturingCommand() + + @SuppressLint("MissingPermission") + override fun start() { + if (!allowDreamWhenPostured()) { + return + } + + interactor.postured + .distinctUntilChanged() + .logDiffsForTable( + tableLogBuffer = tableLogBuffer, + columnPrefix = "", + columnName = "postured", + initialValue = false, + ) + .onEach { postured -> dreamManager.setDevicePostured(postured) } + .launchInTraced("$TAG#collectPostured", bgScope) + + commandRegistry.registerCommand(COMMAND_ROOT) { command } + } + + internal inner class DevicePosturingCommand : Command { + @SuppressLint("MissingPermission") + override fun execute(pw: PrintWriter, args: List<String>) { + val arg = args.getOrNull(0) + if (arg == null || arg.lowercase() == "help") { + help(pw) + return + } + + val state = + when (arg.lowercase()) { + "true" -> PosturedState.Postured(confidence = 1f) + "false" -> PosturedState.NotPostured + "clear" -> PosturedState.Unknown + else -> { + pw.println("Invalid argument!") + help(pw) + null + } + } + state?.let { interactor.setValueForDebug(it) } + } + + override fun help(pw: PrintWriter) { + pw.println("Usage: $ adb shell cmd statusbar device-postured <true|false|clear>") + } + } + + private companion object { + const val COMMAND_ROOT = "device-postured" + const val TAG = "DevicePosturingListener" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalStartableModule.kt b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalStartableModule.kt index e3443227685f..7358aa7b3fcd 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalStartableModule.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalStartableModule.kt @@ -22,7 +22,7 @@ import com.android.systemui.communal.CommunalDreamStartable import com.android.systemui.communal.CommunalMetricsStartable import com.android.systemui.communal.CommunalOngoingContentStartable import com.android.systemui.communal.CommunalSceneStartable -import com.android.systemui.communal.DevicePosturingCommandListener +import com.android.systemui.communal.DevicePosturingListener import com.android.systemui.communal.log.CommunalLoggerStartable import com.android.systemui.communal.widgets.CommunalAppWidgetHostStartable import com.android.systemui.dagger.qualifiers.PerUser @@ -71,6 +71,6 @@ interface CommunalStartableModule { @Binds @IntoMap - @ClassKey(DevicePosturingCommandListener::class) - fun bindDevicePosturingCommandListener(impl: DevicePosturingCommandListener): CoreStartable + @ClassKey(DevicePosturingListener::class) + fun bindDevicePosturingistener(impl: DevicePosturingListener): CoreStartable } diff --git a/packages/SystemUI/src/com/android/systemui/communal/posturing/dagger/NoopPosturingModule.kt b/packages/SystemUI/src/com/android/systemui/communal/posturing/dagger/NoopPosturingModule.kt new file mode 100644 index 000000000000..f576a2000e05 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/posturing/dagger/NoopPosturingModule.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.dagger + +import com.android.systemui.communal.posturing.data.repository.NoOpPosturingRepository +import com.android.systemui.communal.posturing.data.repository.PosturingRepository +import dagger.Binds +import dagger.Module + +/** Module providing a reference implementation of the posturing signal. */ +@Module +interface NoopPosturingModule { + /** Binds a reference implementation of the posturing repository */ + @Binds fun bindPosturingRepository(impl: NoOpPosturingRepository): PosturingRepository +} diff --git a/packages/SystemUI/src/com/android/systemui/communal/posturing/data/repository/NoOpPosturingRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/posturing/data/repository/NoOpPosturingRepository.kt new file mode 100644 index 000000000000..c5f357f556ca --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/posturing/data/repository/NoOpPosturingRepository.kt @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.data.repository + +import com.android.systemui.communal.posturing.shared.model.PosturedState +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +@SysUISingleton +class NoOpPosturingRepository @Inject constructor() : PosturingRepository { + override val posturedState: Flow<PosturedState> = + MutableStateFlow(PosturedState.Unknown).asStateFlow() +} diff --git a/packages/SystemUI/src/com/android/systemui/communal/posturing/data/repository/PosturingRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/posturing/data/repository/PosturingRepository.kt new file mode 100644 index 000000000000..dae1a47f5be0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/posturing/data/repository/PosturingRepository.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.data.repository + +import com.android.systemui.communal.posturing.shared.model.PosturedState +import kotlinx.coroutines.flow.Flow + +/** + * Repository which retrieves the postured state of the device. Posturing is defined as the device + * being stationary and upright. + */ +interface PosturingRepository { + /** Whether the device is currently stationary and upright. */ + val posturedState: Flow<PosturedState> +} diff --git a/packages/SystemUI/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractor.kt new file mode 100644 index 000000000000..cd81dea9cad1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractor.kt @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.domain.interactor + +import com.android.systemui.communal.posturing.data.repository.PosturingRepository +import com.android.systemui.communal.posturing.shared.model.PosturedState +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine + +@SysUISingleton +class PosturingInteractor @Inject constructor(repository: PosturingRepository) { + private val debugPostured = MutableStateFlow<PosturedState>(PosturedState.Unknown) + + val postured: Flow<Boolean> = + combine(repository.posturedState, debugPostured) { postured, debugValue -> + debugValue.asBoolean() ?: postured.asBoolean() ?: false + } + + fun setValueForDebug(value: PosturedState) { + debugPostured.value = value + } +} + +fun PosturedState.asBoolean(): Boolean? { + return when (this) { + is PosturedState.Postured -> true + PosturedState.NotPostured -> false + PosturedState.Unknown -> null + } +} diff --git a/packages/SystemUI/src/com/android/systemui/communal/posturing/shared/model/PosturedState.kt b/packages/SystemUI/src/com/android/systemui/communal/posturing/shared/model/PosturedState.kt new file mode 100644 index 000000000000..431ca67315eb --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/posturing/shared/model/PosturedState.kt @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.shared.model + +sealed interface PosturedState { + /** Represents postured state */ + data class Postured(val confidence: Float) : PosturedState + + /** Represents unknown/uninitialized state */ + data object Unknown : PosturedState + + /** Represents state where we are not postured */ + data object NotPostured : PosturedState +} diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/AllModel.kt b/packages/SystemUI/src/com/android/systemui/controls/management/AllModel.kt index be428a84da2f..9e9e9998a82e 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/AllModel.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/AllModel.kt @@ -25,14 +25,14 @@ import com.android.systemui.controls.controller.ControlInfo * This model is used to show controls separated by zones. * * The model will sort the controls and zones in the following manner: - * * The zones will be sorted in a first seen basis - * * The controls in each zone will be sorted in a first seen basis. + * * The zones will be sorted in a first seen basis + * * The controls in each zone will be sorted in a first seen basis. * - * The controls passed should belong to the same structure, as an instance of this model will be - * created for each structure. + * The controls passed should belong to the same structure, as an instance of this model will be + * created for each structure. * - * The list of favorite ids can contain ids for controls not passed to this model. Those will be - * filtered out. + * The list of favorite ids can contain ids for controls not passed to this model. Those will be + * filtered out. * * @property controls List of controls as returned by loading * @property initialFavoriteIds sorted ids of favorite controls. @@ -43,7 +43,7 @@ class AllModel( private val controls: List<ControlStatus>, initialFavoriteIds: List<String>, private val emptyZoneString: CharSequence, - private val controlsModelCallback: ControlsModel.ControlsModelCallback + private val controlsModelCallback: ControlsModel.ControlsModelCallback, ) : ControlsModel { private var modified = false @@ -51,12 +51,11 @@ class AllModel( override val moveHelper = null override val favorites: List<ControlInfo> - get() = favoriteIds.mapNotNull { id -> - val control = controls.firstOrNull { it.control.controlId == id }?.control - control?.let { - ControlInfo.fromControl(it) + get() = + favoriteIds.mapNotNull { id -> + val control = controls.firstOrNull { it.control.controlId == id }?.control + control?.let { ControlInfo.fromControl(it) } } - } private val favoriteIds = run { val ids = controls.mapTo(HashSet()) { it.control.controlId } @@ -66,15 +65,17 @@ class AllModel( override val elements: List<ElementWrapper> = createWrappers(controls) override fun changeFavoriteStatus(controlId: String, favorite: Boolean) { - val toChange = elements.firstOrNull { - it is ControlStatusWrapper && it.controlStatus.control.controlId == controlId - } as ControlStatusWrapper? + val toChange = + elements.firstOrNull { + it is ControlStatusWrapper && it.controlStatus.control.controlId == controlId + } as ControlStatusWrapper? if (favorite == toChange?.controlStatus?.favorite) return - val changed: Boolean = if (favorite) { - favoriteIds.add(controlId) - } else { - favoriteIds.remove(controlId) - } + val changed: Boolean = + if (favorite) { + favoriteIds.add(controlId) + } else { + favoriteIds.remove(controlId) + } if (changed) { if (!modified) { modified = true @@ -82,15 +83,14 @@ class AllModel( } controlsModelCallback.onChange() } - toChange?.let { - it.controlStatus.favorite = favorite - } + toChange?.let { it.controlStatus.favorite = favorite } } private fun createWrappers(list: List<ControlStatus>): List<ElementWrapper> { - val map = list.groupByTo(OrderedMap(ArrayMap<CharSequence, MutableList<ControlStatus>>())) { - it.control.zone ?: "" - } + val map = + list.groupByTo(OrderedMap(ArrayMap<CharSequence, MutableList<ControlStatus>>())) { + it.control.zone ?: "" + } val output = mutableListOf<ElementWrapper>() var emptyZoneValues: Sequence<ControlStatusWrapper>? = null for (zoneName in map.orderedKeys) { diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt index f034851e5d80..3ea415675bdf 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt @@ -36,10 +36,11 @@ import androidx.core.view.AccessibilityDelegateCompat import androidx.core.view.ViewCompat import androidx.core.view.accessibility.AccessibilityNodeInfoCompat import androidx.recyclerview.widget.RecyclerView -import com.android.systemui.res.R import com.android.systemui.controls.ControlInterface import com.android.systemui.controls.ui.CanUseIconPredicate import com.android.systemui.controls.ui.RenderInfo +import com.android.systemui.res.R +import com.android.systemui.utils.SafeIconLoader private typealias ModelFavoriteChanger = (String, Boolean) -> Unit @@ -54,6 +55,7 @@ private typealias ModelFavoriteChanger = (String, Boolean) -> Unit class ControlAdapter( private val elevation: Float, private val currentUserId: Int, + private val safeIconLoader: SafeIconLoader, ) : RecyclerView.Adapter<Holder>() { companion object { @@ -62,15 +64,14 @@ class ControlAdapter( const val TYPE_DIVIDER = 2 /** - * For low-dp width screens that also employ an increased font scale, adjust the - * number of columns. This helps prevent text truncation on these devices. - * + * For low-dp width screens that also employ an increased font scale, adjust the number of + * columns. This helps prevent text truncation on these devices. */ @JvmStatic fun findMaxColumns(res: Resources): Int { var maxColumns = res.getInteger(R.integer.controls_max_columns) val maxColumnsAdjustWidth = - res.getInteger(R.integer.controls_max_columns_adjust_below_width_dp) + res.getInteger(R.integer.controls_max_columns_adjust_below_width_dp) val outValue = TypedValue() res.getValue(R.dimen.controls_max_columns_adjust_above_font_scale, outValue, true) @@ -78,10 +79,12 @@ class ControlAdapter( val config = res.configuration val isPortrait = config.orientation == Configuration.ORIENTATION_PORTRAIT - if (isPortrait && + if ( + isPortrait && config.screenWidthDp != Configuration.SCREEN_WIDTH_DP_UNDEFINED && config.screenWidthDp <= maxColumnsAdjustWidth && - config.fontScale >= maxColumnsAdjustFontScale) { + config.fontScale >= maxColumnsAdjustFontScale + ) { maxColumns-- } @@ -106,11 +109,12 @@ class ControlAdapter( rightMargin = 0 } elevation = this@ControlAdapter.elevation - background = parent.context.getDrawable( - R.drawable.control_background_ripple) + background = + parent.context.getDrawable(R.drawable.control_background_ripple) }, currentUserId, model?.moveHelper, // Indicates that position information is needed + safeIconLoader, ) { id, favorite -> model?.changeFavoriteStatus(id, favorite) } @@ -119,8 +123,13 @@ class ControlAdapter( ZoneHolder(layoutInflater.inflate(R.layout.controls_zone_header, parent, false)) } TYPE_DIVIDER -> { - DividerHolder(layoutInflater.inflate( - R.layout.controls_horizontal_divider_with_empty, parent, false)) + DividerHolder( + layoutInflater.inflate( + R.layout.controls_horizontal_divider_with_empty, + parent, + false, + ) + ) } else -> throw IllegalStateException("Wrong viewType: $viewType") } @@ -134,9 +143,7 @@ class ControlAdapter( override fun getItemCount() = model?.elements?.size ?: 0 override fun onBindViewHolder(holder: Holder, index: Int) { - model?.let { - holder.bindData(it.elements[index]) - } + model?.let { holder.bindData(it.elements[index]) } } override fun onBindViewHolder(holder: Holder, position: Int, payloads: MutableList<Any>) { @@ -166,13 +173,12 @@ class ControlAdapter( /** * Holder for binding views in the [RecyclerView]- + * * @param view the [View] for this [Holder] */ sealed class Holder(view: View) : RecyclerView.ViewHolder(view) { - /** - * Bind the data from the model into the view - */ + /** Bind the data from the model into the view */ abstract fun bindData(wrapper: ElementWrapper) open fun updateFavorite(favorite: Boolean) {} @@ -181,12 +187,13 @@ sealed class Holder(view: View) : RecyclerView.ViewHolder(view) { /** * Holder for using with [DividerWrapper] to display a divider between zones. * - * The divider can be shown or hidden. It also has a view the height of a control, that can - * be toggled visible or gone. + * The divider can be shown or hidden. It also has a view the height of a control, that can be + * toggled visible or gone. */ private class DividerHolder(view: View) : Holder(view) { private val frame: View = itemView.requireViewById(R.id.frame) private val divider: View = itemView.requireViewById(R.id.divider) + override fun bindData(wrapper: ElementWrapper) { wrapper as DividerWrapper frame.visibility = if (wrapper.showNone) View.VISIBLE else View.GONE @@ -194,9 +201,7 @@ private class DividerHolder(view: View) : Holder(view) { } } -/** - * Holder for using with [ZoneNameWrapper] to display names of zones. - */ +/** Holder for using with [ZoneNameWrapper] to display names of zones. */ private class ZoneHolder(view: View) : Holder(view) { private val zone: TextView = itemView as TextView @@ -208,15 +213,17 @@ private class ZoneHolder(view: View) : Holder(view) { /** * Holder for using with [ControlStatusWrapper] to display names of zones. + * * @param moveHelper a helper interface to facilitate a11y rearranging. Null indicates no - * rearranging - * @param favoriteCallback this callback will be called whenever the favorite state of the - * [Control] this view represents changes. + * rearranging + * @param favoriteCallback this callback will be called whenever the favorite state of the [Control] + * this view represents changes. */ internal class ControlHolder( view: View, currentUserId: Int, val moveHelper: ControlsModel.MoveHelper?, + val safeIconLoader: SafeIconLoader, val favoriteCallback: ModelFavoriteChanger, ) : Holder(view) { private val favoriteStateDescription = @@ -228,16 +235,16 @@ internal class ControlHolder( private val title: TextView = itemView.requireViewById(R.id.title) private val subtitle: TextView = itemView.requireViewById(R.id.subtitle) private val removed: TextView = itemView.requireViewById(R.id.status) - private val favorite: CheckBox = itemView.requireViewById<CheckBox>(R.id.favorite).apply { - visibility = View.VISIBLE - } + private val favorite: CheckBox = + itemView.requireViewById<CheckBox>(R.id.favorite).apply { visibility = View.VISIBLE } private val canUseIconPredicate = CanUseIconPredicate(currentUserId) - private val accessibilityDelegate = ControlHolderAccessibilityDelegate( - this::stateDescription, - this::getLayoutPosition, - moveHelper - ) + private val accessibilityDelegate = + ControlHolderAccessibilityDelegate( + this::stateDescription, + this::getLayoutPosition, + moveHelper, + ) init { ViewCompat.setAccessibilityDelegate(itemView, accessibilityDelegate) @@ -252,7 +259,9 @@ internal class ControlHolder( } else { val position = layoutPosition + 1 return itemView.context.getString( - R.string.accessibility_control_favorite_position, position) + R.string.accessibility_control_favorite_position, + position, + ) } } @@ -262,11 +271,12 @@ internal class ControlHolder( title.text = wrapper.title subtitle.text = wrapper.subtitle updateFavorite(wrapper.favorite) - removed.text = if (wrapper.removed) { - itemView.context.getText(R.string.controls_removed) - } else { - "" - } + removed.text = + if (wrapper.removed) { + itemView.context.getText(R.string.controls_removed) + } else { + "" + } itemView.setOnClickListener { updateFavorite(!favorite.isChecked) favoriteCallback(wrapper.controlId, favorite.isChecked) @@ -282,7 +292,7 @@ internal class ControlHolder( private fun getRenderInfo( component: ComponentName, - @DeviceTypes.DeviceType deviceType: Int + @DeviceTypes.DeviceType deviceType: Int, ): RenderInfo { return RenderInfo.lookup(itemView.context, component, deviceType) } @@ -292,18 +302,19 @@ internal class ControlHolder( val fg = context.getResources().getColorStateList(ri.foreground, context.getTheme()) icon.imageTintList = null - ci.customIcon - ?.takeIf(canUseIconPredicate) - ?.let { - icon.setImageIcon(it) - } ?: run { - icon.setImageDrawable(ri.icon) - - // Do not color app icons - if (ci.deviceType != DeviceTypes.TYPE_ROUTINE) { - icon.setImageTintList(fg) - } + ci.customIcon?.takeIf(canUseIconPredicate)?.let { + val drawable = safeIconLoader.load(it) + icon.setImageDrawable(drawable) + drawable } + ?: run { + icon.setImageDrawable(ri.icon) + + // Do not color app icons + if (ci.deviceType != DeviceTypes.TYPE_ROUTINE) { + icon.setImageTintList(fg) + } + } } } @@ -317,14 +328,13 @@ internal class ControlHolder( * * @param stateRetriever function to determine the state description based on the favorite state * @param positionRetriever function to obtain the position of this control. It only has to be - * correct in controls that are currently favorites (and therefore can - * be moved). + * correct in controls that are currently favorites (and therefore can be moved). * @param moveHelper helper interface to determine if a control can be moved and actually move it. */ private class ControlHolderAccessibilityDelegate( val stateRetriever: (Boolean) -> CharSequence?, val positionRetriever: () -> Int, - val moveHelper: ControlsModel.MoveHelper? + val moveHelper: ControlsModel.MoveHelper?, ) : AccessibilityDelegateCompat() { var isFavorite = false @@ -369,25 +379,29 @@ private class ControlHolderAccessibilityDelegate( private fun addClickAction(host: View, info: AccessibilityNodeInfoCompat) { // Change the text for the double-tap action - val clickActionString = if (isFavorite) { - host.context.getString(R.string.accessibility_control_change_unfavorite) - } else { - host.context.getString(R.string.accessibility_control_change_favorite) - } - val click = AccessibilityNodeInfoCompat.AccessibilityActionCompat( - AccessibilityNodeInfo.ACTION_CLICK, - // “favorite/unfavorite” - clickActionString) + val clickActionString = + if (isFavorite) { + host.context.getString(R.string.accessibility_control_change_unfavorite) + } else { + host.context.getString(R.string.accessibility_control_change_favorite) + } + val click = + AccessibilityNodeInfoCompat.AccessibilityActionCompat( + AccessibilityNodeInfo.ACTION_CLICK, + // “favorite/unfavorite” + clickActionString, + ) info.addAction(click) } private fun maybeAddMoveBeforeAction(host: View, info: AccessibilityNodeInfoCompat) { if (moveHelper?.canMoveBefore(positionRetriever()) ?: false) { val newPosition = positionRetriever() + 1 - 1 - val moveBefore = AccessibilityNodeInfoCompat.AccessibilityActionCompat( - MOVE_BEFORE_ID, - host.context.getString(R.string.accessibility_control_move, newPosition) - ) + val moveBefore = + AccessibilityNodeInfoCompat.AccessibilityActionCompat( + MOVE_BEFORE_ID, + host.context.getString(R.string.accessibility_control_move, newPosition), + ) info.addAction(moveBefore) info.isContextClickable = true } @@ -396,26 +410,25 @@ private class ControlHolderAccessibilityDelegate( private fun maybeAddMoveAfterAction(host: View, info: AccessibilityNodeInfoCompat) { if (moveHelper?.canMoveAfter(positionRetriever()) ?: false) { val newPosition = positionRetriever() + 1 + 1 - val moveAfter = AccessibilityNodeInfoCompat.AccessibilityActionCompat( - MOVE_AFTER_ID, - host.context.getString(R.string.accessibility_control_move, newPosition) - ) + val moveAfter = + AccessibilityNodeInfoCompat.AccessibilityActionCompat( + MOVE_AFTER_ID, + host.context.getString(R.string.accessibility_control_move, newPosition), + ) info.addAction(moveAfter) info.isContextClickable = true } } } -class MarginItemDecorator( - private val topMargin: Int, - private val sideMargins: Int -) : RecyclerView.ItemDecoration() { +class MarginItemDecorator(private val topMargin: Int, private val sideMargins: Int) : + RecyclerView.ItemDecoration() { override fun getItemOffsets( outRect: Rect, view: View, parent: RecyclerView, - state: RecyclerView.State + state: RecyclerView.State, ) { val position = parent.getChildAdapterPosition(view) if (position == RecyclerView.NO_POSITION) return diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt index 740e011b3d20..e4913cb59768 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt @@ -22,6 +22,7 @@ import android.content.ComponentName import android.content.Context import android.content.Intent import android.os.Bundle +import android.os.Process import android.util.Log import android.view.View import android.view.ViewGroup @@ -42,6 +43,7 @@ import com.android.systemui.controls.ui.ControlsActivity import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.res.R import com.android.systemui.settings.UserTracker +import com.android.systemui.utils.SafeIconLoader import java.util.concurrent.Executor import javax.inject.Inject @@ -53,6 +55,8 @@ constructor( private val controller: ControlsControllerImpl, private val userTracker: UserTracker, private val customIconCache: CustomIconCache, + private val controlsListingController: ControlsListingController, + private val safeIconLoaderFactory: SafeIconLoader.Factory, ) : ComponentActivity(), ControlsManagementActivity { companion object { @@ -258,8 +262,18 @@ constructor( val elevation = resources.getFloat(R.dimen.control_card_elevation) val recyclerView = requireViewById<RecyclerView>(R.id.list) recyclerView.alpha = 0.0f + val uid = + controlsListingController + .getCurrentServices() + .firstOrNull { it.componentName == component } + ?.serviceInfo + ?.applicationInfo + ?.uid ?: Process.INVALID_UID + val packageName = component.packageName + val safeIconLoader = safeIconLoaderFactory.create(uid, packageName, userTracker.userId) + val adapter = - ControlAdapter(elevation, userTracker.userId).apply { + ControlAdapter(elevation, userTracker.userId, safeIconLoader).apply { registerAdapterDataObserver( object : RecyclerView.AdapterDataObserver() { var hasAnimated = false diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt index ab55c5326b55..80c9d0bb8858 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt @@ -25,6 +25,7 @@ import android.content.Context import android.content.Intent import android.content.res.Configuration import android.os.Bundle +import android.os.Process.INVALID_UID import android.text.TextUtils import android.util.Log import android.view.Gravity @@ -47,6 +48,7 @@ import com.android.systemui.controls.ui.ControlsActivity import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.res.R import com.android.systemui.settings.UserTracker +import com.android.systemui.utils.SafeIconLoader import java.text.Collator import java.util.concurrent.Executor import javax.inject.Inject @@ -57,6 +59,8 @@ constructor( @Main private val executor: Executor, private val controller: ControlsControllerImpl, private val userTracker: UserTracker, + private val safeIconLoaderFactory: SafeIconLoader.Factory, + private val controlsListingController: ControlsListingController, ) : ComponentActivity(), ControlsManagementActivity { companion object { @@ -196,9 +200,20 @@ constructor( listOfStructures = listOf(listOfStructures[structureIndex]) } + val uid = + controlsListingController + .getCurrentServices() + .firstOrNull { it.componentName == componentName } + ?.serviceInfo + ?.applicationInfo + ?.uid ?: INVALID_UID + val packageName = componentName.packageName + val safeIconLoader = + safeIconLoaderFactory.create(uid, packageName, userTracker.userId) + executor.execute { structurePager.adapter = - StructureAdapter(listOfStructures, userTracker.userId) + StructureAdapter(listOfStructures, userTracker.userId, safeIconLoader) structurePager.setCurrentItem(structureIndex) if (error) { statusText.text = @@ -260,8 +275,18 @@ constructor( private fun setUpPager() { structurePager.alpha = 0.0f pageIndicator.alpha = 0.0f + val uid = + controlsListingController + .getCurrentServices() + .firstOrNull { it.componentName == component } + ?.serviceInfo + ?.applicationInfo + ?.uid ?: INVALID_UID + val packageName = componentName?.packageName ?: "" + val safeIconLoader = safeIconLoaderFactory.create(uid, packageName, userTracker.userId) + structurePager.apply { - adapter = StructureAdapter(emptyList(), userTracker.userId) + adapter = StructureAdapter(emptyList(), userTracker.userId, safeIconLoader) registerOnPageChangeCallback( object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/StructureAdapter.kt b/packages/SystemUI/src/com/android/systemui/controls/management/StructureAdapter.kt index 7e56077dec29..dc6f3c7a514b 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/StructureAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/StructureAdapter.kt @@ -22,10 +22,12 @@ import android.view.ViewGroup import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.android.systemui.res.R +import com.android.systemui.utils.SafeIconLoader class StructureAdapter( private val models: List<StructureContainer>, private val currentUserId: Int, + private val safeIconLoader: SafeIconLoader, ) : RecyclerView.Adapter<StructureAdapter.StructureHolder>() { override fun onCreateViewHolder(parent: ViewGroup, p1: Int): StructureHolder { @@ -33,6 +35,7 @@ class StructureAdapter( return StructureHolder( layoutInflater.inflate(R.layout.controls_structure_page, parent, false), currentUserId, + safeIconLoader, ) } @@ -42,8 +45,8 @@ class StructureAdapter( holder.bind(models[index].model) } - class StructureHolder(view: View, currentUserId: Int) : - RecyclerView.ViewHolder(view) { + class StructureHolder(view: View, currentUserId: Int, safeIconLoader: SafeIconLoader) : + RecyclerView.ViewHolder(view) { private val recyclerView: RecyclerView private val controlAdapter: ControlAdapter @@ -51,7 +54,7 @@ class StructureAdapter( init { recyclerView = itemView.requireViewById<RecyclerView>(R.id.listAll) val elevation = itemView.context.resources.getFloat(R.dimen.control_card_elevation) - controlAdapter = ControlAdapter(elevation, currentUserId) + controlAdapter = ControlAdapter(elevation, currentUserId, safeIconLoader) setUpRecyclerView() } @@ -60,23 +63,29 @@ class StructureAdapter( } private fun setUpRecyclerView() { - val margin = itemView.context.resources - .getDimensionPixelSize(R.dimen.controls_card_margin) + val margin = + itemView.context.resources.getDimensionPixelSize(R.dimen.controls_card_margin) val itemDecorator = MarginItemDecorator(margin, margin) val spanCount = ControlAdapter.findMaxColumns(itemView.resources) recyclerView.apply { this.adapter = controlAdapter - layoutManager = GridLayoutManager(recyclerView.context, spanCount).apply { - spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { - override fun getSpanSize(position: Int): Int { - return if (adapter?.getItemViewType(position) - != ControlAdapter.TYPE_CONTROL) spanCount else 1 - } + layoutManager = + GridLayoutManager(recyclerView.context, spanCount).apply { + spanSizeLookup = + object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if ( + adapter?.getItemViewType(position) != + ControlAdapter.TYPE_CONTROL + ) + spanCount + else 1 + } + } } - } addItemDecoration(itemDecorator) } } } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt index fdb9971a7d63..5e09b7f03822 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -48,12 +48,13 @@ import android.widget.ImageView import android.widget.TextView import androidx.annotation.ColorInt import androidx.annotation.VisibleForTesting -import com.android.internal.graphics.ColorUtils -import com.android.systemui.res.R import com.android.app.animation.Interpolators +import com.android.internal.graphics.ColorUtils import com.android.systemui.controls.ControlsMetricsLogger import com.android.systemui.controls.controller.ControlsController +import com.android.systemui.res.R import com.android.systemui.util.concurrency.DelayableExecutor +import com.android.systemui.utils.SafeIconLoader import java.util.function.Supplier /** @@ -70,6 +71,7 @@ class ControlViewHolder( val controlsMetricsLogger: ControlsMetricsLogger, val uid: Int, val currentUserId: Int, + val safeIconLoader: SafeIconLoader, ) { companion object { @@ -78,10 +80,8 @@ class ControlViewHolder( private const val ALPHA_DISABLED = 0 private const val STATUS_ALPHA_ENABLED = 1f private const val STATUS_ALPHA_DIMMED = 0.45f - private val FORCE_PANEL_DEVICES = setOf( - DeviceTypes.TYPE_THERMOSTAT, - DeviceTypes.TYPE_CAMERA - ) + private val FORCE_PANEL_DEVICES = + setOf(DeviceTypes.TYPE_THERMOSTAT, DeviceTypes.TYPE_CAMERA) private val ATTR_ENABLED = intArrayOf(android.R.attr.state_enabled) private val ATTR_DISABLED = intArrayOf(-android.R.attr.state_enabled) const val MIN_LEVEL = 0 @@ -89,8 +89,8 @@ class ControlViewHolder( } private val canUseIconPredicate = CanUseIconPredicate(currentUserId) - private val toggleBackgroundIntensity: Float = layout.context.resources - .getFraction(R.fraction.controls_toggle_bg_intensity, 1, 1) + private val toggleBackgroundIntensity: Float = + layout.context.resources.getFraction(R.fraction.controls_toggle_bg_intensity, 1, 1) private var stateAnimator: ValueAnimator? = null private var statusAnimator: Animator? = null private val baseLayer: GradientDrawable @@ -112,8 +112,10 @@ class ControlViewHolder( val deviceType: Int get() = cws.control?.let { it.deviceType } ?: cws.ci.deviceType + val controlStatus: Int get() = cws.control?.let { it.status } ?: Control.STATUS_UNKNOWN + val controlTemplate: ControlTemplate get() = cws.control?.let { it.controlTemplate } ?: ControlTemplate.NO_TEMPLATE @@ -129,14 +131,15 @@ class ControlViewHolder( } fun findBehaviorClass( - status: Int, - template: ControlTemplate, - deviceType: Int + status: Int, + template: ControlTemplate, + deviceType: Int, ): Supplier<out Behavior> { return when { status != Control.STATUS_OK -> Supplier { StatusBehavior() } template == ControlTemplate.NO_TEMPLATE -> Supplier { TouchBehavior() } - template is ThumbnailTemplate -> Supplier { ThumbnailBehavior(currentUserId) } + template is ThumbnailTemplate -> + Supplier { ThumbnailBehavior(currentUserId, safeIconLoader) } // Required for legacy support, or where cameras do not use the new template deviceType == DeviceTypes.TYPE_CAMERA -> Supplier { TouchBehavior() } @@ -172,18 +175,20 @@ class ControlViewHolder( cws.control?.let { layout.setClickable(true) - layout.setOnLongClickListener(View.OnLongClickListener() { - controlActionCoordinator.longPress(this@ControlViewHolder) - true - }) + layout.setOnLongClickListener( + View.OnLongClickListener() { + controlActionCoordinator.longPress(this@ControlViewHolder) + true + } + ) controlActionCoordinator.runPendingAction(cws.ci.controlId) } val wasLoading = isLoading isLoading = false - behavior = bindBehavior(behavior, - findBehaviorClass(controlStatus, controlTemplate, deviceType)) + behavior = + bindBehavior(behavior, findBehaviorClass(controlStatus, controlTemplate, deviceType)) updateContentDescription() // Only log one event per control, at the moment we have determined that the control @@ -198,8 +203,7 @@ class ControlViewHolder( // OK responses signal normal behavior, and the app will provide control updates val failedAttempt = lastChallengeDialog != null when (response) { - ControlAction.RESPONSE_OK -> - lastChallengeDialog = null + ControlAction.RESPONSE_OK -> lastChallengeDialog = null ControlAction.RESPONSE_UNKNOWN -> { lastChallengeDialog = null setErrorStatus() @@ -209,18 +213,28 @@ class ControlViewHolder( setErrorStatus() } ControlAction.RESPONSE_CHALLENGE_PIN -> { - lastChallengeDialog = ChallengeDialogs.createPinDialog( - this, false /* useAlphanumeric */, failedAttempt, onDialogCancel) + lastChallengeDialog = + ChallengeDialogs.createPinDialog( + this, + false /* useAlphanumeric */, + failedAttempt, + onDialogCancel, + ) lastChallengeDialog?.show() } ControlAction.RESPONSE_CHALLENGE_PASSPHRASE -> { - lastChallengeDialog = ChallengeDialogs.createPinDialog( - this, true /* useAlphanumeric */, failedAttempt, onDialogCancel) + lastChallengeDialog = + ChallengeDialogs.createPinDialog( + this, + true /* useAlphanumeric */, + failedAttempt, + onDialogCancel, + ) lastChallengeDialog?.show() } ControlAction.RESPONSE_CHALLENGE_ACK -> { - lastChallengeDialog = ChallengeDialogs.createConfirmationDialog( - this, onDialogCancel) + lastChallengeDialog = + ChallengeDialogs.createConfirmationDialog(this, onDialogCancel) lastChallengeDialog?.show() } } @@ -235,9 +249,7 @@ class ControlViewHolder( fun setErrorStatus() { val text = context.resources.getString(R.string.controls_error_failed) - animateStatusChange(/* animated */ true, { - setStatusText(text, /* immediately */ true) - }) + animateStatusChange(/* animated */ true, { setStatusText(text, /* immediately */ true) }) } private fun updateContentDescription() = @@ -256,34 +268,32 @@ class ControlViewHolder( fun bindBehavior( existingBehavior: Behavior?, supplier: Supplier<out Behavior>, - offset: Int = 0 + offset: Int = 0, ): Behavior { val newBehavior = supplier.get() - val behavior = if (existingBehavior == null || - existingBehavior::class != newBehavior::class) { - // Behavior changes can signal a change in template from the app or - // first time setup - newBehavior.initialize(this) - - // let behaviors define their own, if necessary, and clear any existing ones - layout.setAccessibilityDelegate(null) - newBehavior - } else { - existingBehavior - } + val behavior = + if (existingBehavior == null || existingBehavior::class != newBehavior::class) { + // Behavior changes can signal a change in template from the app or + // first time setup + newBehavior.initialize(this) + + // let behaviors define their own, if necessary, and clear any existing ones + layout.setAccessibilityDelegate(null) + newBehavior + } else { + existingBehavior + } - return behavior.also { - it.bind(cws, offset) - } + return behavior.also { it.bind(cws, offset) } } internal fun applyRenderInfo(enabled: Boolean, offset: Int, animated: Boolean = true) { - val deviceTypeOrError = if (controlStatus == Control.STATUS_OK || - controlStatus == Control.STATUS_UNKNOWN) { - deviceType - } else { - RenderInfo.ERROR_ICON - } + val deviceTypeOrError = + if (controlStatus == Control.STATUS_OK || controlStatus == Control.STATUS_UNKNOWN) { + deviceType + } else { + RenderInfo.ERROR_ICON + } val ri = RenderInfo.lookup(context, cws.componentName, deviceTypeOrError, offset) val fg = context.resources.getColorStateList(ri.foreground, context.theme) val newText = nextStatusText @@ -317,28 +327,31 @@ class ControlViewHolder( private fun animateBackgroundChange( animated: Boolean, enabled: Boolean, - @ColorRes bgColor: Int + @ColorRes bgColor: Int, ) { val bg = context.resources.getColor(R.color.control_default_background, context.theme) - val (newClipColor, newAlpha) = if (enabled) { - // allow color overrides for the enabled state only - val color = cws.control?.getCustomColor()?.let { - val state = intArrayOf(android.R.attr.state_enabled) - it.getColorForState(state, it.getDefaultColor()) - } ?: context.resources.getColor(bgColor, context.theme) - listOf(color, ALPHA_ENABLED) - } else { - listOf( - context.resources.getColor(R.color.control_default_background, context.theme), - ALPHA_DISABLED - ) - } - val newBaseColor = if (behavior is ToggleRangeBehavior) { - ColorUtils.blendARGB(bg, newClipColor, toggleBackgroundIntensity) - } else { - bg - } + val (newClipColor, newAlpha) = + if (enabled) { + // allow color overrides for the enabled state only + val color = + cws.control?.getCustomColor()?.let { + val state = intArrayOf(android.R.attr.state_enabled) + it.getColorForState(state, it.getDefaultColor()) + } ?: context.resources.getColor(bgColor, context.theme) + listOf(color, ALPHA_ENABLED) + } else { + listOf( + context.resources.getColor(R.color.control_default_background, context.theme), + ALPHA_DISABLED, + ) + } + val newBaseColor = + if (behavior is ToggleRangeBehavior) { + ColorUtils.blendARGB(bg, newClipColor, toggleBackgroundIntensity) + } else { + bg + } clipLayer.drawable?.apply { clipLayer.alpha = ALPHA_DISABLED @@ -347,7 +360,11 @@ class ControlViewHolder( startBackgroundAnimation(this, newAlpha, newClipColor, newBaseColor) } else { applyBackgroundChange( - this, newAlpha, newClipColor, newBaseColor, newLayoutAlpha = 1f + this, + newAlpha, + newClipColor, + newBaseColor, + newLayoutAlpha = 1f, ) } } @@ -357,41 +374,45 @@ class ControlViewHolder( clipDrawable: Drawable, newAlpha: Int, @ColorInt newClipColor: Int, - @ColorInt newBaseColor: Int + @ColorInt newBaseColor: Int, ) { - val oldClipColor = if (clipDrawable is GradientDrawable) { - clipDrawable.color?.defaultColor ?: newClipColor - } else { - newClipColor - } + val oldClipColor = + if (clipDrawable is GradientDrawable) { + clipDrawable.color?.defaultColor ?: newClipColor + } else { + newClipColor + } val oldBaseColor = baseLayer.color?.defaultColor ?: newBaseColor val oldAlpha = layout.alpha - stateAnimator = ValueAnimator.ofInt(clipLayer.alpha, newAlpha).apply { - addUpdateListener { - val updatedAlpha = it.animatedValue as Int - val updatedClipColor = ColorUtils.blendARGB(oldClipColor, newClipColor, - it.animatedFraction) - val updatedBaseColor = ColorUtils.blendARGB(oldBaseColor, newBaseColor, - it.animatedFraction) - val updatedLayoutAlpha = MathUtils.lerp(oldAlpha, 1f, it.animatedFraction) - applyBackgroundChange( + stateAnimator = + ValueAnimator.ofInt(clipLayer.alpha, newAlpha).apply { + addUpdateListener { + val updatedAlpha = it.animatedValue as Int + val updatedClipColor = + ColorUtils.blendARGB(oldClipColor, newClipColor, it.animatedFraction) + val updatedBaseColor = + ColorUtils.blendARGB(oldBaseColor, newBaseColor, it.animatedFraction) + val updatedLayoutAlpha = MathUtils.lerp(oldAlpha, 1f, it.animatedFraction) + applyBackgroundChange( clipDrawable, updatedAlpha, updatedClipColor, updatedBaseColor, - updatedLayoutAlpha + updatedLayoutAlpha, + ) + } + addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + stateAnimator = null + } + } ) + duration = STATE_ANIMATION_DURATION + interpolator = Interpolators.CONTROL_STATE + start() } - addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - stateAnimator = null - } - }) - duration = STATE_ANIMATION_DURATION - interpolator = Interpolators.CONTROL_STATE - start() - } } /** @@ -405,7 +426,7 @@ class ControlViewHolder( newAlpha: Int, @ColorInt newClipColor: Int, @ColorInt newBaseColor: Int, - newLayoutAlpha: Float + newLayoutAlpha: Float, ) { clipDrawable.alpha = newAlpha if (clipDrawable is GradientDrawable) { @@ -425,38 +446,46 @@ class ControlViewHolder( if (isLoading) { statusRowUpdater.invoke() - statusAnimator = ObjectAnimator.ofFloat(status, "alpha", STATUS_ALPHA_DIMMED).apply { - repeatMode = ValueAnimator.REVERSE - repeatCount = ValueAnimator.INFINITE - duration = 500L - interpolator = Interpolators.LINEAR - startDelay = 900L - start() - } + statusAnimator = + ObjectAnimator.ofFloat(status, "alpha", STATUS_ALPHA_DIMMED).apply { + repeatMode = ValueAnimator.REVERSE + repeatCount = ValueAnimator.INFINITE + duration = 500L + interpolator = Interpolators.LINEAR + startDelay = 900L + start() + } } else { - val fadeOut = ObjectAnimator.ofFloat(status, "alpha", 0f).apply { - duration = 200L - interpolator = Interpolators.LINEAR - addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - statusRowUpdater.invoke() - } - }) - } - val fadeIn = ObjectAnimator.ofFloat(status, "alpha", STATUS_ALPHA_ENABLED).apply { - duration = 200L - interpolator = Interpolators.LINEAR - } - statusAnimator = AnimatorSet().apply { - playSequentially(fadeOut, fadeIn) - addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - status.alpha = STATUS_ALPHA_ENABLED - statusAnimator = null - } - }) - start() - } + val fadeOut = + ObjectAnimator.ofFloat(status, "alpha", 0f).apply { + duration = 200L + interpolator = Interpolators.LINEAR + addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + statusRowUpdater.invoke() + } + } + ) + } + val fadeIn = + ObjectAnimator.ofFloat(status, "alpha", STATUS_ALPHA_ENABLED).apply { + duration = 200L + interpolator = Interpolators.LINEAR + } + statusAnimator = + AnimatorSet().apply { + playSequentially(fadeOut, fadeIn) + addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + status.alpha = STATUS_ALPHA_ENABLED + statusAnimator = null + } + } + ) + start() + } } } @@ -466,7 +495,7 @@ class ControlViewHolder( text: CharSequence, drawable: Drawable, color: ColorStateList, - control: Control? + control: Control?, ) { setEnabled(enabled) @@ -475,29 +504,30 @@ class ControlViewHolder( status.setTextColor(color) - control?.customIcon - ?.takeIf(canUseIconPredicate) - ?.let { - icon.setImageIcon(it) + control?.customIcon?.takeIf(canUseIconPredicate)?.let { it -> + val loadedDrawable = safeIconLoader.load(it) + icon.setImageDrawable(loadedDrawable) icon.imageTintList = it.tintList - } ?: run { - if (drawable is StateListDrawable) { - // Only reset the drawable if it is a different resource, as it will interfere - // with the image state and animation. - if (icon.drawable == null || !(icon.drawable is StateListDrawable)) { + loadedDrawable + } + ?: run { + if (drawable is StateListDrawable) { + // Only reset the drawable if it is a different resource, as it will interfere + // with the image state and animation. + if (icon.drawable == null || !(icon.drawable is StateListDrawable)) { + icon.setImageDrawable(drawable) + } + val state = if (enabled) ATTR_ENABLED else ATTR_DISABLED + icon.setImageState(state, true) + } else { icon.setImageDrawable(drawable) } - val state = if (enabled) ATTR_ENABLED else ATTR_DISABLED - icon.setImageState(state, true) - } else { - icon.setImageDrawable(drawable) - } - // do not color app icons - if (deviceType != DeviceTypes.TYPE_ROUTINE) { - icon.imageTintList = color + // do not color app icons + if (deviceType != DeviceTypes.TYPE_ROUTINE) { + icon.imageTintList = color + } } - } chevronIcon.imageTintList = icon.imageTintList } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index 8831dc61e452..66bfa986901d 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -52,7 +52,6 @@ import android.widget.Space import android.widget.TextView import androidx.annotation.VisibleForTesting import com.android.systemui.Dumpable -import com.android.systemui.res.R import com.android.systemui.controls.ControlsMetricsLogger import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.CustomIconCache @@ -74,11 +73,13 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.res.R import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.asIndenting import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.withIncreasedIndent +import com.android.systemui.utils.SafeIconLoader import com.android.wm.shell.taskview.TaskViewFactory import dagger.Lazy import java.io.PrintWriter @@ -90,26 +91,29 @@ import javax.inject.Inject private data class ControlKey(val componentName: ComponentName, val controlId: String) @SysUISingleton -class ControlsUiControllerImpl @Inject constructor ( - val controlsController: Lazy<ControlsController>, - val context: Context, - private val packageManager: PackageManager, - @Main val uiExecutor: DelayableExecutor, - @Background val bgExecutor: DelayableExecutor, - val controlsListingController: Lazy<ControlsListingController>, - private val controlActionCoordinator: ControlActionCoordinator, - private val activityStarter: ActivityStarter, - private val iconCache: CustomIconCache, - private val controlsMetricsLogger: ControlsMetricsLogger, - private val keyguardStateController: KeyguardStateController, - private val userTracker: UserTracker, - private val taskViewFactory: Optional<TaskViewFactory>, - private val controlsSettingsRepository: ControlsSettingsRepository, - private val authorizedPanelsRepository: AuthorizedPanelsRepository, - private val selectedComponentRepository: SelectedComponentRepository, - private val featureFlags: FeatureFlags, - private val dialogsFactory: ControlsDialogsFactory, - dumpManager: DumpManager +class ControlsUiControllerImpl +@Inject +constructor( + val controlsController: Lazy<ControlsController>, + val context: Context, + private val packageManager: PackageManager, + @Main val uiExecutor: DelayableExecutor, + @Background val bgExecutor: DelayableExecutor, + val controlsListingController: Lazy<ControlsListingController>, + private val controlActionCoordinator: ControlActionCoordinator, + private val activityStarter: ActivityStarter, + private val iconCache: CustomIconCache, + private val controlsMetricsLogger: ControlsMetricsLogger, + private val keyguardStateController: KeyguardStateController, + private val userTracker: UserTracker, + private val taskViewFactory: Optional<TaskViewFactory>, + private val controlsSettingsRepository: ControlsSettingsRepository, + private val authorizedPanelsRepository: AuthorizedPanelsRepository, + private val selectedComponentRepository: SelectedComponentRepository, + private val featureFlags: FeatureFlags, + private val safeIconLoaderFactory: SafeIconLoader.Factory, + private val dialogsFactory: ControlsDialogsFactory, + dumpManager: DumpManager, ) : ControlsUiController, Dumpable { companion object { @@ -139,26 +143,26 @@ class ControlsUiControllerImpl @Inject constructor ( private var taskViewController: PanelTaskViewController? = null private val collator = Collator.getInstance(context.resources.configuration.locales[0]) - private val localeComparator = compareBy<SelectionItem, CharSequence>(collator) { - it.getTitle() - } + private val localeComparator = + compareBy<SelectionItem, CharSequence>(collator) { it.getTitle() } private var openAppIntent: Intent? = null private var overflowMenuAdapter: BaseAdapter? = null private var removeAppDialog: Dialog? = null - private val onSeedingComplete = Consumer<Boolean> { - accepted -> + private val onSeedingComplete = + Consumer<Boolean> { accepted -> if (accepted) { - selectedItem = controlsController.get().getFavorites().maxByOrNull { - it.controls.size - }?.let { - SelectedItem.StructureItem(it) - } ?: SelectedItem.EMPTY_SELECTION + selectedItem = + controlsController + .get() + .getFavorites() + .maxByOrNull { it.controls.size } + ?.let { SelectedItem.StructureItem(it) } ?: SelectedItem.EMPTY_SELECTION updatePreferences(selectedItem) } reload(parent) - } + } private lateinit var activityContext: Context private lateinit var listingCallback: ControlsListingController.ControlsListingCallback @@ -176,10 +180,11 @@ class ControlsUiControllerImpl @Inject constructor ( return object : ControlsListingController.ControlsListingCallback { override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) { val authorizedPanels = authorizedPanelsRepository.getAuthorizedPanels() - val lastItems = serviceInfos.map { - val uid = it.serviceInfo.applicationInfo.uid + val lastItems = + serviceInfos.map { + val uid = it.serviceInfo.applicationInfo.uid - SelectionItem( + SelectionItem( it.loadLabel(), "", it.loadIcon(), @@ -189,9 +194,9 @@ class ControlsUiControllerImpl @Inject constructor ( it.panelActivity } else { null - } - ) - } + }, + ) + } uiExecutor.execute { parent.removeAllViews() if (lastItems.size > 0) { @@ -205,8 +210,8 @@ class ControlsUiControllerImpl @Inject constructor ( override fun resolveActivity(): Class<*> { val allStructures = controlsController.get().getFavorites() val selected = getPreferredSelectedItem(allStructures) - val anyPanels = controlsListingController.get().getCurrentServices() - .any { it.panelActivity != null } + val anyPanels = + controlsListingController.get().getCurrentServices().any { it.panelActivity != null } return if (controlsController.get().addSeedingFavoritesCallback(onSeedingComplete)) { ControlsActivity::class.java @@ -217,11 +222,7 @@ class ControlsUiControllerImpl @Inject constructor ( } } - override fun show( - parent: ViewGroup, - onDismiss: Runnable, - activityContext: Context - ) { + override fun show(parent: ViewGroup, onDismiss: Runnable, activityContext: Context) { Log.d(ControlsUiController.TAG, "show()") Trace.instant(Trace.TRACE_TAG_APP, "ControlsUiControllerImpl#show") this.parent = parent @@ -241,7 +242,7 @@ class ControlsUiControllerImpl @Inject constructor ( if (controlsController.get().addSeedingFavoritesCallback(onSeedingComplete)) { listingCallback = createCallback(::showSeedingView) } else if ( - selectedItem !is SelectedItem.PanelItem && + selectedItem !is SelectedItem.PanelItem && !selectedItem.hasControls && allStructures.size <= 1 ) { @@ -250,11 +251,11 @@ class ControlsUiControllerImpl @Inject constructor ( } else { val selected = selectedItem if (selected is SelectedItem.StructureItem) { - selected.structure.controls.map { - ControlWithState(selected.structure.componentName, it, null) - }.associateByTo(controlsById) { - ControlKey(selected.structure.componentName, it.ci.controlId) - } + selected.structure.controls + .map { ControlWithState(selected.structure.componentName, it, null) } + .associateByTo(controlsById) { + ControlKey(selected.structure.componentName, it.ci.controlId) + } controlsController.get().subscribeToFavorites(selected.structure) } else { controlsController.get().bindComponentForPanel(selected.componentName) @@ -285,18 +286,20 @@ class ControlsUiControllerImpl @Inject constructor ( val fadeAnim = ObjectAnimator.ofFloat(parent, "alpha", 1.0f, 0.0f) fadeAnim.setInterpolator(AccelerateInterpolator(1.0f)) fadeAnim.setDuration(FADE_IN_MILLIS) - fadeAnim.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - controlViewsById.clear() - controlsById.clear() - - show(parent, onDismiss, activityContext) - val showAnim = ObjectAnimator.ofFloat(parent, "alpha", 0.0f, 1.0f) - showAnim.setInterpolator(DecelerateInterpolator(1.0f)) - showAnim.setDuration(FADE_IN_MILLIS) - showAnim.start() + fadeAnim.addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + controlViewsById.clear() + controlsById.clear() + + show(parent, onDismiss, activityContext) + val showAnim = ObjectAnimator.ofFloat(parent, "alpha", 0.0f, 1.0f) + showAnim.setInterpolator(DecelerateInterpolator(1.0f)) + showAnim.setDuration(FADE_IN_MILLIS) + showAnim.start() + } } - }) + ) fadeAnim.start() } @@ -321,39 +324,48 @@ class ControlsUiControllerImpl @Inject constructor ( } private fun startDefaultActivity() { - openAppIntent?.let { - startActivity(it, animateExtra = false) - } + openAppIntent?.let { startActivity(it, animateExtra = false) } } @VisibleForTesting internal fun startRemovingApp(componentName: ComponentName, appName: CharSequence) { - activityStarter.dismissKeyguardThenExecute({ - showAppRemovalDialog(componentName, appName) - true - }, null, true) + activityStarter.dismissKeyguardThenExecute( + { + showAppRemovalDialog(componentName, appName) + true + }, + null, + true, + ) } private fun showAppRemovalDialog(componentName: ComponentName, appName: CharSequence) { removeAppDialog?.cancel() - removeAppDialog = dialogsFactory.createRemoveAppDialog(context, appName) { shouldRemove -> - if (!shouldRemove || !controlsController.get().removeFavorites(componentName)) { - return@createRemoveAppDialog - } + removeAppDialog = + dialogsFactory + .createRemoveAppDialog(context, appName) { shouldRemove -> + if (!shouldRemove || !controlsController.get().removeFavorites(componentName)) { + return@createRemoveAppDialog + } - if (selectedComponentRepository.getSelectedComponent()?.componentName == - componentName) { - selectedComponentRepository.removeSelectedComponent() - } + if ( + selectedComponentRepository.getSelectedComponent()?.componentName == + componentName + ) { + selectedComponentRepository.removeSelectedComponent() + } - val selectedItem = getPreferredSelectedItem(controlsController.get().getFavorites()) - if (selectedItem == SelectedItem.EMPTY_SELECTION) { - // User removed the last panel. In this case we start app selection flow and don't - // want to auto-add it again - selectedComponentRepository.setShouldAddDefaultComponent(false) - } - reload(parent) - }.apply { show() } + val selectedItem = + getPreferredSelectedItem(controlsController.get().getFavorites()) + if (selectedItem == SelectedItem.EMPTY_SELECTION) { + // User removed the last panel. In this case we start app selection flow and + // don't + // want to auto-add it again + selectedComponentRepository.setShouldAddDefaultComponent(false) + } + reload(parent) + } + .apply { show() } } private fun startTargetedActivity(si: StructureInfo, klazz: Class<*>) { @@ -366,8 +378,10 @@ class ControlsUiControllerImpl @Inject constructor ( private fun putIntentExtras(intent: Intent, si: StructureInfo) { intent.apply { - putExtra(ControlsFavoritingActivity.EXTRA_APP, - controlsListingController.get().getAppLabel(si.componentName)) + putExtra( + ControlsFavoritingActivity.EXTRA_APP, + controlsListingController.get().getAppLabel(si.componentName), + ) putExtra(ControlsFavoritingActivity.EXTRA_STRUCTURE, si.structure) putExtra(Intent.EXTRA_COMPONENT_NAME, si.componentName) } @@ -390,7 +404,7 @@ class ControlsUiControllerImpl @Inject constructor ( } else { activityContext.startActivity( intent, - ActivityOptions.makeSceneTransitionAnimation(activityContext as Activity).toBundle() + ActivityOptions.makeSceneTransitionAnimation(activityContext as Activity).toBundle(), ) } } @@ -401,8 +415,8 @@ class ControlsUiControllerImpl @Inject constructor ( val (panels, structures) = items.partition { it.isPanel } val panelComponents = panels.map { it.componentName }.toSet() - val itemsByComponent = structures.associateBy { it.componentName } - .filterNot { it.key in panelComponents } + val itemsByComponent = + structures.associateBy { it.componentName }.filterNot { it.key in panelComponents } val panelsAndStructures = mutableListOf<SelectionItem>() allStructures.mapNotNullTo(panelsAndStructures) { itemsByComponent.get(it.componentName)?.copy(structure = it.structure) @@ -413,7 +427,8 @@ class ControlsUiControllerImpl @Inject constructor ( lastSelections = panelsAndStructures - val selectionItem = findSelectionItem(selectedItem, panelsAndStructures) + val selectionItem = + findSelectionItem(selectedItem, panelsAndStructures) ?: if (panels.isNotEmpty()) { // If we couldn't find a good selected item, but there's at least one panel, // show a panel. @@ -428,8 +443,10 @@ class ControlsUiControllerImpl @Inject constructor ( if (taskViewFactory.isPresent && selectionItem.isPanel) { createPanelView(selectionItem.panelComponentName!!) } else if (!selectionItem.isPanel) { - controlsMetricsLogger - .refreshBegin(selectionItem.uid, !keyguardStateController.isUnlocked()) + controlsMetricsLogger.refreshBegin( + selectionItem.uid, + !keyguardStateController.isUnlocked(), + ) createListView(selectionItem) } else { Log.w(ControlsUiController.TAG, "Not TaskViewFactory to display panel $selectionItem") @@ -437,176 +454,200 @@ class ControlsUiControllerImpl @Inject constructor ( this.selectionItem = selectionItem bgExecutor.execute { - val intent = Intent(Intent.ACTION_MAIN) + val intent = + Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) .setPackage(selectionItem.componentName.packageName) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or - Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) - val intents = packageManager - .queryIntentActivities(intent, PackageManager.ResolveInfoFlags.of(0L)) - intents.firstOrNull { it.activityInfo.exported }?.let { resolved -> - intent.setPackage(null) - intent.setComponent(resolved.activityInfo.componentName) - openAppIntent = intent - parent.post { - // This will call show on the PopupWindow in the same thread, so make sure this - // happens in the view thread. - overflowMenuAdapter?.notifyDataSetChanged() + .addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED + ) + val intents = + packageManager.queryIntentActivities(intent, PackageManager.ResolveInfoFlags.of(0L)) + intents + .firstOrNull { it.activityInfo.exported } + ?.let { resolved -> + intent.setPackage(null) + intent.setComponent(resolved.activityInfo.componentName) + openAppIntent = intent + parent.post { + // This will call show on the PopupWindow in the same thread, so make sure + // this + // happens in the view thread. + overflowMenuAdapter?.notifyDataSetChanged() + } } - } } createDropDown(panelsAndStructures, selectionItem) val currentApps = panelsAndStructures.map { it.componentName }.toSet() - val allApps = controlsListingController.get() - .getCurrentServices().map { it.componentName }.toSet() - createMenu( - selectionItem = selectionItem, - extraApps = (allApps - currentApps).isNotEmpty(), - ) + val allApps = + controlsListingController.get().getCurrentServices().map { it.componentName }.toSet() + createMenu(selectionItem = selectionItem, extraApps = (allApps - currentApps).isNotEmpty()) } private fun createPanelView(componentName: ComponentName) { - val setting = controlsSettingsRepository - .allowActionOnTrivialControlsInLockscreen.value - val pendingIntent = PendingIntent.getActivityAsUser( + val setting = controlsSettingsRepository.allowActionOnTrivialControlsInLockscreen.value + val pendingIntent = + PendingIntent.getActivityAsUser( context, 0, Intent().apply { component = componentName putExtra( ControlsProviderService.EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS, - setting + setting, ) if (homePanelDream()) { - putExtra(ControlsProviderService.EXTRA_CONTROLS_SURFACE, - ControlsProviderService.CONTROLS_SURFACE_ACTIVITY_PANEL) + putExtra( + ControlsProviderService.EXTRA_CONTROLS_SURFACE, + ControlsProviderService.CONTROLS_SURFACE_ACTIVITY_PANEL, + ) } }, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT, ActivityOptions.makeBasic() .setPendingIntentCreatorBackgroundActivityStartMode( - ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED).toBundle(), - userTracker.userHandle - ) + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED + ) + .toBundle(), + userTracker.userHandle, + ) parent.requireViewById<View>(R.id.controls_scroll_view).visibility = View.GONE val container = parent.requireViewById<FrameLayout>(R.id.controls_panel) container.visibility = View.VISIBLE container.post { taskViewFactory.get().create(activityContext, uiExecutor) { taskView -> - taskViewController = PanelTaskViewController( - activityContext, - uiExecutor, - pendingIntent, - taskView, - onDismiss::run - ).also { - container.addView(taskView) - it.launchTaskView() - } + taskViewController = + PanelTaskViewController( + activityContext, + uiExecutor, + pendingIntent, + taskView, + onDismiss::run, + ) + .also { + container.addView(taskView) + it.launchTaskView() + } } } } private fun createMenu(selectionItem: SelectionItem, extraApps: Boolean) { val isPanel = selectedItem is SelectedItem.PanelItem - val selectedStructure = (selectedItem as? SelectedItem.StructureItem)?.structure - ?: EMPTY_STRUCTURE + val selectedStructure = + (selectedItem as? SelectedItem.StructureItem)?.structure ?: EMPTY_STRUCTURE val items = buildList { - add(OverflowMenuAdapter.MenuItem( + add( + OverflowMenuAdapter.MenuItem( context.getText(R.string.controls_open_app), - OPEN_APP_ID - )) + OPEN_APP_ID, + ) + ) if (extraApps) { - add(OverflowMenuAdapter.MenuItem( + add( + OverflowMenuAdapter.MenuItem( context.getText(R.string.controls_menu_add_another_app), - ADD_APP_ID - )) + ADD_APP_ID, + ) + ) } - add(OverflowMenuAdapter.MenuItem( + add( + OverflowMenuAdapter.MenuItem( context.getText(R.string.controls_menu_remove), REMOVE_APP_ID, - )) + ) + ) if (!isPanel) { - add(OverflowMenuAdapter.MenuItem( + add( + OverflowMenuAdapter.MenuItem( context.getText(R.string.controls_menu_edit), - EDIT_CONTROLS_ID - )) + EDIT_CONTROLS_ID, + ) + ) } } - val adapter = OverflowMenuAdapter(context, R.layout.controls_more_item, items) { position -> + val adapter = + OverflowMenuAdapter(context, R.layout.controls_more_item, items) { position -> getItemId(position) != OPEN_APP_ID || openAppIntent != null - } + } val anchor = parent.requireViewById<ImageView>(R.id.controls_more) - anchor.setOnClickListener(object : View.OnClickListener { - override fun onClick(v: View) { - popup = ControlsPopupMenu(popupThemedContext).apply { - width = ViewGroup.LayoutParams.WRAP_CONTENT - anchorView = anchor - setDropDownGravity(Gravity.END) - setAdapter(adapter) - - setOnItemClickListener(object : AdapterView.OnItemClickListener { - override fun onItemClick( - parent: AdapterView<*>, - view: View, - pos: Int, - id: Long - ) { - when (id) { - OPEN_APP_ID -> startDefaultActivity() - ADD_APP_ID -> startProviderSelectorActivity() - ADD_CONTROLS_ID -> startFavoritingActivity(selectedStructure) - EDIT_CONTROLS_ID -> startEditingActivity(selectedStructure) - REMOVE_APP_ID -> startRemovingApp( - selectionItem.componentName, selectionItem.appName - ) - } - dismiss() + anchor.setOnClickListener( + object : View.OnClickListener { + override fun onClick(v: View) { + popup = + ControlsPopupMenu(popupThemedContext).apply { + width = ViewGroup.LayoutParams.WRAP_CONTENT + anchorView = anchor + setDropDownGravity(Gravity.END) + setAdapter(adapter) + + setOnItemClickListener( + object : AdapterView.OnItemClickListener { + override fun onItemClick( + parent: AdapterView<*>, + view: View, + pos: Int, + id: Long, + ) { + when (id) { + OPEN_APP_ID -> startDefaultActivity() + ADD_APP_ID -> startProviderSelectorActivity() + ADD_CONTROLS_ID -> + startFavoritingActivity(selectedStructure) + EDIT_CONTROLS_ID -> + startEditingActivity(selectedStructure) + REMOVE_APP_ID -> + startRemovingApp( + selectionItem.componentName, + selectionItem.appName, + ) + } + dismiss() + } + } + ) + show() + listView?.post { listView?.requestAccessibilityFocus() } } - }) - show() - listView?.post { listView?.requestAccessibilityFocus() } } } - }) + ) overflowMenuAdapter = adapter } private fun createDropDown(items: List<SelectionItem>, selected: SelectionItem) { - items.forEach { - RenderInfo.registerComponentIcon(it.componentName, it.icon) - } + items.forEach { RenderInfo.registerComponentIcon(it.componentName, it.icon) } - val adapter = ItemAdapter(context, R.layout.controls_spinner_item).apply { - add(selected) - addAll(items - .filter { it !== selected } - .sortedBy { it.appName.toString() } - ) - } + val adapter = + ItemAdapter(context, R.layout.controls_spinner_item).apply { + add(selected) + addAll(items.filter { it !== selected }.sortedBy { it.appName.toString() }) + } - val iconSize = context.resources - .getDimensionPixelSize(R.dimen.controls_header_app_icon_size) + val iconSize = + context.resources.getDimensionPixelSize(R.dimen.controls_header_app_icon_size) /* * Default spinner widget does not work with the window type required * for this dialog. Use a textView with the ListPopupWindow to achieve * a similar effect */ - val spinner = parent.requireViewById<TextView>(R.id.app_or_structure_spinner).apply { - setText(selected.getTitle()) - // override the default color on the dropdown drawable - (getBackground() as LayerDrawable).getDrawable(0) - .setTint(context.resources.getColor(R.color.control_spinner_dropdown, null)) - selected.icon.setBounds(0, 0, iconSize, iconSize) - compoundDrawablePadding = (iconSize / 2.4f).toInt() - setCompoundDrawablesRelative(selected.icon, null, null, null) - } + val spinner = + parent.requireViewById<TextView>(R.id.app_or_structure_spinner).apply { + setText(selected.getTitle()) + // override the default color on the dropdown drawable + (getBackground() as LayerDrawable) + .getDrawable(0) + .setTint(context.resources.getColor(R.color.control_spinner_dropdown, null)) + selected.icon.setBounds(0, 0, iconSize, iconSize) + compoundDrawablePadding = (iconSize / 2.4f).toInt() + setCompoundDrawablesRelative(selected.icon, null, null, null) + } val anchor = parent.requireViewById<View>(R.id.app_or_structure_spinner) if (items.size == 1) { @@ -615,34 +656,40 @@ class ControlsUiControllerImpl @Inject constructor ( anchor.isClickable = false return } else { - spinner.background = parent.context.resources - .getDrawable(R.drawable.control_spinner_background) - } - - anchor.setOnClickListener(object : View.OnClickListener { - override fun onClick(v: View) { - popup = ControlsPopupMenu(popupThemedContext).apply { - anchorView = anchor - width = ViewGroup.LayoutParams.MATCH_PARENT - setAdapter(adapter) - - setOnItemClickListener(object : AdapterView.OnItemClickListener { - override fun onItemClick( - parent: AdapterView<*>, - view: View, - pos: Int, - id: Long - ) { - val listItem = parent.getItemAtPosition(pos) as SelectionItem - this@ControlsUiControllerImpl.switchAppOrStructure(listItem) - dismiss() + spinner.background = + parent.context.resources.getDrawable(R.drawable.control_spinner_background) + } + + anchor.setOnClickListener( + object : View.OnClickListener { + override fun onClick(v: View) { + popup = + ControlsPopupMenu(popupThemedContext).apply { + anchorView = anchor + width = ViewGroup.LayoutParams.MATCH_PARENT + setAdapter(adapter) + + setOnItemClickListener( + object : AdapterView.OnItemClickListener { + override fun onItemClick( + parent: AdapterView<*>, + view: View, + pos: Int, + id: Long, + ) { + val listItem = + parent.getItemAtPosition(pos) as SelectionItem + this@ControlsUiControllerImpl.switchAppOrStructure(listItem) + dismiss() + } + } + ) + show() + listView?.post { listView?.requestAccessibilityFocus() } } - }) - show() - listView?.post { listView?.requestAccessibilityFocus() } } } - }) + ) } private fun createControlsSpaceFrame() { @@ -658,6 +705,12 @@ class ControlsUiControllerImpl @Inject constructor ( private fun createListView(selected: SelectionItem) { if (selectedItem !is SelectedItem.StructureItem) return val selectedStructure = (selectedItem as SelectedItem.StructureItem).structure + val safeIconLoader = + safeIconLoaderFactory.create( + selected.uid, + selected.componentName.packageName, + controlsController.get().currentUserId, + ) val inflater = LayoutInflater.from(activityContext) val maxColumns = ControlAdapter.findMaxColumns(activityContext.resources) @@ -671,8 +724,8 @@ class ControlsUiControllerImpl @Inject constructor ( if (lastRow.getChildCount() == maxColumns) { lastRow = createRow(inflater, listView) } - val baseLayout = inflater.inflate( - R.layout.controls_base_item, lastRow, false) as ViewGroup + val baseLayout = + inflater.inflate(R.layout.controls_base_item, lastRow, false) as ViewGroup lastRow.addView(baseLayout) // Use ConstraintLayout in the future... for now, manually adjust margins @@ -680,16 +733,18 @@ class ControlsUiControllerImpl @Inject constructor ( val lp = baseLayout.getLayoutParams() as ViewGroup.MarginLayoutParams lp.setMarginStart(0) } - val cvh = ControlViewHolder( - baseLayout, - controlsController.get(), - uiExecutor, - bgExecutor, - controlActionCoordinator, - controlsMetricsLogger, - selected.uid, - controlsController.get().currentUserId, - ) + val cvh = + ControlViewHolder( + baseLayout, + controlsController.get(), + uiExecutor, + bgExecutor, + controlActionCoordinator, + controlsMetricsLogger, + selected.uid, + controlsController.get().currentUserId, + safeIconLoader, + ) cvh.bindData(it, false /* isLocked, will be ignored on initial load */) controlViewsById.put(key, cvh) } @@ -700,9 +755,7 @@ class ControlsUiControllerImpl @Inject constructor ( var spacersToAdd = if (mod == 0) 0 else maxColumns - mod val margin = context.resources.getDimensionPixelSize(R.dimen.control_spacing) while (spacersToAdd > 0) { - val lp = LinearLayout.LayoutParams(0, 0, 1f).apply { - setMarginStart(margin) - } + val lp = LinearLayout.LayoutParams(0, 0, 1f).apply { setMarginStart(margin) } lastRow.addView(Space(context), lp) spacersToAdd-- } @@ -715,27 +768,32 @@ class ControlsUiControllerImpl @Inject constructor ( SelectedItem.PanelItem(preferredPanel.name, component) } else { if (structures.isEmpty()) return SelectedItem.EMPTY_SELECTION - SelectedItem.StructureItem(structures.firstOrNull { - component == it.componentName && preferredPanel?.name == it.structure - } ?: structures[0]) + SelectedItem.StructureItem( + structures.firstOrNull { + component == it.componentName && preferredPanel?.name == it.structure + } ?: structures[0] + ) } } private fun updatePreferences(selectedItem: SelectedItem) { selectedComponentRepository.setSelectedComponent( - SelectedComponentRepository.SelectedComponent(selectedItem) + SelectedComponentRepository.SelectedComponent(selectedItem) ) } private fun maybeUpdateSelectedItem(item: SelectionItem): Boolean { - val newSelection = if (item.isPanel) { - SelectedItem.PanelItem(item.appName, item.componentName) - } else { - SelectedItem.StructureItem(allStructures.firstOrNull { - it.structure == item.structure && it.componentName == item.componentName - } ?: EMPTY_STRUCTURE) - } - return if (newSelection != selectedItem ) { + val newSelection = + if (item.isPanel) { + SelectedItem.PanelItem(item.appName, item.componentName) + } else { + SelectedItem.StructureItem( + allStructures.firstOrNull { + it.structure == item.structure && it.componentName == item.componentName + } ?: EMPTY_STRUCTURE + ) + } + return if (newSelection != selectedItem) { selectedItem = newSelection updatePreferences(selectedItem) true @@ -758,9 +816,7 @@ class ControlsUiControllerImpl @Inject constructor ( } popup = null - controlViewsById.forEach { - it.value.dismiss() - } + controlViewsById.forEach { it.value.dismiss() } controlActionCoordinator.closeDialogs() removeAppDialog?.cancel() } @@ -798,18 +854,14 @@ class ControlsUiControllerImpl @Inject constructor ( val key = ControlKey(componentName, c.getControlId()) controlsById.put(key, cws) - controlViewsById.get(key)?.let { - uiExecutor.execute { it.bindData(cws, isLocked) } - } + controlViewsById.get(key)?.let { uiExecutor.execute { it.bindData(cws, isLocked) } } } } } override fun onActionResponse(componentName: ComponentName, controlId: String, response: Int) { val key = ControlKey(componentName, controlId) - uiExecutor.execute { - controlViewsById.get(key)?.actionResponse(response) - } + uiExecutor.execute { controlViewsById.get(key)?.actionResponse(response) } } override fun onSizeChange() { @@ -830,16 +882,19 @@ class ControlsUiControllerImpl @Inject constructor ( private fun findSelectionItem(si: SelectedItem, items: List<SelectionItem>): SelectionItem? = items.firstOrNull { it.matches(si) } - override fun dump(pw: PrintWriter, args: Array<out String>) = pw.asIndenting().run { - println("ControlsUiControllerImpl:") - withIncreasedIndent { - println("hidden: $hidden") - println("selectedItem: $selectedItem") - println("lastSelections: $lastSelections") - println("setting: ${controlsSettingsRepository - .allowActionOnTrivialControlsInLockscreen.value}") + override fun dump(pw: PrintWriter, args: Array<out String>) = + pw.asIndenting().run { + println("ControlsUiControllerImpl:") + withIncreasedIndent { + println("hidden: $hidden") + println("selectedItem: $selectedItem") + println("lastSelections: $lastSelections") + println( + "setting: ${controlsSettingsRepository + .allowActionOnTrivialControlsInLockscreen.value}" + ) + } } - } } @VisibleForTesting @@ -849,9 +904,14 @@ internal data class SelectionItem( val icon: Drawable, val componentName: ComponentName, val uid: Int, - val panelComponentName: ComponentName? + val panelComponentName: ComponentName?, ) { - fun getTitle() = if (structure.isEmpty()) { appName } else { structure } + fun getTitle() = + if (structure.isEmpty()) { + appName + } else { + structure + } val isPanel: Boolean = panelComponentName != null @@ -872,7 +932,7 @@ internal data class SelectionItem( } private class ItemAdapter(parentContext: Context, val resource: Int) : - ArrayAdapter<SelectionItem>(parentContext, resource) { + ArrayAdapter<SelectionItem>(parentContext, resource) { private val layoutInflater = LayoutInflater.from(context)!! diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ThumbnailBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ThumbnailBehavior.kt index 41907882a443..e640be94073e 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ThumbnailBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ThumbnailBehavior.kt @@ -20,21 +20,21 @@ import android.graphics.BlendMode import android.graphics.BlendModeColorFilter import android.graphics.drawable.ClipDrawable import android.graphics.drawable.LayerDrawable -import android.view.View import android.service.controls.Control import android.service.controls.templates.TemperatureControlTemplate import android.service.controls.templates.ThumbnailTemplate import android.util.TypedValue - -import com.android.systemui.res.R +import android.view.View import com.android.systemui.controls.ui.ControlViewHolder.Companion.MAX_LEVEL import com.android.systemui.controls.ui.ControlViewHolder.Companion.MIN_LEVEL +import com.android.systemui.res.R +import com.android.systemui.utils.SafeIconLoader /** * Supports display of static images on the background of the tile. When marked active, the title * and subtitle will not be visible. To be used with {@link Thumbnailtemplate} only. */ -class ThumbnailBehavior(currentUserId: Int) : Behavior { +class ThumbnailBehavior(currentUserId: Int, private val safeIconLoader: SafeIconLoader) : Behavior { lateinit var template: ThumbnailTemplate lateinit var control: Control lateinit var cvh: ControlViewHolder @@ -61,17 +61,20 @@ class ThumbnailBehavior(currentUserId: Int) : Behavior { shadowRadius = outValue.getFloat() shadowColor = cvh.context.resources.getColor(R.color.control_thumbnail_shadow_color) - cvh.layout.setOnClickListener(View.OnClickListener() { - cvh.controlActionCoordinator.touch(cvh, template.getTemplateId(), control) - }) + cvh.layout.setOnClickListener( + View.OnClickListener() { + cvh.controlActionCoordinator.touch(cvh, template.getTemplateId(), control) + } + ) } override fun bind(cws: ControlWithState, colorOffset: Int) { this.control = cws.control!! cvh.setStatusText(control.getStatusText()) - template = control.controlTemplate as? ThumbnailTemplate + template = + control.controlTemplate as? ThumbnailTemplate ?: (control.controlTemplate as TemperatureControlTemplate).template - as ThumbnailTemplate + as ThumbnailTemplate val ld = cvh.layout.getBackground() as LayerDrawable val clipLayer = ld.findDrawableByLayerId(R.id.clip_layer) as ClipDrawable @@ -84,18 +87,22 @@ class ThumbnailBehavior(currentUserId: Int) : Behavior { cvh.status.setShadowLayer(shadowOffsetX, shadowOffsetY, shadowRadius, shadowColor) cvh.bgExecutor.execute { - val drawable = template.thumbnail - ?.takeIf(canUseIconPredicate) - ?.loadDrawable(cvh.context) + val drawable = + template.thumbnail.takeIf(canUseIconPredicate)?.let { safeIconLoader.load(it) } cvh.uiExecutor.execute { - val radius = cvh.context.getResources() - .getDimensionPixelSize(R.dimen.control_corner_radius).toFloat() + val radius = + cvh.context + .getResources() + .getDimensionPixelSize(R.dimen.control_corner_radius) + .toFloat() // TODO(b/290037843): Add a placeholder - drawable?.let { - clipLayer.drawable = CornerDrawable(it, radius) - } - clipLayer.setColorFilter(BlendModeColorFilter(cvh.context.resources - .getColor(R.color.control_thumbnail_tint), BlendMode.LUMINOSITY)) + drawable?.let { clipLayer.drawable = CornerDrawable(it, radius) } + clipLayer.setColorFilter( + BlendModeColorFilter( + cvh.context.resources.getColor(R.color.control_thumbnail_tint), + BlendMode.LUMINOSITY, + ) + ) cvh.applyRenderInfo(enabled, colorOffset) } } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java index 1125d2ccdd97..8e0beda9eff7 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java @@ -72,6 +72,7 @@ import android.hardware.display.DisplayManager; import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.hardware.input.InputManager; +import android.hardware.location.ContextHubManager; import android.location.LocationManager; import android.media.AudioManager; import android.media.IAudioService; @@ -238,6 +239,13 @@ public class FrameworkServicesModule { @Provides @Singleton + @Nullable + static ContextHubManager provideContextHubManager(Context context) { + return context.getSystemService(ContextHubManager.class); + } + + @Provides + @Singleton static DevicePolicyManager provideDevicePolicyManager(Context context) { return context.getSystemService(DevicePolicyManager.class); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java index 3050cba12f09..3c68e3a09f02 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java @@ -30,6 +30,7 @@ import com.android.systemui.accessibility.SystemActionsModule; import com.android.systemui.accessibility.data.repository.AccessibilityRepositoryModule; import com.android.systemui.battery.BatterySaverModule; import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayOverrideModule; +import com.android.systemui.communal.posturing.dagger.NoopPosturingModule; import com.android.systemui.display.ui.viewmodel.ConnectingDisplayViewModel; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; @@ -74,9 +75,9 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.dagger.CentralSurfacesModule; import com.android.systemui.statusbar.dagger.StartCentralSurfacesModule; import com.android.systemui.statusbar.notification.dagger.ReferenceNotificationsModule; +import com.android.systemui.statusbar.notification.headsup.HeadsUpModule; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.DozeServiceHost; -import com.android.systemui.statusbar.notification.headsup.HeadsUpModule; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule; import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragmentStartableModule; @@ -149,6 +150,7 @@ import javax.inject.Named; RearDisplayModule.class, RecentsModule.class, ReferenceNotificationsModule.class, + NoopPosturingModule.class, ReferenceScreenshotModule.class, RotationLockModule.class, RotationLockNewModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperModule.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperModule.kt index d8532c176619..ee10c9edaa39 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperModule.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperModule.kt @@ -21,12 +21,14 @@ import com.android.systemui.Flags.keyboardShortcutHelperRewrite import com.android.systemui.keyboard.shortcut.data.repository.CustomShortcutCategoriesRepository import com.android.systemui.keyboard.shortcut.data.repository.DefaultShortcutCategoriesRepository import com.android.systemui.keyboard.shortcut.data.repository.ShortcutCategoriesRepository +import com.android.systemui.keyboard.shortcut.data.source.AccessibilityShortcutsSource import com.android.systemui.keyboard.shortcut.data.source.AppCategoriesShortcutsSource import com.android.systemui.keyboard.shortcut.data.source.CurrentAppShortcutsSource import com.android.systemui.keyboard.shortcut.data.source.InputShortcutsSource import com.android.systemui.keyboard.shortcut.data.source.KeyboardShortcutGroupsSource import com.android.systemui.keyboard.shortcut.data.source.MultitaskingShortcutsSource import com.android.systemui.keyboard.shortcut.data.source.SystemShortcutsSource +import com.android.systemui.keyboard.shortcut.qualifiers.AccessibilityShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.AppCategoriesShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.CurrentAppShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.CustomShortcutCategories @@ -68,6 +70,12 @@ interface ShortcutHelperModule { ): KeyboardShortcutGroupsSource @Binds + @AccessibilityShortcuts + fun accessibilityShortcutsSource( + impl: AccessibilityShortcutsSource + ): KeyboardShortcutGroupsSource + + @Binds @DefaultShortcutCategories fun defaultShortcutCategoriesRepository( impl: DefaultShortcutCategoriesRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/DefaultShortcutCategoriesRepository.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/DefaultShortcutCategoriesRepository.kt index db35d49e7598..c36b8af1a669 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/DefaultShortcutCategoriesRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/DefaultShortcutCategoriesRepository.kt @@ -23,6 +23,7 @@ import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.keyboard.shortcut.data.model.InternalKeyboardShortcutGroup import com.android.systemui.keyboard.shortcut.data.model.InternalKeyboardShortcutInfo import com.android.systemui.keyboard.shortcut.data.source.KeyboardShortcutGroupsSource +import com.android.systemui.keyboard.shortcut.qualifiers.AccessibilityShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.AppCategoriesShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.CurrentAppShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.InputShortcuts @@ -30,6 +31,7 @@ import com.android.systemui.keyboard.shortcut.qualifiers.MultitaskingShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.SystemShortcuts import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategory import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType +import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.Accessibility import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.AppCategories import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.CurrentApp import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.InputMethodEditor @@ -47,11 +49,12 @@ class DefaultShortcutCategoriesRepository @Inject constructor( @Background private val backgroundScope: CoroutineScope, - @SystemShortcuts private val systemShortcutsSource: KeyboardShortcutGroupsSource, - @MultitaskingShortcuts private val multitaskingShortcutsSource: KeyboardShortcutGroupsSource, - @AppCategoriesShortcuts private val appCategoriesShortcutsSource: KeyboardShortcutGroupsSource, - @InputShortcuts private val inputShortcutsSource: KeyboardShortcutGroupsSource, - @CurrentAppShortcuts private val currentAppShortcutsSource: KeyboardShortcutGroupsSource, + @SystemShortcuts systemShortcutsSource: KeyboardShortcutGroupsSource, + @MultitaskingShortcuts multitaskingShortcutsSource: KeyboardShortcutGroupsSource, + @AppCategoriesShortcuts appCategoriesShortcutsSource: KeyboardShortcutGroupsSource, + @InputShortcuts inputShortcutsSource: KeyboardShortcutGroupsSource, + @CurrentAppShortcuts currentAppShortcutsSource: KeyboardShortcutGroupsSource, + @AccessibilityShortcuts accessibilityShortcutsSource: KeyboardShortcutGroupsSource, inputDeviceRepository: ShortcutHelperInputDeviceRepository, shortcutCategoriesUtils: ShortcutCategoriesUtils, ) : ShortcutCategoriesRepository { @@ -72,6 +75,10 @@ constructor( typeProvider = { InputMethodEditor }, ), InternalGroupsSource( + source = accessibilityShortcutsSource, + typeProvider = { Accessibility }, + ), + InternalGroupsSource( source = currentAppShortcutsSource, typeProvider = { groups -> getCurrentAppShortcutCategoryType(groups) }, ), diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt new file mode 100644 index 000000000000..d92c45591522 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyboard.shortcut.data.source + +import android.content.res.Resources +import android.view.KeyboardShortcutGroup +import android.view.KeyboardShortcutInfo +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.res.R +import javax.inject.Inject + +class AccessibilityShortcutsSource @Inject constructor(@Main private val resources: Resources) : + KeyboardShortcutGroupsSource { + override suspend fun shortcutGroups(deviceId: Int): List<KeyboardShortcutGroup> = + listOf( + KeyboardShortcutGroup( + /* label= */ resources.getString(R.string.shortcutHelper_category_accessibility), + accessibilityShortcuts(), + ) + ) + + private fun accessibilityShortcuts() = listOf<KeyboardShortcutInfo>() +} diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/qualifiers/AccessibilityShortcuts.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/qualifiers/AccessibilityShortcuts.kt new file mode 100644 index 000000000000..2f939145734b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/qualifiers/AccessibilityShortcuts.kt @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyboard.shortcut.qualifiers + +import javax.inject.Qualifier + +@Qualifier annotation class AccessibilityShortcuts diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/shared/model/ShortcutCategory.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/shared/model/ShortcutCategory.kt index 464805334c2a..110ea34e9b0e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/shared/model/ShortcutCategory.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/shared/model/ShortcutCategory.kt @@ -40,6 +40,11 @@ sealed interface ShortcutCategoryType { override val includeInCustomization: Boolean = true } + data object Accessibility : ShortcutCategoryType { + override val isTrusted: Boolean = false + override val includeInCustomization: Boolean = true + } + data class CurrentApp(val packageName: String) : ShortcutCategoryType { override val isTrusted: Boolean = false override val includeInCustomization: Boolean = false diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutCustomizer.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutCustomizer.kt index d8e2dabde8a9..550438aa220f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutCustomizer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutCustomizer.kt @@ -107,16 +107,13 @@ private fun AddShortcutDialog( onCancel: () -> Unit, onConfirmSetShortcut: () -> Unit, ) { - Column(modifier = modifier) { + Column(modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally) { Title(uiState.shortcutLabel) Description( text = stringResource(id = R.string.shortcut_customize_mode_add_shortcut_description) ) PromptShortcutModifier( - modifier = - Modifier.padding(top = 24.dp, start = 116.5.dp, end = 116.5.dp) - .width(131.dp) - .height(48.dp), + modifier = Modifier.padding(top = 24.dp).sizeIn(minWidth = 131.dp, minHeight = 48.dp), defaultModifierKey = uiState.defaultCustomShortcutModifierKey, ) SelectedKeyCombinationContainer( @@ -216,14 +213,14 @@ private fun DialogButtons( modifier = Modifier.heightIn(40.dp), contentColor = MaterialTheme.colorScheme.primary, text = stringResource(R.string.shortcut_helper_customize_dialog_cancel_button_label), - border = BorderStroke(width = 1.dp, color = MaterialTheme.colorScheme.outlineVariant) + border = BorderStroke(width = 1.dp, color = MaterialTheme.colorScheme.outlineVariant), ) Spacer(modifier = Modifier.width(8.dp)) ShortcutHelperButton( - modifier = Modifier - .heightIn(40.dp) - .focusRequester(focusRequester) - .focusProperties { canFocus = true }, // enable focus on touch/click mode + modifier = + Modifier.heightIn(40.dp).focusRequester(focusRequester).focusProperties { + canFocus = true + }, // enable focus on touch/click mode onClick = onConfirm, color = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.onPrimary, @@ -236,7 +233,10 @@ private fun DialogButtons( @Composable private fun ErrorMessageContainer(errorMessage: String) { if (errorMessage.isNotEmpty()) { - Box(modifier = Modifier.padding(horizontal = 16.dp).width(332.dp).height(40.dp)) { + Box( + modifier = + Modifier.padding(horizontal = 16.dp).sizeIn(minWidth = 332.dp, minHeight = 40.dp) + ) { Text( text = errorMessage, style = MaterialTheme.typography.bodyMedium, @@ -405,7 +405,11 @@ private fun PromptShortcutModifier( modifier: Modifier, defaultModifierKey: ShortcutKey.Icon.ResIdIcon, ) { - Row(modifier = modifier, horizontalArrangement = Arrangement.spacedBy(2.dp)) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(2.dp), + verticalAlignment = Alignment.CenterVertically, + ) { ActionKeyContainer(defaultModifierKey) PlusIconContainer() } @@ -422,6 +426,7 @@ private fun ActionKeyContainer(defaultModifierKey: ShortcutKey.Icon.ResIdIcon) { ) .padding(all = 12.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, ) { ActionKeyIcon(defaultModifierKey) ActionKeyText() diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModel.kt index d61165c16625..f11205fd7246 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModel.kt @@ -21,6 +21,8 @@ import android.content.Context import android.content.pm.PackageManager.NameNotFoundException import android.util.Log import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Accessibility +import androidx.compose.material.icons.filled.AccessibilityNew import androidx.compose.material.icons.filled.Android import androidx.compose.material.icons.filled.Apps import androidx.compose.material.icons.filled.Keyboard @@ -41,6 +43,7 @@ import com.android.systemui.keyboard.shortcut.ui.model.ShortcutCategoryUi import com.android.systemui.keyboard.shortcut.ui.model.ShortcutsUiState import com.android.systemui.res.R import com.android.systemui.settings.UserTracker +import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow @@ -51,7 +54,6 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.withContext -import javax.inject.Inject class ShortcutHelperViewModel @Inject @@ -89,8 +91,9 @@ constructor( searchQuery = query, shortcutCategories = shortcutCategoriesUi, defaultSelectedCategory = getDefaultSelectedCategory(filteredCategories), - isShortcutCustomizerFlagEnabled = keyboardShortcutHelperShortcutCustomizer(), - shouldShowResetButton = shouldShowResetButton(shortcutCategoriesUi) + isShortcutCustomizerFlagEnabled = + keyboardShortcutHelperShortcutCustomizer(), + shouldShowResetButton = shouldShowResetButton(shortcutCategoriesUi), ) } } @@ -137,6 +140,9 @@ constructor( IconSource(imageVector = Icons.Default.Android) } } + + ShortcutCategoryType.Accessibility -> + IconSource(imageVector = Icons.Default.AccessibilityNew) } } @@ -151,6 +157,8 @@ constructor( ShortcutCategoryType.AppCategories -> context.getString(R.string.shortcut_helper_category_app_shortcuts) is CurrentApp -> getApplicationLabelForCurrentApp(type) + ShortcutCategoryType.Accessibility -> + context.getString(R.string.shortcutHelper_category_accessibility) } private fun getApplicationLabelForCurrentApp(type: CurrentApp): String { @@ -245,7 +253,7 @@ constructor( searchQuery.value = query } - private fun resetSearchQuery(){ + private fun resetSearchQuery() { searchQuery.value = "" } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 591383999182..1d36076347bf 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -72,6 +72,7 @@ import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; import com.android.internal.policy.IKeyguardStateCallback; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.mediator.ScreenOnCoordinator; import com.android.systemui.SystemUIApplication; import com.android.systemui.dagger.qualifiers.Application; @@ -331,6 +332,7 @@ public class KeyguardService extends Service { } }; private final KeyguardServiceLockNowInteractor mKeyguardServiceLockNowInteractor; + private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Inject public KeyguardService( @@ -356,7 +358,8 @@ public class KeyguardService extends Service { KeyguardDismissInteractor keyguardDismissInteractor, Lazy<DeviceEntryInteractor> deviceEntryInteractorLazy, KeyguardStateCallbackInteractor keyguardStateCallbackInteractor, - KeyguardServiceLockNowInteractor keyguardServiceLockNowInteractor) { + KeyguardServiceLockNowInteractor keyguardServiceLockNowInteractor, + KeyguardUpdateMonitor keyguardUpdateMonitor) { super(); mKeyguardViewMediator = keyguardViewMediator; mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher; @@ -389,6 +392,7 @@ public class KeyguardService extends Service { mKeyguardWakeDirectlyToGoneInteractor = keyguardWakeDirectlyToGoneInteractor; mKeyguardDismissInteractor = keyguardDismissInteractor; mKeyguardServiceLockNowInteractor = keyguardServiceLockNowInteractor; + mKeyguardUpdateMonitor = keyguardUpdateMonitor; } @Override @@ -585,6 +589,7 @@ public class KeyguardService extends Service { mPowerInteractor.onScreenPowerStateUpdated(ScreenPowerState.SCREEN_TURNING_ON); mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_ON, callback); + mKeyguardUpdateMonitor.triggerTimeUpdate(); final String onDrawWaitingTraceTag = "Waiting for KeyguardDrawnCallback#onDrawn"; final int traceCookie = System.identityHashCode(callback); @@ -620,6 +625,7 @@ public class KeyguardService extends Service { checkPermission(); mPowerInteractor.onScreenPowerStateUpdated(ScreenPowerState.SCREEN_ON); mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNED_ON); + mKeyguardUpdateMonitor.triggerTimeUpdate(); mScreenOnCoordinator.onScreenTurnedOn(); Trace.endSection(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt index b42da5265d86..717437923e57 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt @@ -36,6 +36,7 @@ import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.debounce @SysUISingleton @@ -80,6 +81,7 @@ constructor( /** * Listen for the signal that we're waking up and figure what state we need to transition to. */ + @OptIn(FlowPreview::class) private fun listenForAodToAwake() { // Use PowerInteractor's wakefulness, which is the earliest wake signal available. We // have all of the information we need at this time to make a decision about where to diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt index 021cce6d1e23..4291181d8336 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt @@ -41,6 +41,7 @@ import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.debounce @SysUISingleton @@ -114,6 +115,7 @@ constructor( } } + @OptIn(FlowPreview::class) @SuppressLint("MissingPermission") private fun listenForDozingToAny() { if (KeyguardWmStateRefactor.isEnabled) { 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 a9992112f893..82b8ca2a890b 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 @@ -125,6 +125,7 @@ constructor( * the power button is pressed quickly, we may need to go directly from DREAMING to * GLANCEABLE_HUB as the transition to DOZING has not occurred yet. */ + @OptIn(FlowPreview::class) @SuppressLint("MissingPermission") private fun listenForDreamingToGlanceableHubFromPowerButton() { if (!communalSettingsInteractor.isCommunalFlagEnabled()) return diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index 8f7f2a0a8cbb..1f3c08ca9f7a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -56,6 +56,7 @@ import javax.inject.Inject import javax.inject.Provider import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -203,6 +204,7 @@ constructor( * examining the value of this flow, to let other consumers have enough time to also see that * same new value. */ + @OptIn(FlowPreview::class) val isAbleToDream: Flow<Boolean> = dozeTransitionModel .flatMapLatest { dozeTransitionModel -> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt index cd62d5f3b6e1..3dc123a81bde 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt @@ -30,6 +30,7 @@ import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel import javax.inject.Inject import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.debounce private val TAG = KeyguardTransitionAuditLogger::class.simpleName!! @@ -52,6 +53,7 @@ constructor( private val deviceEntryInteractor: DeviceEntryInteractor, ) { + @OptIn(FlowPreview::class) fun start() { scope.launch { powerInteractor.detailedWakefulness.collect { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt index f34cc07f26ae..82abb05177e1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt @@ -23,6 +23,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.view.layout.sections.AccessibilityActionsSection import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection +import com.android.systemui.keyguard.ui.view.layout.sections.AodPromotedNotificationSection import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection @@ -60,6 +61,7 @@ constructor( defaultSettingsPopupMenuSection: DefaultSettingsPopupMenuSection, defaultStatusBarSection: DefaultStatusBarSection, defaultNotificationStackScrollLayoutSection: DefaultNotificationStackScrollLayoutSection, + aodPromotedNotificationSection: AodPromotedNotificationSection, aodNotificationIconsSection: AodNotificationIconsSection, aodBurnInSection: AodBurnInSection, clockSection: ClockSection, @@ -79,6 +81,7 @@ constructor( defaultStatusBarSection, defaultNotificationStackScrollLayoutSection, aodNotificationIconsSection, + aodPromotedNotificationSection, smartspaceSection, aodBurnInSection, clockSection, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt index 6f7872c9cb96..4f4442350873 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt @@ -38,6 +38,7 @@ import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDi import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarIconViewBindingFailureTracker import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel +import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUiAod import com.android.systemui.statusbar.phone.NotificationIconContainer import com.android.systemui.statusbar.ui.SystemBarUtilsState import com.android.systemui.util.ui.value @@ -94,7 +95,11 @@ constructor( context.resources.getDimensionPixelSize(R.dimen.keyguard_status_view_bottom_margin) val isVisible = rootViewModel.isNotifIconContainerVisible.value constraintSet.apply { - connect(nicId, TOP, R.id.smart_space_barrier_bottom, BOTTOM, bottomMargin) + if (PromotedNotificationUiAod.isEnabled) { + connect(nicId, TOP, AodPromotedNotificationSection.viewId, BOTTOM, bottomMargin) + } else { + connect(nicId, TOP, R.id.smart_space_barrier_bottom, BOTTOM, bottomMargin) + } setGoneMargin(nicId, BOTTOM, bottomMargin) setVisibility(nicId, if (isVisible.value) VISIBLE else GONE) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodPromotedNotificationSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodPromotedNotificationSection.kt new file mode 100644 index 000000000000..ed1bdb0e2922 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodPromotedNotificationSection.kt @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.view.layout.sections + +import androidx.compose.ui.platform.ComposeView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.constraintlayout.widget.ConstraintSet.BOTTOM +import androidx.constraintlayout.widget.ConstraintSet.END +import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID +import androidx.constraintlayout.widget.ConstraintSet.START +import androidx.constraintlayout.widget.ConstraintSet.TOP +import com.android.systemui.keyguard.shared.model.KeyguardSection +import com.android.systemui.res.R +import com.android.systemui.statusbar.notification.promoted.AODPromotedNotification +import com.android.systemui.statusbar.notification.promoted.PromotedNotificationLogger +import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUiAod +import com.android.systemui.statusbar.notification.promoted.ui.viewmodel.AODPromotedNotificationViewModel +import javax.inject.Inject + +class AodPromotedNotificationSection +@Inject +constructor( + private val viewModelFactory: AODPromotedNotificationViewModel.Factory, + private val logger: PromotedNotificationLogger, +) : KeyguardSection() { + var view: ComposeView? = null + + override fun addViews(constraintLayout: ConstraintLayout) { + if (!PromotedNotificationUiAod.isEnabled) { + return + } + + check(view == null) + + view = + ComposeView(constraintLayout.context).apply { + setContent { AODPromotedNotification(viewModelFactory) } + id = viewId + constraintLayout.addView(this) + } + + logger.logSectionAddedViews() + } + + override fun bindData(constraintLayout: ConstraintLayout) { + if (!PromotedNotificationUiAod.isEnabled) { + return + } + + checkNotNull(view) + + // Do nothing; the binding happens in the AODPromotedNotification Composable. + + logger.logSectionBoundData() + } + + override fun applyConstraints(constraintSet: ConstraintSet) { + if (!PromotedNotificationUiAod.isEnabled) { + return + } + + checkNotNull(view) + + constraintSet.apply { + connect(viewId, TOP, R.id.smart_space_barrier_bottom, BOTTOM, 0) + connect(viewId, START, PARENT_ID, START, 0) + connect(viewId, END, PARENT_ID, END, 0) + + constrainWidth(viewId, ConstraintSet.MATCH_CONSTRAINT) + constrainHeight(viewId, ConstraintSet.WRAP_CONTENT) + } + + logger.logSectionAppliedConstraints() + } + + override fun removeViews(constraintLayout: ConstraintLayout) { + if (!PromotedNotificationUiAod.isEnabled) { + return + } + + constraintLayout.removeView(checkNotNull(view)) + + view = null + + logger.logSectionRemovedViews() + } + + companion object { + val viewId = R.id.aod_promoted_notification_frame + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/transitions/ClockSizeTransition.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/transitions/ClockSizeTransition.kt index a595d815e016..29bda7623675 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/transitions/ClockSizeTransition.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/transitions/ClockSizeTransition.kt @@ -86,15 +86,56 @@ class ClockSizeTransition( transition.values[SMARTSPACE_BOUNDS] = targetSSView.getRect() } - open fun mutateBounds( - view: View, - fromIsVis: Boolean, - toIsVis: Boolean, - fromBounds: Rect, - toBounds: Rect, - fromSSBounds: Rect?, - toSSBounds: Rect?, - ) {} + open fun initTargets(from: Target, to: Target) {} + + open fun mutateTargets(from: Target, to: Target) {} + + data class Target( + var view: View, + var visibility: Int, + var isVisible: Boolean, + var alpha: Float, + var bounds: Rect, + var ssBounds: Rect?, + ) { + companion object { + fun fromStart(startValues: TransitionValues): Target { + var fromVis = startValues.values[PROP_VISIBILITY] as Int + var fromIsVis = fromVis == View.VISIBLE + var fromAlpha = startValues.values[PROP_ALPHA] as Float + + // Align starting visibility and alpha + if (!fromIsVis) fromAlpha = 0f + else if (fromAlpha <= 0f) { + fromIsVis = false + fromVis = View.INVISIBLE + } + + return Target( + view = startValues.view, + visibility = fromVis, + isVisible = fromIsVis, + alpha = fromAlpha, + bounds = startValues.values[PROP_BOUNDS] as Rect, + ssBounds = startValues.values[SMARTSPACE_BOUNDS] as Rect?, + ) + } + + fun fromEnd(endValues: TransitionValues): Target { + val toVis = endValues.values[PROP_VISIBILITY] as Int + val toIsVis = toVis == View.VISIBLE + + return Target( + view = endValues.view, + visibility = toVis, + isVisible = toIsVis, + alpha = if (toIsVis) 1f else 0f, + bounds = endValues.values[PROP_BOUNDS] as Rect, + ssBounds = endValues.values[SMARTSPACE_BOUNDS] as Rect?, + ) + } + } + } override fun createAnimator( sceenRoot: ViewGroup, @@ -109,72 +150,58 @@ class ClockSizeTransition( return null } - var fromVis = startValues.values[PROP_VISIBILITY] as Int - var fromIsVis = fromVis == View.VISIBLE - var fromAlpha = startValues.values[PROP_ALPHA] as Float - val fromBounds = startValues.values[PROP_BOUNDS] as Rect - val fromSSBounds = startValues.values[SMARTSPACE_BOUNDS] as Rect? - - val toView = endValues.view - val toVis = endValues.values[PROP_VISIBILITY] as Int - val toBounds = endValues.values[PROP_BOUNDS] as Rect - val toSSBounds = endValues.values[SMARTSPACE_BOUNDS] as Rect? - val toIsVis = toVis == View.VISIBLE - val toAlpha = if (toIsVis) 1f else 0f - - // Align starting visibility and alpha - if (!fromIsVis) fromAlpha = 0f - else if (fromAlpha <= 0f) { - fromIsVis = false - fromVis = View.INVISIBLE - } + val from = Target.fromStart(startValues) + val to = Target.fromEnd(endValues) + initTargets(from, to) + mutateTargets(from, to) - mutateBounds(toView, fromIsVis, toIsVis, fromBounds, toBounds, fromSSBounds, toSSBounds) - if (fromIsVis == toIsVis && fromBounds.equals(toBounds)) { + if (from.isVisible == to.isVisible && from.bounds.equals(to.bounds)) { if (DEBUG) { Log.w( TAG, - "Skipping no-op transition: $toView; " + - "vis: $fromVis -> $toVis; " + - "alpha: $fromAlpha -> $toAlpha; " + - "bounds: $fromBounds -> $toBounds; ", + "Skipping no-op transition: ${to.view}; " + + "vis: ${from.visibility} -> ${to.visibility}; " + + "alpha: ${from.alpha} -> ${to.alpha}; " + + "bounds: ${from.bounds} -> ${to.bounds}; ", ) } return null } - val sendToBack = fromIsVis && !toIsVis + val sendToBack = from.isVisible && !to.isVisible fun lerp(start: Int, end: Int, fract: Float): Int = MathUtils.lerp(start.toFloat(), end.toFloat(), fract).toInt() fun computeBounds(fract: Float): Rect = Rect( - lerp(fromBounds.left, toBounds.left, fract), - lerp(fromBounds.top, toBounds.top, fract), - lerp(fromBounds.right, toBounds.right, fract), - lerp(fromBounds.bottom, toBounds.bottom, fract), + lerp(from.bounds.left, to.bounds.left, fract), + lerp(from.bounds.top, to.bounds.top, fract), + lerp(from.bounds.right, to.bounds.right, fract), + lerp(from.bounds.bottom, to.bounds.bottom, fract), ) fun assignAnimValues(src: String, fract: Float, vis: Int? = null) { + mutateTargets(from, to) val bounds = computeBounds(fract) - val alpha = MathUtils.lerp(fromAlpha, toAlpha, fract) + val alpha = MathUtils.lerp(from.alpha, to.alpha, fract) if (DEBUG) { Log.i( TAG, - "$src: $toView; fract=$fract; alpha=$alpha; vis=$vis; bounds=$bounds;", + "$src: ${to.view}; fract=$fract; alpha=$alpha; vis=$vis; bounds=$bounds;", ) } - toView.setVisibility(vis ?: View.VISIBLE) - toView.setAlpha(alpha) - toView.setRect(bounds) + + to.view.setVisibility(vis ?: View.VISIBLE) + to.view.setAlpha(alpha) + to.view.setRect(bounds) } if (DEBUG) { Log.i( TAG, - "transitioning: $toView; " + - "vis: $fromVis -> $toVis; " + - "alpha: $fromAlpha -> $toAlpha; " + - "bounds: $fromBounds -> $toBounds; ", + "transitioning: ${to.view}; " + + "vis: ${from.visibility} -> ${to.visibility}; " + + "alpha: ${from.alpha} -> ${to.alpha}; " + + "bounds: ${from.bounds} -> ${to.bounds}; ", ) } @@ -190,11 +217,11 @@ class ClockSizeTransition( this@VisibilityBoundsTransition.addListener( object : TransitionListenerAdapter() { override fun onTransitionStart(t: Transition) { - toView.viewTreeObserver.addOnPreDrawListener(predrawCallback) + to.view.viewTreeObserver.addOnPreDrawListener(predrawCallback) } override fun onTransitionEnd(t: Transition) { - toView.viewTreeObserver.removeOnPreDrawListener(predrawCallback) + to.view.viewTreeObserver.removeOnPreDrawListener(predrawCallback) } } ) @@ -202,17 +229,17 @@ class ClockSizeTransition( val listener = object : AnimatorListenerAdapter() { override fun onAnimationStart(anim: Animator) { - assignAnimValues("start", 0f, fromVis) + assignAnimValues("start", 0f, from.visibility) } override fun onAnimationEnd(anim: Animator) { - assignAnimValues("end", 1f, toVis) - if (sendToBack) toView.translationZ = 0f + assignAnimValues("end", 1f, to.visibility) + if (sendToBack) to.view.translationZ = 0f } } anim.addListener(listener) - assignAnimValues("init", 0f, fromVis) + assignAnimValues("init", 0f, from.visibility) } } @@ -251,31 +278,23 @@ class ClockSizeTransition( } } - override fun mutateBounds( - view: View, - fromIsVis: Boolean, - toIsVis: Boolean, - fromBounds: Rect, - toBounds: Rect, - fromSSBounds: Rect?, - toSSBounds: Rect?, - ) { + override fun initTargets(from: Target, to: Target) { // Move normally if clock is not changing visibility - if (fromIsVis == toIsVis) return + if (from.isVisible == to.isVisible) return - fromBounds.set(toBounds) + from.bounds.set(to.bounds) if (isLargeClock) { // Large clock shouldn't move; fromBounds already set - } else if (toSSBounds != null && fromSSBounds != null) { + } else if (to.ssBounds != null && from.ssBounds != null) { // Instead of moving the small clock the full distance, we compute the distance // smartspace will move. We then scale this to match the duration of this animation // so that the small clock moves at the same speed as smartspace. val ssTranslation = - abs((toSSBounds.top - fromSSBounds.top) * smallClockMoveScale).toInt() - fromBounds.top = toBounds.top - ssTranslation - fromBounds.bottom = toBounds.bottom - ssTranslation + abs((to.ssBounds!!.top - from.ssBounds!!.top) * smallClockMoveScale).toInt() + from.bounds.top = to.bounds.top - ssTranslation + from.bounds.bottom = to.bounds.bottom - ssTranslation } else { - Log.e(TAG, "mutateBounds: smallClock received no smartspace bounds") + Log.e(TAG, "initTargets: smallClock received no smartspace bounds") } } } @@ -320,10 +339,9 @@ class ClockSizeTransition( } } - // TODO: Might need a mechanism to update this one while in-progress class SmartspaceMoveTransition( val config: IntraBlueprintTransition.Config, - viewModel: KeyguardClockViewModel, + val viewModel: KeyguardClockViewModel, ) : VisibilityBoundsTransition() { private val isLargeClock = viewModel.isLargeClockVisible.value override val captureSmartspace = false @@ -340,23 +358,23 @@ class ClockSizeTransition( addTarget(R.id.status_view_media_container) } - override fun mutateBounds( - view: View, - fromIsVis: Boolean, - toIsVis: Boolean, - fromBounds: Rect, - toBounds: Rect, - fromSSBounds: Rect?, - toSSBounds: Rect?, - ) { + override fun initTargets(from: Target, to: Target) { // If view is changing visibility, hold it in place - if (fromIsVis == toIsVis) return - if (DEBUG) Log.i(TAG, "Holding position of ${view.id}") + if (from.isVisible == to.isVisible) return + if (DEBUG) Log.i(TAG, "Holding position of ${to.view.id}") - if (fromIsVis) { - toBounds.set(fromBounds) + if (from.isVisible) { + to.bounds.set(from.bounds) } else { - fromBounds.set(toBounds) + from.bounds.set(to.bounds) + } + } + + override fun mutateTargets(from: Target, to: Target) { + if (to.view.id == sharedR.id.date_smartspace_view) { + to.isVisible = !viewModel.hasCustomWeatherDataDisplay.value + to.visibility = if (to.isVisible) View.VISIBLE else View.GONE + to.alpha = if (to.isVisible) 1f else 0f } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java index 8f04896fbb45..645bd0b4b441 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java @@ -18,6 +18,7 @@ package com.android.systemui.navigationbar; import static com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler.DEBUG_MISSING_GESTURE_TAG; import static com.android.systemui.shared.recents.utilities.Utilities.isLargeScreen; +import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.wm.shell.Flags.enableTaskbarNavbarUnification; import static com.android.wm.shell.Flags.enableTaskbarOnPhones; @@ -273,6 +274,11 @@ public class NavigationBarControllerImpl implements private final CommandQueue.Callbacks mCommandQueueCallbacks = new CommandQueue.Callbacks() { @Override public void onDisplayRemoved(int displayId) { + onDisplayRemoveSystemDecorations(displayId); + } + + @Override + public void onDisplayRemoveSystemDecorations(int displayId) { removeNavigationBar(displayId); mHasNavBar.delete(displayId); } @@ -309,6 +315,13 @@ public class NavigationBarControllerImpl implements navBarView.showPinningEscapeToast(); } } + + @Override + public void setHasNavigationBar(int displayId, boolean hasNavigationBar) { + if (enableDisplayContentModeManagement()) { + mHasNavBar.put(displayId, hasNavigationBar); + } + } }; /** diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index 9270fff61c43..05d8bff2ceb6 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -17,7 +17,7 @@ package com.android.systemui.navigationbar; import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; -import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; +import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; @@ -361,7 +361,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mSysUiState.setFlag(SYSUI_STATE_A11Y_BUTTON_CLICKABLE, clickable) .setFlag(SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE, longClickable) .setFlag(SYSUI_STATE_IME_SHOWING, - (mNavigationIconHints & NAVIGATION_HINT_BACK_ALT) != 0) + (mNavigationIconHints & NAVIGATION_HINT_IME_SHOWN) != 0) .setFlag(SYSUI_STATE_IME_SWITCHER_SHOWING, (mNavigationIconHints & NAVIGATION_HINT_IME_SWITCHER_SHOWN) != 0) .setFlag(SYSUI_STATE_OVERVIEW_DISABLED, diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java index c098b1675b87..c78750718cf0 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java @@ -17,7 +17,7 @@ package com.android.systemui.navigationbar.views; import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; -import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; +import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; @@ -1681,7 +1681,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements .setFlag(SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE, longClickable) .setFlag(SYSUI_STATE_NAV_BAR_HIDDEN, !isNavBarWindowVisible()) .setFlag(SYSUI_STATE_IME_SHOWING, - (mNavigationIconHints & NAVIGATION_HINT_BACK_ALT) != 0) + (mNavigationIconHints & NAVIGATION_HINT_IME_SHOWN) != 0) .setFlag(SYSUI_STATE_IME_SWITCHER_SHOWING, (mNavigationIconHints & NAVIGATION_HINT_IME_SWITCHER_SHOWN) != 0) .setFlag(SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY, @@ -1938,9 +1938,9 @@ public class NavigationBar extends ViewController<NavigationBarView> implements final boolean oldBackAlt = (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0; if (newBackAlt != oldBackAlt) { - mView.onImeVisibilityChanged(newBackAlt); - mImeVisible = newBackAlt; + mView.onBackAltChanged(newBackAlt); } + mImeVisible = (hints & NAVIGATION_HINT_IME_SHOWN) != 0; mView.setNavigationIconHints(hints); } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBarView.java index c4abcd2afc4f..d5ae72165c4a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBarView.java @@ -561,8 +561,15 @@ public class NavigationBarView extends FrameLayout { updateNavButtonIcons(); } - void onImeVisibilityChanged(boolean visible) { - if (!visible) { + /** + * Called when the boolean value of whether to adjust the back button for the IME changed. + * + * @param useBackAlt whether to adjust the back button for the IME. + * + * @see android.inputmethodservice.InputMethodService.BackDispositionMode + */ + void onBackAltChanged(boolean useBackAlt) { + if (!useBackAlt) { mTransitionListener.onBackAltCleared(); } } diff --git a/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt index 4fe63379aed4..8aad61a8c7cb 100644 --- a/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt @@ -52,6 +52,13 @@ constructor( private val hydrator = Hydrator("NotificationsShadeOverlayContentViewModel.hydrator") + val isShadeLayoutWide: Boolean by + hydrator.hydratedStateOf( + traceName = "isShadeLayoutWide", + initialValue = shadeInteractor.isShadeLayoutWide.value, + source = shadeInteractor.isShadeLayoutWide, + ) + val showHeader: Boolean by hydrator.hydratedStateOf( traceName = "showHeader", diff --git a/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt b/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt index 3fd9803882ed..4a9e72f23446 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt @@ -30,6 +30,7 @@ import javax.inject.Inject import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.shade.ShadeViewProviderModule.Companion.SHADE_HEADER +import com.android.systemui.shade.domain.interactor.ShadeDialogContextInteractor import com.android.systemui.statusbar.policy.DeviceProvisionedController import javax.inject.Named @@ -63,7 +64,8 @@ class HeaderPrivacyIconsController @Inject constructor( private val broadcastDispatcher: BroadcastDispatcher, private val safetyCenterManager: SafetyCenterManager, private val deviceProvisionedController: DeviceProvisionedController, - private val featureFlags: FeatureFlags + private val featureFlags: FeatureFlags, + private val shadeDialogContextInteractor: ShadeDialogContextInteractor, ) { var chipVisibilityListener: ChipVisibilityListener? = null @@ -75,6 +77,8 @@ class HeaderPrivacyIconsController @Inject constructor( private val cameraSlot = privacyChip.resources.getString(R.string.status_bar_camera) private val micSlot = privacyChip.resources.getString(R.string.status_bar_microphone) private val locationSlot = privacyChip.resources.getString(R.string.status_bar_location) + private val dialogContext: Context + get() = shadeDialogContextInteractor.context private val safetyCenterReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { @@ -149,12 +153,12 @@ class HeaderPrivacyIconsController @Inject constructor( uiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_CLICK) if (safetyCenterEnabled) { if (featureFlags.isEnabled(Flags.ENABLE_NEW_PRIVACY_DIALOG)) { - privacyDialogControllerV2.showDialog(privacyChip.context, privacyChip) + privacyDialogControllerV2.showDialog(dialogContext, privacyChip) } else { showSafetyCenter() } } else { - privacyDialogController.showDialog(privacyChip.context) + privacyDialogController.showDialog(dialogContext) } } setChipVisibility(privacyChip.visibility == View.VISIBLE) diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt index 6d9078432ae0..07de4662e82f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt @@ -102,6 +102,7 @@ import com.android.compose.modifiers.thenIf import com.android.compose.theme.PlatformTheme import com.android.mechanics.GestureContext import com.android.systemui.Dumpable +import com.android.systemui.Flags import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer import com.android.systemui.compose.modifiers.sysuiResTag import com.android.systemui.dump.DumpManager @@ -252,12 +253,14 @@ constructor( Box( modifier = Modifier.graphicsLayer { alpha = viewModel.viewAlpha } - // Clipping before translation to match QSContainerImpl.onDraw - .offset { - IntOffset( - x = 0, - y = viewModel.viewTranslationY.fastRoundToInt(), - ) + .thenIf(!Flags.notificationShadeBlur()) { + // Clipping before translation to match QSContainerImpl.onDraw + Modifier.offset { + IntOffset( + x = 0, + y = viewModel.viewTranslationY.fastRoundToInt(), + ) + } } .thenIf(notificationScrimClippingParams.isEnabled) { Modifier.notificationScrimClip { diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/TileDetails.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/TileDetails.kt index 1bfbbe1964dc..30fb50db82a2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/TileDetails.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/TileDetails.kt @@ -38,12 +38,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.em import com.android.systemui.qs.flags.QsDetailedView import com.android.systemui.qs.panels.ui.viewmodel.DetailsViewModel @Composable -fun TileDetails(detailsViewModel: DetailsViewModel) { +fun TileDetails(modifier: Modifier = Modifier, detailsViewModel: DetailsViewModel) { if (!QsDetailedView.isEnabled) { throw IllegalStateException("QsDetailedView should be enabled") @@ -54,10 +53,11 @@ fun TileDetails(detailsViewModel: DetailsViewModel) { DisposableEffect(Unit) { onDispose { detailsViewModel.closeDetailedView() } } Column( - modifier = Modifier - .fillMaxWidth() - // The height of the details view is TBD. - .fillMaxHeight() + modifier = + modifier + .fillMaxWidth() + // The height of the details view is TBD. + .fillMaxHeight() ) { CompositionLocalProvider( value = LocalContentColor provides MaterialTheme.colorScheme.onSurfaceVariant @@ -65,15 +65,14 @@ fun TileDetails(detailsViewModel: DetailsViewModel) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { - IconButton( onClick = { detailsViewModel.closeDetailedView() }, - modifier = Modifier - .align(Alignment.CenterVertically) - .height(TileDetailsDefaults.IconHeight) - .padding(start = TileDetailsDefaults.IconPadding), + modifier = + Modifier.align(Alignment.CenterVertically) + .height(TileDetailsDefaults.IconHeight) + .padding(start = TileDetailsDefaults.IconPadding), ) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, @@ -83,17 +82,16 @@ fun TileDetails(detailsViewModel: DetailsViewModel) { } Text( text = tileDetailedViewModel.getTitle(), - modifier = Modifier - .align(Alignment.CenterVertically), + modifier = Modifier.align(Alignment.CenterVertically), textAlign = TextAlign.Center, - style = MaterialTheme.typography.titleLarge + style = MaterialTheme.typography.titleLarge, ) IconButton( onClick = { tileDetailedViewModel.clickOnSettingsButton() }, - modifier = Modifier - .align(Alignment.CenterVertically) - .height(TileDetailsDefaults.IconHeight) - .padding(end = TileDetailsDefaults.IconPadding), + modifier = + Modifier.align(Alignment.CenterVertically) + .height(TileDetailsDefaults.IconHeight) + .padding(end = TileDetailsDefaults.IconPadding), ) { Icon( imageVector = Icons.Default.Settings, @@ -104,11 +102,9 @@ fun TileDetails(detailsViewModel: DetailsViewModel) { } Text( text = tileDetailedViewModel.getSubTitle(), - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, - style = MaterialTheme.typography.titleSmall - + style = MaterialTheme.typography.titleSmall, ) } tileDetailedViewModel.GetContentView() diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.kt index 91d907952bc6..c7db04a6b7b2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.kt @@ -16,6 +16,7 @@ package com.android.systemui.qs.ui.viewmodel +import androidx.compose.runtime.getValue import com.android.systemui.brightness.ui.viewmodel.BrightnessSliderViewModel import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.qs.panels.ui.viewmodel.DetailsViewModel @@ -23,6 +24,7 @@ import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel import com.android.systemui.qs.panels.ui.viewmodel.QuickQuickSettingsViewModel import com.android.systemui.qs.panels.ui.viewmodel.TileGridViewModel import com.android.systemui.qs.panels.ui.viewmodel.toolbar.ToolbarViewModel +import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -35,6 +37,7 @@ class QuickSettingsContainerViewModel constructor( brightnessSliderViewModelFactory: BrightnessSliderViewModel.Factory, quickQuickSettingsViewModelFactory: QuickQuickSettingsViewModel.Factory, + shadeHeaderViewModelFactory: ShadeHeaderViewModel.Factory, @Assisted supportsBrightnessMirroring: Boolean, val tileGridViewModel: TileGridViewModel, val editModeViewModel: EditModeViewModel, @@ -47,10 +50,13 @@ constructor( val quickQuickSettingsViewModel = quickQuickSettingsViewModelFactory.create() + val shadeHeaderViewModel = shadeHeaderViewModelFactory.create() + override suspend fun onActivated(): Nothing { coroutineScope { launch { brightnessSliderViewModel.activate() } launch { quickQuickSettingsViewModel.activate() } + launch { shadeHeaderViewModel.activate() } awaitCancellation() } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt index a108bc2c4a8c..d9df1ef36847 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt @@ -52,6 +52,13 @@ constructor( private val hydrator = Hydrator("QuickSettingsContainerViewModel.hydrator") + val isShadeLayoutWide: Boolean by + hydrator.hydratedStateOf( + traceName = "isShadeLayoutWide", + initialValue = shadeInteractor.isShadeLayoutWide.value, + source = shadeInteractor.isShadeLayoutWide, + ) + val showHeader: Boolean by hydrator.hydratedStateOf( traceName = "showHeader", @@ -61,6 +68,13 @@ constructor( val quickSettingsContainerViewModel = quickSettingsContainerViewModelFactory.create(false) + val showQuickSettingsOverlayHeader: Boolean by + hydrator.hydratedStateOf( + traceName = "showQuickSettingsOverlayHeader", + initialValue = shadeInteractor.isShadeLayoutWide.value, + source = shadeInteractor.isShadeLayoutWide, + ) + override suspend fun onActivated(): Nothing { coroutineScope { launch { hydrator.activate() } diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/resolver/HomeSceneFamilyResolver.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/resolver/HomeSceneFamilyResolver.kt index 2a0a22f32601..6e79d568761f 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/resolver/HomeSceneFamilyResolver.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/resolver/HomeSceneFamilyResolver.kt @@ -18,6 +18,7 @@ package com.android.systemui.scene.domain.resolver +import android.util.Log import com.android.compose.animation.scene.SceneKey import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application @@ -85,8 +86,8 @@ constructor( isUnlocked: Boolean, isDreamingWithOverlay: Boolean, isAbleToDream: Boolean, - ): SceneKey = - when { + ): SceneKey { + val result = when { // Dream can run even if Keyguard is disabled, thus it has the highest priority here. isDreamingWithOverlay && isAbleToDream -> Scenes.Dream !isKeyguardEnabled -> Scenes.Gone @@ -95,8 +96,21 @@ constructor( !isUnlocked -> Scenes.Lockscreen else -> Scenes.Gone } + Log.d(TAG, "homeScene emitting $result, values:") + Log.d(TAG, " isKeyguardEnabled=$isKeyguardEnabled") + Log.d(TAG, " canSwipeToEnter=$canSwipeToEnter") + Log.d(TAG, " isDeviceEntered=$isDeviceEntered" ) + Log.d(TAG, " isUnlocked=$isUnlocked") + Log.d(TAG, " isDreamingWithOverlay=$isDreamingWithOverlay") + Log.d(TAG, " isAbleToDream=$isAbleToDream") + Log.d(TAG, "") + return result + } companion object { + + private const val TAG = "HomeSceneFamilyResolver" + val homeScenes = setOf( Scenes.Gone, diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt index 8657c1723507..ecd002705c60 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt @@ -564,7 +564,7 @@ constructor( .collect { switchToScene( targetSceneKey = Scenes.Lockscreen, - loggingReason = "device became non-interactive", + loggingReason = "device became non-interactive (SceneContainerStartable)", ) } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTracker.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTracker.kt index ec9bba7c1f0f..13b540aa54ba 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTracker.kt @@ -16,7 +16,6 @@ package com.android.systemui.shade import android.util.Log -import android.view.Display import com.android.app.tracing.coroutines.TrackTracer import com.android.internal.util.LatencyTracker import com.android.systemui.common.ui.data.repository.ConfigurationRepository @@ -32,11 +31,9 @@ import javax.inject.Inject import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeout @@ -73,12 +70,7 @@ constructor( /** * We need to keep this always up to date eagerly to avoid delays receiving the new display ID. */ - private val onMovedToDisplayFlow: StateFlow<Int> = - configurationRepository.onMovedToDisplay.stateIn( - bgScope, - SharingStarted.Eagerly, - Display.DEFAULT_DISPLAY, - ) + private val onMovedToDisplayFlow: StateFlow<Int> = configurationRepository.onMovedToDisplay private var previousJob: Job? = null diff --git a/packages/SystemUI/src/com/android/systemui/shade/display/ShadeDisplayPolicy.kt b/packages/SystemUI/src/com/android/systemui/shade/display/ShadeDisplayPolicy.kt index d53f9f7ec595..bf5deff5cff5 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/display/ShadeDisplayPolicy.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/display/ShadeDisplayPolicy.kt @@ -56,7 +56,7 @@ interface ShadeExpansionIntent { @Module interface ShadeDisplayPolicyModule { - @Binds fun provideDefaultPolicy(impl: StatusBarTouchShadeDisplayPolicy): ShadeDisplayPolicy + @Binds fun provideDefaultPolicy(impl: DefaultDisplayShadePolicy): ShadeDisplayPolicy @Binds fun provideShadeExpansionIntent(impl: StatusBarTouchShadeDisplayPolicy): ShadeExpansionIntent diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PrivacyChipInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PrivacyChipInteractor.kt index 4c6c31809275..0caeead17cd5 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PrivacyChipInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PrivacyChipInteractor.kt @@ -41,6 +41,7 @@ constructor( private val privacyDialogController: PrivacyDialogController, private val privacyDialogControllerV2: PrivacyDialogControllerV2, private val deviceProvisionedController: DeviceProvisionedController, + private val shadeDialogContextInteractor: ShadeDialogContextInteractor, ) { /** The list of PrivacyItems to be displayed by the privacy chip. */ val privacyItems: StateFlow<List<PrivacyItem>> = repository.privacyItems @@ -80,9 +81,9 @@ constructor( if (!deviceProvisionedController.isDeviceProvisioned) return if (repository.isSafetyCenterEnabled.value) { - privacyDialogControllerV2.showDialog(privacyChip.context, privacyChip) + privacyDialogControllerV2.showDialog(shadeDialogContextInteractor.context, privacyChip) } else { - privacyDialogController.showDialog(privacyChip.context) + privacyDialogController.showDialog(shadeDialogContextInteractor.context) } } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt index fc26499a27a7..f91a68fd5e1c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt @@ -20,24 +20,33 @@ import android.util.Log import android.window.WindowContext import androidx.annotation.UiThread import com.android.app.tracing.coroutines.launchTraced -import com.android.app.tracing.traceSection import com.android.systemui.CoreStartable +import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.ShadeDisplayChangeLatencyTracker import com.android.systemui.shade.ShadeTraceLogger.logMoveShadeWindowTo +import com.android.systemui.shade.ShadeTraceLogger.t import com.android.systemui.shade.ShadeTraceLogger.traceReparenting import com.android.systemui.shade.data.repository.ShadeDisplaysRepository import com.android.systemui.shade.display.ShadeExpansionIntent import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround +import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor +import com.android.systemui.statusbar.notification.row.NotificationRebindingTracker +import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHider +import com.android.systemui.util.kotlin.getOrNull import com.android.window.flags.Flags import java.util.Optional import javax.inject.Inject import kotlin.coroutines.CoroutineContext +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.first import kotlinx.coroutines.withContext +import kotlinx.coroutines.withTimeoutOrNull /** Handles Shade window display change when [ShadeDisplaysRepository.displayId] changes. */ @SysUISingleton @@ -46,22 +55,22 @@ class ShadeDisplaysInteractor constructor( private val shadePositionRepository: ShadeDisplaysRepository, @ShadeDisplayAware private val shadeContext: WindowContext, + @ShadeDisplayAware private val configurationRepository: ConfigurationRepository, @Background private val bgScope: CoroutineScope, @Main private val mainThreadContext: CoroutineContext, private val shadeDisplayChangeLatencyTracker: ShadeDisplayChangeLatencyTracker, shadeExpandedInteractor: Optional<ShadeExpandedStateInteractor>, private val shadeExpansionIntent: ShadeExpansionIntent, + private val activeNotificationsInteractor: ActiveNotificationsInteractor, + private val notificationRebindingTracker: NotificationRebindingTracker, + notificationStackRebindingHider: Optional<NotificationStackRebindingHider>, ) : CoreStartable { - private val shadeExpandedInteractor = - shadeExpandedInteractor.orElse(null) - ?: error( - """ - ShadeExpandedStateInteractor must be provided for ShadeDisplaysInteractor to work. - If it is not, it means this is being instantiated in a SystemUI variant that shouldn't. - """ - .trimIndent() - ) + private val shadeExpandedInteractor = requireOptional(shadeExpandedInteractor) + private val notificationStackRebindingHider = requireOptional(notificationStackRebindingHider) + + private val hasActiveNotifications: Boolean + get() = activeNotificationsInteractor.areAnyNotificationsPresentValue override fun start() { ShadeWindowGoesAround.isUnexpectedlyInLegacyMode() @@ -91,7 +100,7 @@ constructor( try { withContext(mainThreadContext) { traceReparenting { - collapseAndExpandShadeIfNeeded { + collapseAndExpandShadeIfNeeded(destinationId) { shadeDisplayChangeLatencyTracker.onShadeDisplayChanging(destinationId) reparentToDisplayId(id = destinationId) } @@ -107,16 +116,68 @@ constructor( } } - private suspend fun collapseAndExpandShadeIfNeeded(wrapped: () -> Unit) { + private suspend fun collapseAndExpandShadeIfNeeded(newDisplayId: Int, reparent: () -> Unit) { val previouslyExpandedElement = shadeExpandedInteractor.currentlyExpandedElement.value previouslyExpandedElement?.collapse(reason = COLLAPSE_EXPAND_REASON) + val notificationStackHidden = + if (!hasActiveNotifications) { + false + } else { + // Hiding as otherwise there might be flickers as the inflation with new dimensions + // happens async and views with the old dimensions are not removed until the + // inflation succeeds. + notificationStackRebindingHider.setVisible(visible = false, animated = false) + true + } - wrapped() + reparent() + val elementToExpand = + shadeExpansionIntent.consumeExpansionIntent() ?: previouslyExpandedElement // If the user was trying to expand a specific shade element, let's make sure to expand // that one. Otherwise, we can just re-expand the previous expanded element. - shadeExpansionIntent.consumeExpansionIntent()?.expand(COLLAPSE_EXPAND_REASON) - ?: previouslyExpandedElement?.expand(reason = COLLAPSE_EXPAND_REASON) + elementToExpand?.expand(COLLAPSE_EXPAND_REASON) + + if (notificationStackHidden) { + if (hasActiveNotifications) { + // "onMovedToDisplay" is what synchronously triggers the rebinding of views: we need + // to wait for it to be received. + waitForOnMovedToDisplayDispatchedToView(newDisplayId) + waitForNotificationsRebinding() + } + notificationStackRebindingHider.setVisible(visible = true, animated = true) + } + } + + private suspend fun waitForOnMovedToDisplayDispatchedToView(newDisplayId: Int) { + withContext(bgScope.coroutineContext) { + t.traceAsync({ + "waitForOnMovedToDisplayDispatchedToView(newDisplayId=$newDisplayId)" + }) { + withTimeoutOrNull(TIMEOUT) { + configurationRepository.onMovedToDisplay.filter { it == newDisplayId }.first() + t.instant { "onMovedToDisplay received with $newDisplayId" } + } + ?: errorLog( + "Timed out while waiting for onMovedToDisplay to be dispatched to " + + "the shade root view in ShadeDisplaysInteractor" + ) + } + } + } + + private suspend fun waitForNotificationsRebinding() { + // here we don't need to wait for rebinding to appear (e.g. going > 0), as it already + // happened synchronously when the new configuration was received by ViewConfigCoordinator. + t.traceAsync("waiting for notifications rebinding to finish") { + withTimeoutOrNull(TIMEOUT) { + notificationRebindingTracker.rebindingInProgressCount.first { it == 0 } + } ?: errorLog("Timed out while waiting for inflations to finish") + } + } + + private fun errorLog(s: String) { + Log.e(TAG, s) } private fun checkContextDisplayMatchesExpected(destinationId: Int) { @@ -133,11 +194,33 @@ constructor( @UiThread private fun reparentToDisplayId(id: Int) { - traceSection({ "reparentToDisplayId(id=$id)" }) { shadeContext.reparentToDisplay(id) } + t.traceSyncAndAsync({ "reparentToDisplayId(id=$id)" }) { + shadeContext.reparentToDisplay(id) + } } private companion object { const val TAG = "ShadeDisplaysInteractor" const val COLLAPSE_EXPAND_REASON = "Shade window move" + val TIMEOUT = 1.seconds + + /** + * [ShadeDisplaysInteractor] is bound in the SystemUI module for all variants, but needs + * some specific dependencies to be bound from each variant (e.g. + * [ShadeExpandedStateInteractor] or [NotificationStackRebindingHider]). When those are not + * bound, this class is not expected to be instantiated, and trying to instantiate it would + * crash. + */ + inline fun <reified T> requireOptional(optional: Optional<T>): T { + return optional.getOrNull() + ?: error( + """ + ${T::class.java.simpleName} must be provided for ShadeDisplaysInteractor to work. + If it is not, it means this is being instantiated in a SystemUI variant that + shouldn't. + """ + .trimIndent() + ) + } } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt index a653ca2f80a9..b5e171043741 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt @@ -16,6 +16,7 @@ package com.android.systemui.shade.domain.interactor +import android.util.Log import com.android.app.tracing.coroutines.flow.flowName import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application @@ -38,6 +39,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn /** The non-empty SceneInteractor implementation. */ @@ -98,18 +100,36 @@ constructor( override val isShadeTouchable: Flow<Boolean> = combine( - powerInteractor.isAsleep, - keyguardTransitionInteractor.isInTransition(Edge.create(to = KeyguardState.AOD)), - keyguardRepository.dozeTransitionModel.map { it.to == DozeStateModel.DOZE_PULSING }, - ) { isAsleep, goingToSleep, isPulsing -> - when { - // If the device is going to sleep, only accept touches if we're still - // animating - goingToSleep -> dozeParams.shouldControlScreenOff() + powerInteractor.isAsleep + .onEach { Log.d(TAG, "isShadeTouchable: upstream isAsleep=$it") }, + keyguardTransitionInteractor + .isInTransition(Edge.create(to = KeyguardState.AOD)) + .onEach { + Log.d( + TAG, + "isShadeTouchable: upstream isTransitioningToAod=$it", + ) + }, + keyguardRepository.dozeTransitionModel + .map { it.to == DozeStateModel.DOZE_PULSING } + .onEach { + Log.d(TAG, "isShadeTouchable: upstream isPulsing=$it") + }, + ) { isAsleep, isTransitioningToAod, isPulsing -> + val downstream = when { + // If the device is transitioning to AOD, only accept touches if + // still animating. + isTransitioningToAod -> dozeParams.shouldControlScreenOff() // If the device is asleep, only accept touches if there's a pulse isAsleep -> isPulsing else -> true } + Log.d(TAG, "isShadeTouchable emitting $downstream, values:") + Log.d(TAG, " isAsleep=$isAsleep") + Log.d(TAG, " isTransitioningToAod=$isTransitioningToAod") + Log.d(TAG, " isPulsing=$isPulsing") + Log.d(TAG, "") + downstream } override val isExpandToQsEnabled: Flow<Boolean> = @@ -128,4 +148,8 @@ constructor( disableFlags.isQuickSettingsEnabled() && !isDozing } + + companion object { + private const val TAG = "ShadeInteractor" + } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt index 765810810bb8..992385c8d80e 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt @@ -199,11 +199,14 @@ constructor( ) } else if (transitionKey == Instant) { // TODO(b/356596436): Define instant transition instead of snapToScene(). - sceneInteractor.snapToScene(toScene = SceneFamilies.Home, loggingReason = loggingReason) + sceneInteractor.snapToScene( + toScene = SceneFamilies.Home, + loggingReason = loggingReason + " (collapseNotificationsShade)", + ) } else { sceneInteractor.changeScene( toScene = SceneFamilies.Home, - loggingReason = loggingReason, + loggingReason = loggingReason + " (collapseNotificationsShade)", transitionKey = transitionKey ?: ToSplitShade.takeIf { shadeModeInteractor.isSplitShade }, ) @@ -230,11 +233,14 @@ constructor( if (bypassNotificationsShade || isSplitShade) SceneFamilies.Home else Scenes.Shade if (transitionKey == Instant) { // TODO(b/356596436): Define instant transition instead of snapToScene(). - sceneInteractor.snapToScene(toScene = targetScene, loggingReason = loggingReason) + sceneInteractor.snapToScene( + toScene = targetScene, + loggingReason = loggingReason + " (collapseQuickSettingsShade)", + ) } else { sceneInteractor.changeScene( toScene = targetScene, - loggingReason = loggingReason, + loggingReason = loggingReason + " (collapseQuickSettingsShade)", transitionKey = transitionKey ?: ToSplitShade.takeIf { isSplitShade }, ) } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt index 0d847d84c820..96128df1b723 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt @@ -23,18 +23,23 @@ import android.icu.text.DateFormat import android.icu.text.DisplayContext import android.os.UserHandle import android.provider.Settings +import androidx.compose.runtime.getValue import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.lifecycle.Hydrator import com.android.systemui.plugins.ActivityStarter import com.android.systemui.privacy.OngoingPrivacyChip import com.android.systemui.privacy.PrivacyItem import com.android.systemui.res.R +import com.android.systemui.scene.domain.interactor.SceneInteractor +import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.TransitionKeys.SlightlyFasterShadeCollapse import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.domain.interactor.PrivacyChipInteractor import com.android.systemui.shade.domain.interactor.ShadeHeaderClockInteractor import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.shade.shared.model.ShadeMode import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import dagger.assisted.AssistedFactory @@ -56,6 +61,7 @@ class ShadeHeaderViewModel constructor( @ShadeDisplayAware context: Context, private val activityStarter: ActivityStarter, + private val sceneInteractor: SceneInteractor, private val shadeInteractor: ShadeInteractor, private val mobileIconsInteractor: MobileIconsInteractor, val mobileIconsViewModel: MobileIconsViewModel, @@ -63,6 +69,35 @@ constructor( private val clockInteractor: ShadeHeaderClockInteractor, private val broadcastDispatcher: BroadcastDispatcher, ) : ExclusiveActivatable() { + private val hydrator = Hydrator("ShadeHeaderViewModel.hydrator") + + val highlightNotificationIcons: Boolean by + hydrator.hydratedStateOf( + traceName = "highlightNotificationIcons", + initialValue = false, + source = + sceneInteractor.currentOverlays.map { overlays -> + Overlays.NotificationsShade in overlays + }, + ) + + val highlightQuickSettingsIcons: Boolean by + hydrator.hydratedStateOf( + traceName = "highlightQuickSettingsIcons", + initialValue = false, + source = + sceneInteractor.currentOverlays.map { overlays -> + Overlays.QuickSettingsShade in overlays + }, + ) + + val isShadeLayoutWide: Boolean by + hydrator.hydratedStateOf( + traceName = "isShadeLayoutWide", + initialValue = shadeInteractor.isShadeLayoutWide.value, + source = shadeInteractor.isShadeLayoutWide, + ) + /** True if there is exactly one mobile connection. */ val isSingleCarrier: StateFlow<Boolean> = mobileIconsInteractor.isSingleCarrier @@ -128,6 +163,8 @@ constructor( .collect { _mobileSubIds.value = it } } + launch { hydrator.activate() } + awaitCancellation() } } @@ -143,11 +180,41 @@ constructor( } /** Notifies that the system icons container was clicked. */ - fun onSystemIconContainerClicked() { - shadeInteractor.collapseEitherShade( - loggingReason = "ShadeHeaderViewModel.onSystemIconContainerClicked", - transitionKey = SlightlyFasterShadeCollapse, - ) + fun onNotificationIconChipClicked() { + if (shadeInteractor.shadeMode.value !is ShadeMode.Dual) { + return + } + val loggingReason = "ShadeHeaderViewModel.onNotificationIconChipClicked" + val currentOverlays = sceneInteractor.currentOverlays.value + if (Overlays.NotificationsShade in currentOverlays) { + shadeInteractor.collapseNotificationsShade( + loggingReason = loggingReason, + transitionKey = SlightlyFasterShadeCollapse, + ) + } else { + shadeInteractor.expandNotificationsShade(loggingReason) + } + } + + /** Notifies that the system icons container was clicked. */ + fun onSystemIconChipClicked() { + val loggingReason = "ShadeHeaderViewModel.onSystemIconChipClicked" + if (shadeInteractor.shadeMode.value is ShadeMode.Dual) { + val currentOverlays = sceneInteractor.currentOverlays.value + if (Overlays.QuickSettingsShade in currentOverlays) { + shadeInteractor.collapseQuickSettingsShade( + loggingReason = loggingReason, + transitionKey = SlightlyFasterShadeCollapse, + ) + } else { + shadeInteractor.expandQuickSettingsShade(loggingReason) + } + } else { + shadeInteractor.collapseEitherShade( + loggingReason = loggingReason, + transitionKey = SlightlyFasterShadeCollapse, + ) + } } /** Notifies that the shadeCarrierGroup was clicked. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index c6a4d15705f0..7fc1510f1136 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -184,6 +184,8 @@ public class CommandQueue extends IStatusBar.Stub implements private static final int MSG_SET_SPLITSCREEN_FOCUS = 81 << MSG_SHIFT; private static final int MSG_TOGGLE_QUICK_SETTINGS_PANEL = 82 << MSG_SHIFT; private static final int MSG_WALLET_ACTION_LAUNCH_GESTURE = 83 << MSG_SHIFT; + private static final int MSG_SET_HAS_NAVIGATION_BAR = 84 << MSG_SHIFT; + private static final int MSG_DISPLAY_REMOVE_SYSTEM_DECORATIONS = 85 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; public static final int FLAG_EXCLUDE_RECENTS_PANEL = 1 << 1; @@ -419,6 +421,12 @@ public class CommandQueue extends IStatusBar.Stub implements } /** + * @see IStatusBar#onDisplayRemoveSystemDecorations(int) + */ + default void onDisplayRemoveSystemDecorations(int displayId) { + } + + /** * @see DisplayTracker.Callback#onDisplayRemoved(int) */ default void onDisplayRemoved(int displayId) { @@ -580,6 +588,12 @@ public class CommandQueue extends IStatusBar.Stub implements * @see IStatusBar#moveFocusedTaskToDesktop(int) */ default void moveFocusedTaskToDesktop(int displayId) {} + + /** + * @see IStatusBar#setHasNavigationBar(int, boolean) + */ + default void setHasNavigationBar(int displayId, boolean hasNavigationBar) { + } } @VisibleForTesting @@ -1197,6 +1211,14 @@ public class CommandQueue extends IStatusBar.Stub implements } } + @Override + public void onDisplayRemoveSystemDecorations(int displayId) { + synchronized (mLock) { + mHandler.obtainMessage(MSG_DISPLAY_REMOVE_SYSTEM_DECORATIONS, displayId, 0) + .sendToTarget(); + } + } + // This was previously called from WM, but is now called from WMShell public void onRecentsAnimationStateChanged(boolean running) { synchronized (mLock) { @@ -1510,6 +1532,15 @@ public class CommandQueue extends IStatusBar.Stub implements mHandler.obtainMessage(MSG_ENTER_DESKTOP, args).sendToTarget(); } + @Override + public void setHasNavigationBar(int displayId, boolean hasNavigationBar) { + synchronized (mLock) { + mHandler.obtainMessage(MSG_SET_HAS_NAVIGATION_BAR, displayId, + hasNavigationBar ? 1 : 0).sendToTarget(); + } + } + + private final class H extends Handler { private H(Looper l) { super(l); @@ -1825,6 +1856,11 @@ public class CommandQueue extends IStatusBar.Stub implements mCallbacks.get(i).onDisplayReady(msg.arg1); } break; + case MSG_DISPLAY_REMOVE_SYSTEM_DECORATIONS: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).onDisplayRemoveSystemDecorations(msg.arg1); + } + break; case MSG_RECENTS_ANIMATION_STATE_CHANGED: for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).onRecentsAnimationStateChanged(msg.arg1 > 0); @@ -2036,6 +2072,11 @@ public class CommandQueue extends IStatusBar.Stub implements } break; } + case MSG_SET_HAS_NAVIGATION_BAR: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).setHasNavigationBar(msg.arg1, msg.arg2 != 0); + } + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 10b726b90894..c8f972774ab0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -121,7 +121,6 @@ public class NotificationLockscreenUserManagerImpl implements private static final long LOCK_TIME_FOR_SENSITIVE_REDACTION_MS = TimeUnit.MINUTES.toMillis(10); - private final Lazy<NotificationVisibilityProvider> mVisibilityProviderLazy; private final Lazy<CommonNotifCollection> mCommonNotifCollectionLazy; private final DevicePolicyManager mDevicePolicyManager; @@ -751,7 +750,7 @@ public class NotificationLockscreenUserManagerImpl implements } long lastLockedTime = mLastLockTime.get(); - if (ent.getSbn().getPostTime() < lastLockedTime) { + if (ent.getSbn().getNotification().getWhen() < lastLockedTime) { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StabilizeHeadsUpGroup.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StabilizeHeadsUpGroup.kt index 629cb831f17a..a0e44bfd7620 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StabilizeHeadsUpGroup.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StabilizeHeadsUpGroup.kt @@ -24,7 +24,7 @@ import com.android.systemui.flags.RefactorFlagUtils @Suppress("NOTHING_TO_INLINE") object StabilizeHeadsUpGroup { /** The aconfig flag name */ - const val FLAG_NAME: String = Flags.FLAG_STABILIZE_HEADS_UP_GROUP + const val FLAG_NAME: String = Flags.FLAG_STABILIZE_HEADS_UP_GROUP_V2 /** A token used for dependency declaration */ val token: FlagToken @@ -33,7 +33,7 @@ object StabilizeHeadsUpGroup { /** Is the refactor enabled */ @JvmStatic inline val isEnabled - get() = Flags.stabilizeHeadsUpGroup() + get() = Flags.stabilizeHeadsUpGroupV2() /** * Called to ensure code is only run when the flag is enabled. This protects users from the diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt new file mode 100644 index 000000000000..6ceeb6aae7a5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.dagger + +import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHider +import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHiderImpl +import dagger.Binds +import dagger.BindsOptionalOf +import dagger.Module + +/** + * This is meant to be bound in SystemUI variants with [NotificationStackScrollLayoutController]. + */ +@Module +interface NotificationStackGoogleModule { + @Binds + fun bindNotificationStackRebindingHider( + impl: NotificationStackRebindingHiderImpl + ): NotificationStackRebindingHider +} + +/** This is meant to be used by all SystemUI variants, also those without NSSL. */ +@Module +interface NotificationStackModule { + @BindsOptionalOf + fun bindOptionalOfNotificationStackRebindingHider(): NotificationStackRebindingHider +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java index 086c32cbae5d..0346108856a2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java @@ -117,6 +117,7 @@ import javax.inject.Provider; NotificationMemoryModule.class, NotificationStatsLoggerModule.class, NotificationsLogModule.class, + NotificationStackModule.class, }) public interface NotificationsModule { @Binds diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt new file mode 100644 index 000000000000..664b2afe90b4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt @@ -0,0 +1,320 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.promoted + +import android.app.Flags +import android.view.LayoutInflater +import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE +import android.view.ViewStub +import android.widget.Chronometer +import android.widget.DateTimeView +import android.widget.ImageView +import android.widget.ProgressBar +import android.widget.TextView +import androidx.compose.runtime.Composable +import androidx.compose.runtime.key +import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.view.isVisible +import com.android.internal.R +import com.android.internal.widget.BigPictureNotificationImageView +import com.android.internal.widget.CachingIconView +import com.android.internal.widget.ImageFloatingTextView +import com.android.internal.widget.NotificationExpandButton +import com.android.internal.widget.NotificationProgressBar +import com.android.internal.widget.NotificationRowIconView +import com.android.systemui.lifecycle.rememberViewModel +import com.android.systemui.res.R as systemuiR +import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel +import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel.Style +import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel.When +import com.android.systemui.statusbar.notification.promoted.ui.viewmodel.AODPromotedNotificationViewModel + +@Composable +fun AODPromotedNotification(viewModelFactory: AODPromotedNotificationViewModel.Factory) { + if (!PromotedNotificationUiAod.isEnabled) { + return + } + + val viewModel = + rememberViewModel(traceName = "AODPromotedNotification") { viewModelFactory.create() } + + val content = viewModel.content ?: return + + key(content.identity) { + AndroidView( + factory = { context -> + LayoutInflater.from(context) + .inflate(content.layoutResource, /* root= */ null) + .apply { setTag(viewUpdaterTagId, AODPromotedNotificationViewUpdater(this)) } + }, + update = { view -> + (view.getTag(viewUpdaterTagId) as AODPromotedNotificationViewUpdater).update( + content + ) + }, + ) + } +} + +private val PromotedNotificationContentModel.layoutResource: Int + get() { + return if (Flags.notificationsRedesignTemplates()) { + when (style) { + Style.BigPicture -> R.layout.notification_2025_template_expanded_big_picture + Style.BigText -> R.layout.notification_2025_template_expanded_big_text + Style.Call -> R.layout.notification_2025_template_expanded_call + Style.Progress -> R.layout.notification_2025_template_expanded_progress + Style.Ineligible -> 0 + } + } else { + when (style) { + Style.BigPicture -> R.layout.notification_template_material_big_picture + Style.BigText -> R.layout.notification_template_material_big_text + Style.Call -> R.layout.notification_template_material_big_call + Style.Progress -> R.layout.notification_template_material_progress + Style.Ineligible -> 0 + } + } + } + +private class AODPromotedNotificationViewUpdater(root: View) { + private val alertedIcon: View? = root.findViewById(R.id.alerted_icon) + private val alternateExpandTarget: View? = root.findViewById(R.id.alternate_expand_target) + private val appNameDivider: View? = root.findViewById(R.id.app_name_divider) + private val appNameText: TextView? = root.findViewById(R.id.app_name_text) + private val bigPicture: BigPictureNotificationImageView? = root.findViewById(R.id.big_picture) + private val bigText: ImageFloatingTextView? = root.findViewById(R.id.big_text) + private var chronometerStub: ViewStub? = root.findViewById(R.id.chronometer) + private var chronometer: Chronometer? = null + private val closeButton: View? = root.findViewById(R.id.close_button) + private val conversationText: TextView? = root.findViewById(R.id.conversation_text) + private val expandButton: NotificationExpandButton? = root.findViewById(R.id.expand_button) + private val headerText: TextView? = root.findViewById(R.id.header_text) + private val headerTextDivider: View? = root.findViewById(R.id.header_text_divider) + private val headerTextSecondary: TextView? = root.findViewById(R.id.header_text_secondary) + private val headerTextSecondaryDivider: View? = + root.findViewById(R.id.header_text_secondary_divider) + private val icon: NotificationRowIconView? = root.findViewById(R.id.icon) + private val leftIcon: ImageView? = root.findViewById(R.id.left_icon) + private val notificationProgressEndIcon: CachingIconView? = + root.findViewById(R.id.notification_progress_end_icon) + private val notificationProgressStartIcon: CachingIconView? = + root.findViewById(R.id.notification_progress_start_icon) + private val profileBadge: ImageView? = root.findViewById(R.id.profile_badge) + private val text: ImageFloatingTextView? = root.findViewById(R.id.text) + private val time: DateTimeView? = root.findViewById(R.id.time) + private val timeDivider: View? = root.findViewById(R.id.time_divider) + private val title: TextView? = root.findViewById(R.id.title) + private val verificationDivider: View? = root.findViewById(R.id.verification_divider) + private val verificationIcon: ImageView? = root.findViewById(R.id.verification_icon) + private val verificationText: TextView? = root.findViewById(R.id.verification_text) + + private var oldProgressStub = root.findViewById<View>(R.id.progress) as? ViewStub + private var oldProgress: ProgressBar? = null + private val newProgress = root.findViewById<View>(R.id.progress) as? NotificationProgressBar + + fun update(content: PromotedNotificationContentModel) { + when (content.style) { + Style.BigPicture -> updateBigPicture(content) + Style.BigText -> updateBigText(content) + Style.Call -> updateCall(content) + Style.Progress -> updateProgress(content) + Style.Ineligible -> {} + } + } + + private fun updateBigPicture(content: PromotedNotificationContentModel) { + updateHeader(content) + + updateTitle(title, content) + updateText(text, content) + + bigPicture?.visibility = GONE + } + + private fun updateBigText(content: PromotedNotificationContentModel) { + updateHeader(content) + + updateTitle(title, content) + updateText(bigText, content) + } + + private fun updateCall(content: PromotedNotificationContentModel) { + updateConversationHeader(content) + + updateText(text, content) + } + + private fun updateProgress(content: PromotedNotificationContentModel) { + updateHeader(content) + + updateTitle(title, content) + updateText(text, content) + + updateNewProgressBar(content) + } + + private fun updateNewProgressBar(content: PromotedNotificationContentModel) { + notificationProgressStartIcon?.visibility = GONE + notificationProgressEndIcon?.visibility = GONE + content.progress?.let { + newProgress?.setProgressModel(it.toBundle()) + newProgress?.visibility = VISIBLE + } ?: run { newProgress?.visibility = GONE } + } + + private fun updateHeader(content: PromotedNotificationContentModel) { + updateAppName(content) + updateTextView(headerTextSecondary, content.subText) + updateTitle(headerText, content) + updateTimeAndChronometer(content) + + updateHeaderDividers(content) + + leftIcon?.visibility = GONE + alternateExpandTarget?.visibility = GONE + expandButton?.visibility = GONE + closeButton?.visibility = GONE + } + + private fun updateHeaderDividers(content: PromotedNotificationContentModel) { + val hasAppName = content.appName != null && content.appName.isNotEmpty() + val hasSubText = content.subText != null && content.subText.isNotEmpty() + val hasHeader = content.title != null && content.title.isNotEmpty() + val hasTimeOrChronometer = content.time != null + + val hasTextBeforeSubText = hasAppName + val hasTextBeforeHeader = hasAppName || hasSubText + val hasTextBeforeTime = hasAppName || hasSubText || hasHeader + + val showDividerBeforeSubText = hasTextBeforeSubText && hasSubText + val showDividerBeforeHeader = hasTextBeforeHeader && hasHeader + val showDividerBeforeTime = hasTextBeforeTime && hasTimeOrChronometer + + headerTextSecondaryDivider?.isVisible = showDividerBeforeSubText + headerTextDivider?.isVisible = showDividerBeforeHeader + timeDivider?.isVisible = showDividerBeforeTime + } + + private fun updateConversationHeader(content: PromotedNotificationContentModel) { + updateTitle(conversationText, content) + updateAppName(content) + updateTimeAndChronometer(content) + + updateConversationHeaderDividers(content) + + updateTextView(verificationText, content.verificationText) + } + + private fun updateConversationHeaderDividers(content: PromotedNotificationContentModel) { + val hasTitle = content.title != null + val hasAppName = content.appName != null + val hasTimeOrChronometer = content.time != null + val hasVerification = content.verificationIcon != null || content.verificationText != null + + val hasTextBeforeAppName = hasTitle + val hasTextBeforeTime = hasTitle || hasAppName + val hasTextBeforeVerification = hasTitle || hasAppName || hasTimeOrChronometer + + val showDividerBeforeAppName = hasTextBeforeAppName && hasAppName + val showDividerBeforeTime = hasTextBeforeTime && hasTimeOrChronometer + val showDividerBeforeVerification = hasTextBeforeVerification && hasVerification + + appNameDivider?.isVisible = showDividerBeforeAppName + timeDivider?.isVisible = showDividerBeforeTime + verificationDivider?.isVisible = showDividerBeforeVerification + } + + private fun updateAppName(content: PromotedNotificationContentModel) { + updateTextView(appNameText, content.appName) + } + + private fun updateTitle(titleView: TextView?, content: PromotedNotificationContentModel) { + updateTextView(titleView, content.title, color = Color.PrimaryText) + } + + private fun updateTimeAndChronometer(content: PromotedNotificationContentModel) { + setTextViewColor(time, Color.SecondaryText) + setTextViewColor(chronometer, Color.SecondaryText) + + val timeValue = content.time + + if (timeValue == null) { + time?.visibility = GONE + chronometer?.visibility = GONE + } else if (timeValue.mode == When.Mode.BasicTime) { + time?.visibility = VISIBLE + time?.setTime(timeValue.time) + chronometer?.visibility = GONE + } else { + inflateChronometer() + + time?.visibility = GONE + chronometer?.visibility = VISIBLE + chronometer?.base = timeValue.time + chronometer?.isCountDown = (timeValue.mode == When.Mode.CountDown) + chronometer?.setStarted(true) + } + } + + private fun inflateChronometer() { + if (chronometer != null) { + return + } + + chronometer = chronometerStub?.inflate() as Chronometer + chronometerStub = null + } + + private fun updateText( + view: ImageFloatingTextView?, + content: PromotedNotificationContentModel, + ) { + view?.setHasImage(false) + updateTextView(view, content.text) + } + + private fun updateTextView( + view: TextView?, + text: CharSequence?, + color: Color = Color.SecondaryText, + ) { + setTextViewColor(view, color) + + if (text != null && text.isNotEmpty()) { + view?.text = text + view?.visibility = VISIBLE + } else { + view?.text = "" + view?.visibility = GONE + } + } + + private fun setTextViewColor(view: TextView?, color: Color) { + view?.setTextColor(color.color.toInt()) + } + + private enum class Color(val color: UInt) { + Background(0x00000000u), + PrimaryText(0xFFFFFFFFu), + SecondaryText(0xFFCCCCCCu), + } +} + +private val viewUpdaterTagId = systemuiR.id.aod_promoted_notification_view_updater_tag diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationLogger.kt index a43f8dbc1b5d..4ccdc65ba91a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationLogger.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.notification.promoted +import androidx.constraintlayout.widget.ConstraintSet import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel.ERROR import com.android.systemui.log.core.LogLevel.INFO @@ -65,6 +66,58 @@ constructor(@PromotedNotificationLog private val buffer: LogBuffer) { { "extraction succeeded: $str2 for $str1" }, ) } + + fun logBinderBindSkipped(reason: String) { + buffer.log( + AOD_VIEW_BINDER_TAG, + INFO, + { str1 = reason }, + { "binder skipped binding: $str1" }, + ) + } + + fun logBinderAttached() { + buffer.log(AOD_VIEW_BINDER_TAG, INFO, "binder attached") + } + + fun logBinderDetached() { + buffer.log(AOD_VIEW_BINDER_TAG, INFO, "binder detached") + } + + fun logBinderBoundNotification() { + buffer.log(AOD_VIEW_BINDER_TAG, INFO, "binder bound notification") + } + + fun logBinderUnboundNotification() { + buffer.log(AOD_VIEW_BINDER_TAG, INFO, "binder unbound notification") + } + + fun logSectionAddedViews() { + buffer.log(AOD_SECTION_TAG, INFO, "section added views") + } + + fun logSectionBoundData() { + buffer.log(AOD_SECTION_TAG, INFO, "section bound data") + } + + fun logSectionAppliedConstraints() { + buffer.log(AOD_SECTION_TAG, INFO, "section applied constraints") + } + + fun logSectionRemovedViews() { + buffer.log(AOD_SECTION_TAG, INFO, "section removed views") + } } private const val EXTRACTION_TAG = "PromotedNotificationContentExtractor" +private const val AOD_VIEW_BINDER_TAG = "AODPromotedNotificationViewBinder" +private const val AOD_SECTION_TAG = "AodPromotedNotificationSection" + +private fun visibilityToString(visibility: Int): String { + return when (visibility) { + ConstraintSet.VISIBLE -> "VISIBLE" + ConstraintSet.INVISIBLE -> "INVISIBLE" + ConstraintSet.GONE -> "GONE" + else -> "UNKNOWN($visibility)" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/ui/viewmodel/AODPromotedNotificationViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/ui/viewmodel/AODPromotedNotificationViewModel.kt index adfa6a10814d..3bbd217dcab4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/ui/viewmodel/AODPromotedNotificationViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/ui/viewmodel/AODPromotedNotificationViewModel.kt @@ -16,31 +16,32 @@ package com.android.systemui.statusbar.notification.promoted.ui.viewmodel -import com.android.systemui.dagger.SysUISingleton +import androidx.compose.runtime.getValue +import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.lifecycle.Hydrator import com.android.systemui.statusbar.notification.promoted.domain.interactor.AODPromotedNotificationInteractor import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel -import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel.Identity -import javax.inject.Inject -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.filterNotNull -import kotlinx.coroutines.flow.map +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject -@SysUISingleton class AODPromotedNotificationViewModel -@Inject -constructor(interactor: AODPromotedNotificationInteractor) { - private val content: Flow<PromotedNotificationContentModel?> = interactor.content - private val identity: Flow<Identity?> = content.mapNonNullsKeepingNulls { it.identity } +@AssistedInject +constructor(interactor: AODPromotedNotificationInteractor) : ExclusiveActivatable() { + private val hydrator = Hydrator("AODPromotedNotificationViewModel.hydrator") - val notification: Flow<PromotedNotificationViewModel?> = - identity.distinctUntilChanged().mapNonNullsKeepingNulls { identity -> - val updates = interactor.content.filterNotNull().filter { it.identity == identity } - PromotedNotificationViewModel(identity, updates) - } -} + val content: PromotedNotificationContentModel? by + hydrator.hydratedStateOf( + traceName = "content", + initialValue = null, + source = interactor.content, + ) + + override suspend fun onActivated(): Nothing { + hydrator.activate() + } -private fun <T, R> Flow<T?>.mapNonNullsKeepingNulls(block: (T) -> R): Flow<R?> = map { - it?.let(block) + @AssistedFactory + interface Factory { + fun create(): AODPromotedNotificationViewModel + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 598ff09ba3b0..5d7b8e6e8a84 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -252,6 +252,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private NotificationGuts mGuts; private NotificationEntry mEntry; private String mAppName; + private NotificationRebindingTracker mRebindingTracker; private FalsingManager mFalsingManager; /** @@ -1526,7 +1527,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView // TODO: Move content inflation logic out of this call RowContentBindParams params = mRowContentBindStage.getStageParams(mEntry); params.setNeedsReinflation(true); - mRowContentBindStage.requestRebind(mEntry, null /* callback */); + + var rebindEndCallback = mRebindingTracker.trackRebinding(mEntry.getKey()); + mRowContentBindStage.requestRebind(mEntry, (e) -> rebindEndCallback.onFinished()); Trace.endSection(); } @@ -2015,9 +2018,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView SmartReplyConstants smartReplyConstants, SmartReplyController smartReplyController, IStatusBarService statusBarService, - UiEventLogger uiEventLogger) { + UiEventLogger uiEventLogger, + NotificationRebindingTracker notificationRebindingTracker) { mEntry = entry; mAppName = appName; + mRebindingTracker = notificationRebindingTracker; if (mMenuRow == null) { mMenuRow = new NotificationMenuRow(mContext, peopleNotificationIdentifier); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java index e06280e36bc8..626230353bd7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java @@ -106,6 +106,7 @@ public class ExpandableNotificationRowController implements NotifViewController private final NotificationGutsManager mNotificationGutsManager; private final OnUserInteractionCallback mOnUserInteractionCallback; private final FalsingManager mFalsingManager; + private final NotificationRebindingTracker mNotificationRebindingTracker; private final FeatureFlagsClassic mFeatureFlags; private final boolean mAllowLongPress; private final PeopleNotificationIdentifier mPeopleNotificationIdentifier; @@ -275,7 +276,8 @@ public class ExpandableNotificationRowController implements NotifViewController NotificationDismissibilityProvider dismissibilityProvider, IStatusBarService statusBarService, UiEventLogger uiEventLogger, - MSDLPlayer msdlPlayer) { + MSDLPlayer msdlPlayer, + NotificationRebindingTracker notificationRebindingTracker) { mView = view; mListContainer = listContainer; mRemoteInputViewSubcomponentFactory = rivSubcomponentFactory; @@ -295,6 +297,7 @@ public class ExpandableNotificationRowController implements NotifViewController mNotificationGutsManager = notificationGutsManager; mOnUserInteractionCallback = onUserInteractionCallback; mFalsingManager = falsingManager; + mNotificationRebindingTracker = notificationRebindingTracker; mOnFeedbackClickListener = mNotificationGutsManager::openGuts; mAllowLongPress = allowLongPress; mFeatureFlags = featureFlags; @@ -343,7 +346,8 @@ public class ExpandableNotificationRowController implements NotifViewController mSmartReplyConstants, mSmartReplyController, mStatusBarService, - mUiEventLogger + mUiEventLogger, + mNotificationRebindingTracker ); mView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); if (mAllowLongPress) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTracker.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTracker.kt new file mode 100644 index 000000000000..40dbdf27c920 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTracker.kt @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.row + +import com.android.app.tracing.FlowTracing.traceEach +import com.android.app.tracing.TraceUtils.traceAsyncClosable +import com.android.app.tracing.TrackGroupUtils.trackGroup +import com.android.systemui.CoreStartable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +/** + * Tracks notification rebindings in progress as a result of a configuration change (such as density + * or font size) + */ +@SysUISingleton +class NotificationRebindingTracker +@Inject +constructor( + activeNotificationsInteractor: ActiveNotificationsInteractor, + @Background private val bgScope: CoroutineScope, + @Application private val appScope: CoroutineScope, +) : CoreStartable { + + private val rebindingKeys = MutableStateFlow(emptySet<String>()) + private val activeKeys: Flow<Set<String>> = + activeNotificationsInteractor.allRepresentativeNotifications + .map { notifications: Map<String, *> -> + notifications.map { (notifKey, _) -> notifKey }.toSet() + } + .traceEach(trackGroup("shade", "activeKeys")) + + /** + * Emits the current number of active notification rebinding in progress. + * + * Note the usaged of the [appScope] instead of the bg one is intentional, as we need the value + * immediately also in the same frame if it changes. + */ + val rebindingInProgressCount: StateFlow<Int> = + rebindingKeys + .map { it.size } + .traceEach(trackGroup("shade", "rebindingInProgressCount"), traceEmissionCount = true) + .stateIn(appScope, started = SharingStarted.Eagerly, initialValue = 0) + + override fun start() { + syncRebindingKeysWithActiveKeys() + } + + private fun syncRebindingKeysWithActiveKeys() { + // Let's make sure that the "rebindingKeys" set doesn't contain entries that are not active + // anymore. + bgScope.launch { + activeKeys.collect { activeKeys -> + rebindingKeys.update { currentlyBeingInflated -> + currentlyBeingInflated.intersect(activeKeys) + } + } + } + } + + /** Should be called when the inflation begins */ + fun trackRebinding(key: String): RebindFinishedCallback { + val endTrace = + traceAsyncClosable( + trackGroupName = "Notifications", + trackName = "Rebinding", + sliceName = "Rebinding in progress for $key", + ) + rebindingKeys.value += key + return RebindFinishedCallback { + endTrace() + rebindingKeys.value -= key + } + } + + /** + * Callback to notify the end of a rebiding. Views are expected to be in the hierarchy when this + * is called. + */ + fun interface RebindFinishedCallback { + fun onFinished() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt index 49e38def98a6..0b299d965b09 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt @@ -799,6 +799,7 @@ constructor( } redacted.setLargeIcon(original.getLargeIcon()) redacted.setSmallIcon(original.smallIcon) + redacted.setWhen(original.getWhen()) return redacted } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackRebindingHider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackRebindingHider.kt new file mode 100644 index 000000000000..dba2308ea34b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackRebindingHider.kt @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.stack + +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject + +/** + * Allows to hide the content of the notification stack during notification rebinding. + * + * Note that this is mainly created to allow SystemUI variants without NSSL to provide their own + * implementations. + */ +interface NotificationStackRebindingHider { + /** Sets the Notification stack visibility. */ + fun setVisible(visible: Boolean, animated: Boolean) +} + +@SysUISingleton +class NotificationStackRebindingHiderImpl +@Inject +constructor(private val nsslController: NotificationStackScrollLayoutController) : + NotificationStackRebindingHider { + override fun setVisible(visible: Boolean, animated: Boolean) { + nsslController.updateContainerVisibilityForRebind(visible, animated) + } +} 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 f57107141f61..bf24c873c693 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 @@ -21,6 +21,7 @@ import static android.os.Trace.TRACE_TAG_APP; import static android.view.MotionEvent.ACTION_CANCEL; import static android.view.MotionEvent.ACTION_UP; +import static com.android.app.tracing.TrackGroupUtils.trackGroup; import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_SCROLL_FLING; import static com.android.internal.jank.InteractionJankMonitor.CUJ_SHADE_CLEAR_ALL; import static com.android.systemui.Flags.notificationOverExpansionClippingFix; @@ -1395,6 +1396,16 @@ public class NotificationStackScrollLayout } } + @Override + public void setAlpha(float alpha) { + super.setAlpha(alpha); + if (Trace.isEnabled()) { + Trace.setCounter( + trackGroup(/* groupName= */ "shade", /* trackName= */ "NSSLResultingAlpha"), + (int) (alpha * 100)); + } + } + private boolean isCurrentlyAnimating() { return mStateAnimator.isRunning(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index dc0fae80d041..8eaef3681e5c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -249,9 +249,26 @@ public class NotificationStackScrollLayoutController implements Dumpable { } }; + private static final Property<NotificationStackScrollLayoutController, Float> + HIDE_DURING_REBINDING_PROPERTY = new Property<>(Float.class, + "HideNotificationsAlphaDuringRebind") { + @Override + public Float get(NotificationStackScrollLayoutController object) { + return object.mMaxAlphaForRebind; + } + + @Override + public void set(NotificationStackScrollLayoutController object, Float value) { + object.setMaxAlphaForRebind(value); + } + }; + @Nullable private ObjectAnimator mHideAlphaAnimator = null; + @Nullable + private ObjectAnimator mRebindAlphaAnimator = null; + private final Runnable mSensitiveStateChangedListener = new Runnable() { @Override public void run() { @@ -295,6 +312,7 @@ public class NotificationStackScrollLayoutController implements Dumpable { private float mMaxAlphaForKeyguard = 1.0f; private String mMaxAlphaForKeyguardSource = "constructor"; private float mMaxAlphaForUnhide = 1.0f; + private float mMaxAlphaForRebind = 1.0f; private float mMaxAlphaFromView = 1.0f; /** @@ -1244,6 +1262,16 @@ public class NotificationStackScrollLayoutController implements Dumpable { } /** + * Max alpha for rebind. + * + * Used to hide notifications while rebiding is in progress (e.g. after a density change). + */ + public void setMaxAlphaForRebind(float alpha) { + mMaxAlphaForRebind = alpha; + updateAlpha(); + } + + /** * Applies a blur effect to the view. * * @param blurRadius Radius of blur @@ -1261,8 +1289,10 @@ public class NotificationStackScrollLayoutController implements Dumpable { private void updateAlpha() { if (mView != null) { - mView.setAlpha(Math.min(Math.min(mMaxAlphaFromView, mMaxAlphaForKeyguard), - Math.min(mMaxAlphaForUnhide, mMaxAlphaForGlanceableHub))); + float newAlpha = Math.min(mMaxAlphaForRebind, + Math.min(Math.min(mMaxAlphaFromView, mMaxAlphaForKeyguard), + Math.min(mMaxAlphaForUnhide, mMaxAlphaForGlanceableHub))); + mView.setAlpha(newAlpha); } } @@ -1289,6 +1319,26 @@ public class NotificationStackScrollLayoutController implements Dumpable { } } + /** + * Sets whether the nssl should be visible or not. Used during notification rebinding, to hide + * possible flickers that happen when display density changes. (e.g. as a result of the shade + * moving to a different display.) + */ + public void updateContainerVisibilityForRebind(boolean visible, boolean animate) { + if (mRebindAlphaAnimator != null) { + mRebindAlphaAnimator.cancel(); + } + + final float targetAlpha = visible ? 1f : 0f; + + if (animate) { + mRebindAlphaAnimator = createAlphaAnimatorForRebind(targetAlpha); + mRebindAlphaAnimator.start(); + } else { + HIDE_DURING_REBINDING_PROPERTY.set(this, targetAlpha); + } + } + private ObjectAnimator createAlphaAnimator(float targetAlpha) { final ObjectAnimator objectAnimator = ObjectAnimator .ofFloat(this, HIDE_ALPHA_PROPERTY, targetAlpha); @@ -1297,6 +1347,14 @@ public class NotificationStackScrollLayoutController implements Dumpable { return objectAnimator; } + private ObjectAnimator createAlphaAnimatorForRebind(float targetAlpha) { + final ObjectAnimator objectAnimator = ObjectAnimator + .ofFloat(this, HIDE_DURING_REBINDING_PROPERTY, targetAlpha); + objectAnimator.setInterpolator(STANDARD); + objectAnimator.setDuration(ANIMATION_DURATION_STANDARD); + return objectAnimator; + } + public float calculateAppearFraction(float height) { SceneContainerFlag.assertInLegacyMode(); return mView.calculateAppearFraction(height); @@ -1688,6 +1746,7 @@ public class NotificationStackScrollLayoutController implements Dumpable { public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { pw.println("mMaxAlphaFromView=" + mMaxAlphaFromView); pw.println("mMaxAlphaForUnhide=" + mMaxAlphaForUnhide); + pw.println("mMaxAlphaForRebind=" + mMaxAlphaForRebind); pw.println("mMaxAlphaForGlanceableHub=" + mMaxAlphaForGlanceableHub); pw.println("mMaxAlphaForKeyguard=" + mMaxAlphaForKeyguard); pw.println("mMaxAlphaForKeyguardSource=" + mMaxAlphaForKeyguardSource); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/SharedNotificationContainer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/SharedNotificationContainer.kt index 705845ff984c..5d8f06ff51be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/SharedNotificationContainer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/SharedNotificationContainer.kt @@ -60,6 +60,7 @@ class SharedNotificationContainer(context: Context, attrs: AttributeSet?) : marginTop: Int, marginEnd: Int, marginBottom: Int, + nsslAlpha: Float, ) { val constraintSet = ConstraintSet() constraintSet.clone(baseConstraintSet) @@ -83,6 +84,10 @@ class SharedNotificationContainer(context: Context, attrs: AttributeSet?) : } } + // Constraint layout sets the alpha to 1 if it's not set explicitly in the constraint + // set. Let's keep the current nssl alpha instead, otherwise this might interfere with + // animations. + setAlpha(nsslId, nsslAlpha) connect(nsslId, START, startConstraintId, START, marginStart) if ( !SceneContainerFlag.isEnabled || diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt index 3ea4d488357d..1965b9538df0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt @@ -76,6 +76,7 @@ constructor( marginTop = it.marginTop, marginEnd = it.marginEnd, marginBottom = it.marginBottom, + nsslAlpha = controller.alpha, ) controller.setOverExpansion(0f) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index 1a97ab635028..4825a10e901b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -144,6 +144,7 @@ public class NotificationIconContainer extends ViewGroup { private int mMaxIcons = Integer.MAX_VALUE; private boolean mOverrideIconColor; + private boolean mUseInverseOverrideIconColor; private boolean mIsStaticLayout = true; private final HashMap<View, IconState> mIconStates = new HashMap<>(); private int mDotPadding; @@ -169,6 +170,7 @@ public class NotificationIconContainer extends ViewGroup { private final int[] mAbsolutePosition = new int[2]; @Nullable private View mIsolatedIconForAnimation; private int mThemedTextColorPrimary; + private int mThemedTextColorPrimaryInverse; @Nullable private Runnable mIsolatedIconAnimationEndRunnable; private boolean mUseIncreasedIconScale; @@ -191,6 +193,8 @@ public class NotificationIconContainer extends ViewGroup { com.android.internal.R.style.Theme_DeviceDefault_DayNight); mThemedTextColorPrimary = Utils.getColorAttr(themedContext, com.android.internal.R.attr.textColorPrimary).getDefaultColor(); + mThemedTextColorPrimaryInverse = Utils.getColorAttr(themedContext, + com.android.internal.R.attr.textColorPrimaryInverse).getDefaultColor(); } @Override @@ -713,6 +717,10 @@ public class NotificationIconContainer extends ViewGroup { mOverrideIconColor = override; } + public void setUseInverseOverrideIconColor(boolean override) { + mUseInverseOverrideIconColor = override; + } + public class IconState extends ViewState { public float iconAppearAmount = 1.0f; public float clampedAppearAmount = 1.0f; @@ -821,7 +829,9 @@ public class NotificationIconContainer extends ViewGroup { } icon.setVisibleState(visibleState, animationsAllowed); if (mOverrideIconColor) { - icon.setIconColor(mThemedTextColorPrimary, + int overrideIconColor = mUseInverseOverrideIconColor + ? mThemedTextColorPrimaryInverse : mThemedTextColorPrimary; + icon.setIconColor(overrideIconColor, /* animate= */ needsCannedAnimation && animationsAllowed); } if (animate) { diff --git a/packages/SystemUI/src/com/android/systemui/utils/SafeIconLoader.kt b/packages/SystemUI/src/com/android/systemui/utils/SafeIconLoader.kt new file mode 100644 index 000000000000..41bef7f94fa2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/utils/SafeIconLoader.kt @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.utils + +import android.app.IUriGrantsManager +import android.content.Context +import android.graphics.drawable.Drawable +import android.graphics.drawable.Icon +import android.os.UserHandle +import com.android.systemui.dagger.qualifiers.Application +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +/** + * Use to load an icon (from another app) safely. It will prevent cross user icon loading if there + * are no permissions. + */ +class SafeIconLoader +@AssistedInject +constructor( + @Assisted("serviceUid") private val serviceUid: Int, + @Assisted private val packageName: String, + @Assisted("userId") private val userId: Int, + @Application private val applicationContext: Context, + private val iUriGrantsManager: IUriGrantsManager, +) { + + private val serviceContext = + applicationContext.createPackageContextAsUser(packageName, 0, UserHandle.of(userId)) + + /** + * Tries to load the icon. If it fails in any way (for example, cross user permissions), it will + * return `null`. Prefer calling this in a background thread. + */ + fun load(icon: Icon): Drawable? { + return icon.loadDrawableCheckingUriGrant( + serviceContext, + iUriGrantsManager, + serviceUid, + packageName, + ) + } + + @AssistedFactory + interface Factory { + + fun create( + @Assisted("serviceUid") serviceUid: Int, + packageName: String, + @Assisted("userId") userId: Int, + ): SafeIconLoader + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt new file mode 100644 index 000000000000..bee45645bfdb --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.panel.component.mediaoutput.domain + +import android.content.Context +import com.android.settingslib.media.PhoneMediaDevice.isDesktop +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope +import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.stateIn + +@VolumePanelScope +class MediaOutputAvailabilityCriteria +@Inject +constructor( + @Application private val context: Context, + @VolumePanelScope private val scope: CoroutineScope, +) : ComponentAvailabilityCriteria { + + private val availability = + flow { emit(!isDesktop(context)) }.stateIn(scope, SharingStarted.WhileSubscribed(), false) + + override fun isAvailable(): Flow<Boolean> = availability +} diff --git a/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt b/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt index fee32b5e7e78..8e0616c00196 100644 --- a/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt @@ -17,13 +17,23 @@ package com.android.systemui.window.domain.interactor import android.util.Log +import com.android.systemui.Flags import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER import com.android.systemui.window.data.repository.WindowRootViewBlurRepository import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn /** * Interactor that provides the blur state for the window root view @@ -33,9 +43,21 @@ import kotlinx.coroutines.flow.asStateFlow class WindowRootViewBlurInteractor @Inject constructor( + @Application private val applicationScope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, + keyguardTransitionInteractor: KeyguardTransitionInteractor, private val repository: WindowRootViewBlurRepository, ) { + private var isBouncerTransitionInProgress: StateFlow<Boolean> = + if (Flags.bouncerUiRevamp()) { + keyguardTransitionInteractor + .transitionValue(PRIMARY_BOUNCER) + .map { it > 0f } + .distinctUntilChanged() + .stateIn(applicationScope, SharingStarted.Eagerly, false) + } else { + MutableStateFlow(false) + } /** * Invoked by the view after blur of [appliedBlurRadius] was successfully applied on the window @@ -57,8 +79,7 @@ constructor( val onBlurAppliedEvent: Flow<Int> = repository.onBlurApplied /** - * Request to apply blur while on bouncer, this takes precedence over other blurs (from - * shade). + * Request to apply blur while on bouncer, this takes precedence over other blurs (from shade). */ fun requestBlurForBouncer(blurRadius: Int) { repository.isBlurOpaque.value = false @@ -76,7 +97,10 @@ constructor( * @return whether the request for blur was processed or not. */ fun requestBlurForShade(blurRadius: Int, opaque: Boolean): Boolean { - if (keyguardInteractor.primaryBouncerShowing.value) { + // We need to check either of these because they are two different sources of truth, + // primaryBouncerShowing changes early to true/false, but blur is + // coordinated by transition value. + if (keyguardInteractor.primaryBouncerShowing.value || isBouncerTransitionInProgress.value) { return false } Log.d(TAG, "requestingBlurForShade for $blurRadius $opaque") diff --git a/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt index d2069cfdfdc6..dbccc1d8cca4 100644 --- a/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt @@ -49,7 +49,6 @@ object WindowRootViewBinder { view.repeatWhenAttached { Log.d(TAG, "Binding root view") var frameCallbackPendingExecution: FrameCallback? = null - val viewRootImpl = view.rootView.viewRootImpl view.viewModel( minWindowLifecycleState = WindowLifecycleState.ATTACHED, factory = { viewModelFactory.create() }, @@ -64,13 +63,13 @@ object WindowRootViewBinder { val newFrameCallback = FrameCallback { frameCallbackPendingExecution = null blurUtils.applyBlur( - viewRootImpl, + view.rootView?.viewRootImpl, blurState.radius, blurState.isOpaque, ) viewModel.onBlurApplied(blurState.radius) } - blurUtils.prepareBlur(viewRootImpl, blurState.radius) + blurUtils.prepareBlur(view.rootView?.viewRootImpl, blurState.radius) if (frameCallbackPendingExecution != null) { choreographer.removeFrameCallback(frameCallbackPendingExecution) } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt index 1729a4dfa945..bac2c47f51c7 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt @@ -55,7 +55,6 @@ import com.android.systemui.plugins.clocks.ClockTickRate import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.plugins.clocks.ZenData import com.android.systemui.plugins.clocks.ZenData.ZenMode -import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.res.R import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.policy.BatteryController @@ -132,7 +131,6 @@ class ClockEventControllerTest : SysuiTestCase() { @Mock private lateinit var parentView: View @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor @Mock private lateinit var userTracker: UserTracker - @Mock private lateinit var powerInteractor: PowerInteractor @Mock private lateinit var zenModeController: ZenModeController private var zenModeControllerCallback: ZenModeController.Callback? = null @@ -180,7 +178,6 @@ class ClockEventControllerTest : SysuiTestCase() { zenModeController, zenModeInteractor, userTracker, - powerInteractor, ) underTest.clock = clock diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt index 39e1e1d8bb57..b1d0f86c364c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt @@ -2,6 +2,9 @@ package com.android.systemui.controls.management import android.content.ComponentName import android.content.Intent +import android.content.pm.ApplicationInfo +import android.content.pm.ServiceInfo +import android.graphics.drawable.Drawable import android.os.Bundle import android.testing.TestableLooper import android.view.View @@ -11,25 +14,31 @@ import android.window.OnBackInvokedDispatcher import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import androidx.test.rule.ActivityTestRule -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.activity.SingleActivityFactory +import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.CustomIconCache import com.android.systemui.controls.controller.ControlsControllerImpl +import com.android.systemui.res.R import com.android.systemui.settings.UserTracker import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.time.FakeSystemClock +import com.android.systemui.utils.SafeIconLoader import com.google.common.truth.Truth.assertThat import java.util.concurrent.CountDownLatch import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Answers import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.eq import org.mockito.Captor import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.Mockito.mock import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @SmallTest @@ -41,6 +50,7 @@ class ControlsEditingActivityTest : SysuiTestCase() { val TEST_COMPONENT = ComponentName("TestPackageName", "TestClassName") val TEST_STRUCTURE: CharSequence = "TestStructure" val TEST_APP: CharSequence = "TestApp" + val TEST_UID = 12345 } private val uiExecutor = FakeExecutor(FakeSystemClock()) @@ -51,6 +61,10 @@ class ControlsEditingActivityTest : SysuiTestCase() { @Mock lateinit var customIconCache: CustomIconCache + @Mock lateinit var controlsListingController: ControlsListingController + + @Mock(answer = Answers.RETURNS_MOCKS) lateinit var safeIconLoaderFactory: SafeIconLoader.Factory + private var latch: CountDownLatch = CountDownLatch(1) @Mock private lateinit var mockDispatcher: OnBackInvokedDispatcher @@ -66,8 +80,10 @@ class ControlsEditingActivityTest : SysuiTestCase() { controller, userTracker, customIconCache, + controlsListingController, + safeIconLoaderFactory, mockDispatcher, - latch + latch, ) }, /* initialTouchMode= */ false, @@ -77,6 +93,9 @@ class ControlsEditingActivityTest : SysuiTestCase() { @Before fun setUp() { MockitoAnnotations.initMocks(this) + + val serviceInfo = ControlsServiceInfo(TEST_COMPONENT, "", TEST_UID) + `when`(controlsListingController.getCurrentServices()).thenReturn(listOf(serviceInfo)) } @Test @@ -86,7 +105,7 @@ class ControlsEditingActivityTest : SysuiTestCase() { verify(mockDispatcher) .registerOnBackInvokedCallback( eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT), - captureCallback.capture() + captureCallback.capture(), ) activityRule.finishActivity() latch.await() // ensure activity is finished @@ -158,19 +177,40 @@ class ControlsEditingActivityTest : SysuiTestCase() { } ) + private fun ControlsServiceInfo( + componentName: ComponentName, + label: CharSequence, + uid: Int, + ): ControlsServiceInfo { + val serviceInfo = + ServiceInfo().apply { + applicationInfo = ApplicationInfo().apply { this.uid = uid } + packageName = componentName.packageName + name = componentName.className + } + return Mockito.spy(ControlsServiceInfo(mContext, serviceInfo)).apply { + Mockito.doReturn(label).`when`(this).loadLabel() + Mockito.doReturn(mock(Drawable::class.java)).`when`(this).loadIcon() + } + } + class TestableControlsEditingActivity( executor: FakeExecutor, controller: ControlsControllerImpl, userTracker: UserTracker, customIconCache: CustomIconCache, + controlsListingController: ControlsListingController, + safeIconLoaderFactory: SafeIconLoader.Factory, private val mockDispatcher: OnBackInvokedDispatcher, - private val latch: CountDownLatch + private val latch: CountDownLatch, ) : ControlsEditingActivity( executor, controller, userTracker, customIconCache, + controlsListingController, + safeIconLoaderFactory, ) { var startActivityData: StartActivityData? = null diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt index 7fb74b3439bc..5eb93721e735 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt @@ -2,6 +2,9 @@ package com.android.systemui.controls.management import android.content.ComponentName import android.content.Intent +import android.content.pm.ApplicationInfo +import android.content.pm.ServiceInfo +import android.graphics.drawable.Drawable import android.os.Bundle import android.service.controls.Control import android.testing.TestableLooper @@ -13,19 +16,21 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.FlakyTest import androidx.test.filters.SmallTest import androidx.test.rule.ActivityTestRule -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.activity.SingleActivityFactory import com.android.systemui.controls.ControlStatus +import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.controller.ControlsControllerImpl import com.android.systemui.controls.controller.createLoadDataObject import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FakeFeatureFlags +import com.android.systemui.res.R import com.android.systemui.settings.UserTracker import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.whenever +import com.android.systemui.utils.SafeIconLoader import com.google.common.truth.Truth.assertThat import com.google.common.util.concurrent.MoreExecutors import java.util.concurrent.CountDownLatch @@ -39,6 +44,7 @@ import org.mockito.Answers import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock +import org.mockito.Mockito import org.mockito.Mockito.eq import org.mockito.Mockito.mock import org.mockito.Mockito.verify @@ -57,6 +63,7 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { whenever(structure).thenReturn(TEST_STRUCTURE) } val TEST_APP: CharSequence = "TestApp" + val TEST_UID = 12345 private fun View.waitForPost() { val latch = CountDownLatch(1) @@ -72,6 +79,10 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { @Mock lateinit var userTracker: UserTracker + @Mock lateinit var controlsListingController: ControlsListingController + + @Mock(answer = Answers.RETURNS_MOCKS) lateinit var safeIconLoaderFactory: SafeIconLoader.Factory + private var latch: CountDownLatch = CountDownLatch(1) @Mock private lateinit var mockDispatcher: OnBackInvokedDispatcher @@ -88,8 +99,10 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { executor, controller, userTracker, + controlsListingController, + safeIconLoaderFactory, mockDispatcher, - latch + latch, ) }, /* initialTouchMode= */ false, @@ -99,6 +112,10 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { @Before fun setUp() { MockitoAnnotations.initMocks(this) + + val serviceInfo = ControlsServiceInfo(TEST_COMPONENT, "", TEST_UID) + Mockito.`when`(controlsListingController.getCurrentServices()) + .thenReturn(listOf(serviceInfo)) } // b/259549854 to root-cause and fix @@ -110,7 +127,7 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { verify(mockDispatcher) .registerOnBackInvokedCallback( eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT), - captureCallback.capture() + captureCallback.capture(), ) activityRule.finishActivity() latch.await() // ensure activity is finished @@ -178,17 +195,38 @@ class ControlsFavoritingActivityTest : SysuiTestCase() { } ) + private fun ControlsServiceInfo( + componentName: ComponentName, + label: CharSequence, + uid: Int, + ): ControlsServiceInfo { + val serviceInfo = + ServiceInfo().apply { + applicationInfo = ApplicationInfo().apply { this.uid = uid } + packageName = componentName.packageName + name = componentName.className + } + return Mockito.spy(ControlsServiceInfo(mContext, serviceInfo)).apply { + Mockito.doReturn(label).`when`(this).loadLabel() + Mockito.doReturn(mock(Drawable::class.java)).`when`(this).loadIcon() + } + } + class TestableControlsFavoritingActivity( executor: Executor, controller: ControlsControllerImpl, userTracker: UserTracker, + controlsListingController: ControlsListingController, + safeIconLoaderFactory: SafeIconLoader.Factory, private val mockDispatcher: OnBackInvokedDispatcher, - private val latch: CountDownLatch + private val latch: CountDownLatch, ) : ControlsFavoritingActivity( executor, controller, userTracker, + safeIconLoaderFactory, + controlsListingController, ) { var triedToFinish = false diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt index 4b30fa5dd161..c1c90bd41fea 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt @@ -21,6 +21,7 @@ import android.content.ComponentName import android.content.res.ColorStateList import android.graphics.drawable.GradientDrawable import android.graphics.drawable.Icon +import android.graphics.drawable.ShapeDrawable import android.service.controls.Control import android.service.controls.DeviceTypes import android.service.controls.templates.ControlTemplate @@ -30,18 +31,21 @@ import android.view.View import android.view.ViewGroup import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.controls.ControlsMetricsLogger import com.android.systemui.controls.controller.ControlInfo import com.android.systemui.controls.controller.ControlsController +import com.android.systemui.res.R import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.mockito.any import com.android.systemui.util.time.FakeSystemClock +import com.android.systemui.utils.SafeIconLoader import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.mock +import org.mockito.Mockito.`when` @SmallTest @RunWith(AndroidJUnit4::class) @@ -52,14 +56,20 @@ class ControlViewHolderTest : SysuiTestCase() { private lateinit var cvh: ControlViewHolder private lateinit var baseLayout: ViewGroup + private lateinit var safeIconLoader: SafeIconLoader @Before fun setUp() { TestableLooper.get(this).runWithLooper { - baseLayout = LayoutInflater.from(mContext).inflate( - R.layout.controls_base_item, null, false) as ViewGroup + baseLayout = + LayoutInflater.from(mContext).inflate(R.layout.controls_base_item, null, false) + as ViewGroup - cvh = ControlViewHolder( + safeIconLoader = mock(SafeIconLoader::class.java) + `when`(safeIconLoader.load(any())).thenReturn(PLAIN_DRAWABLE) + + cvh = + ControlViewHolder( baseLayout, mock(ControlsController::class.java), FakeExecutor(clock), @@ -68,15 +78,20 @@ class ControlViewHolderTest : SysuiTestCase() { mock(ControlsMetricsLogger::class.java), uid = 100, 0, - ) + safeIconLoader, + ) - val cws = ControlWithState( + val cws = + ControlWithState( ComponentName.createRelative("pkg", "cls"), ControlInfo( - CONTROL_ID, CONTROL_TITLE, "subtitle", DeviceTypes.TYPE_AIR_FRESHENER + CONTROL_ID, + CONTROL_TITLE, + "subtitle", + DeviceTypes.TYPE_AIR_FRESHENER, ), - Control.StatelessBuilder(CONTROL_ID, mock(PendingIntent::class.java)).build() - ) + Control.StatelessBuilder(CONTROL_ID, mock(PendingIntent::class.java)).build(), + ) cvh.bindData(cws, isLocked = false) } @@ -84,10 +99,11 @@ class ControlViewHolderTest : SysuiTestCase() { @Test fun updateStatusRow_customIconWithTint_iconTintRemains() { - val control = Control.StatelessBuilder(DEFAULT_CONTROL) + val control = + Control.StatelessBuilder(DEFAULT_CONTROL) .setCustomIcon( - Icon.createWithResource(mContext.resources, R.drawable.ic_emergency_star) - .setTint(TINT_COLOR) + Icon.createWithResource(mContext.resources, R.drawable.ic_emergency_star) + .setTint(TINT_COLOR) ) .build() @@ -99,10 +115,11 @@ class ControlViewHolderTest : SysuiTestCase() { @Test fun updateStatusRow_customIconWithTintList_iconTintListRemains() { val customIconTintList = ColorStateList.valueOf(TINT_COLOR) - val control = Control.StatelessBuilder(CONTROL_ID, mock(PendingIntent::class.java)) + val control = + Control.StatelessBuilder(CONTROL_ID, mock(PendingIntent::class.java)) .setCustomIcon( - Icon.createWithResource(mContext.resources, R.drawable.ic_emergency_star) - .setTintList(customIconTintList) + Icon.createWithResource(mContext.resources, R.drawable.ic_emergency_star) + .setTintList(customIconTintList) ) .build() @@ -113,22 +130,54 @@ class ControlViewHolderTest : SysuiTestCase() { @Test fun chevronIcon() { - val control = Control.StatefulBuilder(CONTROL_ID, mock(PendingIntent::class.java)) - .setStatus(Control.STATUS_OK) - .setControlTemplate(ControlTemplate.NO_TEMPLATE) - .build() - val cws = ControlWithState( - ComponentName.createRelative("pkg", "cls"), - ControlInfo( - CONTROL_ID, CONTROL_TITLE, "subtitle", DeviceTypes.TYPE_AIR_FRESHENER - ), - control - ) + val control = + Control.StatefulBuilder(CONTROL_ID, mock(PendingIntent::class.java)) + .setStatus(Control.STATUS_OK) + .setControlTemplate(ControlTemplate.NO_TEMPLATE) + .build() + val cws = + ControlWithState( + ComponentName.createRelative("pkg", "cls"), + ControlInfo(CONTROL_ID, CONTROL_TITLE, "subtitle", DeviceTypes.TYPE_AIR_FRESHENER), + control, + ) cvh.bindData(cws, false) val chevronIcon = baseLayout.requireViewById<View>(R.id.chevron_icon) assertThat(chevronIcon.visibility).isEqualTo(View.VISIBLE) } + + @Test + fun drawableLoadedSafely_showsPlainDrawableLoaded() { + val control = + Control.StatelessBuilder(DEFAULT_CONTROL) + .setCustomIcon( + Icon.createWithResource(mContext.resources, R.drawable.ic_emergency_star) + .setTint(TINT_COLOR) + ) + .build() + + cvh.updateStatusRow(enabled = true, CONTROL_TITLE, DRAWABLE, COLOR, control) + + assertThat(cvh.icon.drawable).isSameInstanceAs(PLAIN_DRAWABLE) + } + + @Test + fun drawableNotLoadedSafely_showsDefaultDrawable() { + `when`(safeIconLoader.load(any())).thenReturn(null) + + val control = + Control.StatelessBuilder(DEFAULT_CONTROL) + .setCustomIcon( + Icon.createWithResource(mContext.resources, R.drawable.ic_emergency_star) + .setTint(TINT_COLOR) + ) + .build() + + cvh.updateStatusRow(enabled = true, CONTROL_TITLE, DRAWABLE, COLOR, control) + + assertThat(cvh.icon.drawable).isSameInstanceAs(DRAWABLE) + } } private const val CONTROL_ID = "CONTROL_ID" @@ -136,6 +185,7 @@ private const val CONTROL_TITLE = "CONTROL_TITLE" private const val TINT_COLOR = 0x00ff00 // Should be different from [COLOR] private val DRAWABLE = GradientDrawable() +private val PLAIN_DRAWABLE = ShapeDrawable() private val COLOR = ColorStateList.valueOf(0xffff00) -private val DEFAULT_CONTROL = Control.StatelessBuilder( - CONTROL_ID, mock(PendingIntent::class.java)).build() +private val DEFAULT_CONTROL = + Control.StatelessBuilder(CONTROL_ID, mock(PendingIntent::class.java)).build() diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt index 20890a7780c8..3a0bda4b3259 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt @@ -63,6 +63,7 @@ import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock +import com.android.systemui.utils.SafeIconLoader import com.android.wm.shell.taskview.TaskView import com.android.wm.shell.taskview.TaskViewFactory import com.google.common.truth.Truth.assertThat @@ -71,6 +72,7 @@ import java.util.function.Consumer import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Answers import org.mockito.Mock import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.doAnswer @@ -102,6 +104,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { @Mock lateinit var featureFlags: FeatureFlags @Mock lateinit var packageManager: PackageManager @Mock lateinit var systemUIDialogFactory: SystemUIDialog.Factory + @Mock(answer = Answers.RETURNS_MOCKS) lateinit var safeIconLoaderFactory: SafeIconLoader.Factory private val preferredPanelRepository = kosmos.selectedComponentRepository private lateinit var fakeDialogController: FakeSystemUIDialogController @@ -130,7 +133,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { Context.LAYOUT_INFLATER_SERVICE, mContext.baseContext .getSystemService(LayoutInflater::class.java)!! - .cloneInContext(mContext) + .cloneInContext(mContext), ) parent = FrameLayout(mContext) @@ -154,6 +157,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { authorizedPanelsRepository, preferredPanelRepository, featureFlags, + safeIconLoaderFactory, ControlsDialogsFactory(systemUIDialogFactory), dumpManager, ) @@ -303,7 +307,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { assertThat( intent.getBooleanExtra( ControlsProviderService.EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS, - false + false, ) ) .isTrue() @@ -341,7 +345,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { assertThat( intent.getBooleanExtra( ControlsProviderService.EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS, - false + false, ) ) .isTrue() @@ -374,7 +378,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { assertThat( pendingIntent.intent.getBooleanExtra( ControlsProviderService.EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS, - false + false, ) ) .isTrue() @@ -393,7 +397,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { assertThat( newPendingIntent.intent.getBooleanExtra( ControlsProviderService.EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS, - false + false, ) ) .isFalse() @@ -416,9 +420,9 @@ class ControlsUiControllerImplTest : SysuiTestCase() { StructureInfo( checkNotNull(ComponentName.unflattenFromString("pkg/.cls1")), "a", - ArrayList() + ArrayList(), ) - ), + ) ) preferredPanelRepository.setSelectedComponent( SelectedComponentRepository.SelectedComponent(selectedItems[0]) @@ -598,7 +602,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { private fun ControlsServiceInfo( componentName: ComponentName, label: CharSequence, - panelComponentName: ComponentName? = null + panelComponentName: ComponentName? = null, ): ControlsServiceInfo { val serviceInfo = ServiceInfo().apply { @@ -621,7 +625,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { view: View?, name: String, context: Context, - attrs: AttributeSet + attrs: AttributeSet, ): View? { return onCreateView(name, context, attrs) } @@ -629,7 +633,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { override fun onCreateView( name: String, context: Context, - attrs: AttributeSet + attrs: AttributeSet, ): View? { if (FrameLayout::class.java.simpleName.equals(name)) { val mock: FrameLayout = mock { diff --git a/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt index 2850ab7b1e41..f893aba240fc 100644 --- a/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt @@ -19,9 +19,7 @@ import android.app.WallpaperManager import android.content.applicationContext import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.wallpaperManager: WallpaperManager by Fixture { WallpaperManager.getInstance(applicationContext) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/SysUITestModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/SysUITestModule.kt index c9458125e762..dfcda222e54f 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/SysUITestModule.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/SysUITestModule.kt @@ -51,7 +51,6 @@ import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent @@ -148,7 +147,6 @@ interface SysUITestComponent<out T> { val underTest: T } -@OptIn(ExperimentalCoroutinesApi::class) fun <T : SysUITestComponent<*>> T.runTest(block: suspend T.() -> Unit): Unit = testScope.runTest { // Access underTest immediately to force Dagger to instantiate it prior to the test running @@ -157,7 +155,6 @@ fun <T : SysUITestComponent<*>> T.runTest(block: suspend T.() -> Unit): Unit = block() } -@OptIn(ExperimentalCoroutinesApi::class) fun SysUITestComponent<*>.runCurrent() = testScope.runCurrent() fun <T> SysUITestComponent<*>.collectLastValue( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/authentication/data/repository/FakeAuthenticationRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/authentication/data/repository/FakeAuthenticationRepository.kt index a7917a0866bb..3c264b9d6a81 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/authentication/data/repository/FakeAuthenticationRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/authentication/data/repository/FakeAuthenticationRepository.kt @@ -28,7 +28,6 @@ import com.android.systemui.dagger.SysUISingleton import dagger.Binds import dagger.Module import dagger.Provides -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -260,7 +259,6 @@ class FakeAuthenticationRepository(private val currentTime: () -> Long) : Authen } } -@OptIn(ExperimentalCoroutinesApi::class) @Module(includes = [FakeAuthenticationRepositoryModule.Bindings::class]) object FakeAuthenticationRepositoryModule { @Provides diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderKosmos.kt index 79d58a1d4e40..e3bd6fa27d4c 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderKosmos.kt @@ -27,9 +27,7 @@ import com.android.systemui.keyguard.ui.viewmodel.sideFpsProgressBarViewModel import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.sideFpsOverlayViewBinder by Fixture { SideFpsOverlayViewBinder( applicationScope = applicationCoroutineScope, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelKosmos.kt index e2386a6a42b4..220bb90303b8 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelKosmos.kt @@ -23,9 +23,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.statusbar.phone.systemUIDialogManager import com.android.systemui.util.mockito.mock -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.deviceEntryUdfpsTouchOverlayViewModel by Fixture { DeviceEntryUdfpsTouchOverlayViewModel( deviceEntryIconViewModel = deviceEntryIconViewModel, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelKosmos.kt index de038559fc38..e79c089361af 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelKosmos.kt @@ -22,9 +22,7 @@ import com.android.systemui.biometrics.domain.interactor.sideFpsSensorInteractor import com.android.systemui.keyguard.domain.interactor.deviceEntrySideFpsOverlayInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.sideFpsOverlayViewModel by Fixture { SideFpsOverlayViewModel( applicationContext = applicationContext, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModelKosmos.kt index 5c5969d359c3..7de71ff44bb1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.bouncer.ui.viewmodel import android.content.applicationContext @@ -30,7 +28,6 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.user.ui.viewmodel.userSwitcherViewModel import com.android.systemui.util.time.systemClock -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.bouncerMessageViewModel by Fixture { BouncerMessageViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt index 72541540226c..3bfd95816cf0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.bouncer.ui.viewmodel import android.app.admin.devicePolicyManager @@ -34,7 +32,6 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.user.domain.interactor.selectedUserInteractor import com.android.systemui.user.ui.viewmodel.userSwitcherViewModel -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.StateFlow val Kosmos.bouncerUserActionsViewModel by Fixture { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalSceneRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalSceneRepository.kt index 82454817ecbb..b3c1411243c1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalSceneRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalSceneRepository.kt @@ -5,7 +5,6 @@ import com.android.compose.animation.scene.SceneKey import com.android.compose.animation.scene.TransitionKey import com.android.systemui.communal.shared.model.CommunalScenes import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted @@ -16,7 +15,6 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch /** Fake implementation of [CommunalSceneRepository]. */ -@OptIn(ExperimentalCoroutinesApi::class) class FakeCommunalSceneRepository( private val applicationScope: CoroutineScope, override val currentScene: MutableStateFlow<SceneKey> = diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/data/repository/FakePosturingRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/data/repository/FakePosturingRepository.kt new file mode 100644 index 000000000000..8a597a61ee78 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/data/repository/FakePosturingRepository.kt @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.data.repository + +import com.android.systemui.communal.posturing.shared.model.PosturedState +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class FakePosturingRepository : PosturingRepository { + private val _postured = MutableStateFlow<PosturedState>(PosturedState.Unknown) + + override val posturedState: StateFlow<PosturedState> = _postured.asStateFlow() + + fun setPosturedState(state: PosturedState) { + _postured.value = state + } +} + +val PosturingRepository.fake + get() = this as FakePosturingRepository diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/data/repository/PosturingRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/data/repository/PosturingRepositoryKosmos.kt new file mode 100644 index 000000000000..105a3581b787 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/data/repository/PosturingRepositoryKosmos.kt @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.data.repository + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.posturingRepository by Kosmos.Fixture<PosturingRepository> { FakePosturingRepository() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractorKosmos.kt new file mode 100644 index 000000000000..53c9c6440c69 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/posturing/domain/interactor/PosturingInteractorKosmos.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.posturing.domain.interactor + +import com.android.systemui.communal.posturing.data.repository.posturingRepository +import com.android.systemui.kosmos.Kosmos + +val Kosmos.posturingInteractor by + Kosmos.Fixture<PosturingInteractor> { PosturingInteractor(repository = posturingRepository) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelKosmos.kt index 1ae8449d8b4d..7b0c09cd80a6 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelKosmos.kt @@ -26,9 +26,7 @@ import com.android.systemui.keyguard.ui.viewmodel.glanceableHubToLockscreenTrans import com.android.systemui.keyguard.ui.viewmodel.lockscreenToGlanceableHubTransitionViewModel import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.communalTransitionViewModel by Kosmos.Fixture { CommunalTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/coroutines/TestCoroutineSchedulerUtils.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/coroutines/TestCoroutineSchedulerUtils.kt index 84e2a5c7d4c2..2fb73264b3d4 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/coroutines/TestCoroutineSchedulerUtils.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/coroutines/TestCoroutineSchedulerUtils.kt @@ -13,12 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.coroutines import kotlin.time.Duration -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestCoroutineScheduler /** diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/ui/viewmodel/UdfpsAccessibilityOverlayViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/ui/viewmodel/UdfpsAccessibilityOverlayViewModelKosmos.kt index cdeade1876a7..2a46437ed33e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/ui/viewmodel/UdfpsAccessibilityOverlayViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/ui/viewmodel/UdfpsAccessibilityOverlayViewModelKosmos.kt @@ -22,9 +22,7 @@ import com.android.systemui.deviceentry.ui.viewmodel.DeviceEntryUdfpsAccessibili import com.android.systemui.keyguard.ui.viewmodel.deviceEntryForegroundIconViewModel import com.android.systemui.keyguard.ui.viewmodel.deviceEntryIconViewModel import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.deviceEntryUdfpsAccessibilityOverlayViewModel by Kosmos.Fixture { DeviceEntryUdfpsAccessibilityOverlayViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/AuthRippleInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/AuthRippleInteractorKosmos.kt index 3070cf4c06ad..015d4ddcd54e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/AuthRippleInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/AuthRippleInteractorKosmos.kt @@ -17,9 +17,7 @@ package com.android.systemui.deviceentry.domain.interactor import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.authRippleInteractor by Kosmos.Fixture { AuthRippleInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractorKosmos.kt index 77d39f066e08..6b6488122b68 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractorKosmos.kt @@ -20,9 +20,7 @@ import android.content.res.mainResources import com.android.systemui.biometrics.domain.interactor.fingerprintPropertyInteractor import com.android.systemui.keyguard.domain.interactor.devicePostureInteractor import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.biometricMessageInteractor by Kosmos.Fixture { BiometricMessageInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricAuthInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricAuthInteractorKosmos.kt index 1bd105620813..281782ad726a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricAuthInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricAuthInteractorKosmos.kt @@ -14,13 +14,10 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.deviceentry.domain.interactor import com.android.systemui.keyguard.data.repository.biometricSettingsRepository import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.deviceEntryBiometricAuthInteractor by Kosmos.Fixture { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricSettingsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricSettingsInteractorKosmos.kt index 4fcf43a2a055..44755897f88e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricSettingsInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricSettingsInteractorKosmos.kt @@ -18,9 +18,7 @@ package com.android.systemui.deviceentry.domain.interactor import com.android.systemui.keyguard.data.repository.biometricSettingsRepository import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.deviceEntryBiometricSettingsInteractor by Kosmos.Fixture { DeviceEntryBiometricSettingsInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricsAllowedInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricsAllowedInteractorKosmos.kt index 4357289b227e..3c08e5c55349 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricsAllowedInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricsAllowedInteractorKosmos.kt @@ -14,13 +14,10 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.deviceentry.domain.interactor import com.android.systemui.biometrics.data.repository.facePropertyRepository import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.deviceEntryBiometricsAllowedInteractor by Kosmos.Fixture { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorKosmos.kt index 3dfe0eea500f..33f8f40677af 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.deviceentry.domain.interactor import android.content.applicationContext @@ -36,7 +34,6 @@ import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.user.data.repository.userRepository import com.android.systemui.util.mockito.mock -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.faceAuthLogger by Kosmos.Fixture { mock<FaceAuthenticationLogger>() } val Kosmos.deviceEntryFaceAuthInteractor by diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthStatusInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthStatusInteractorKosmos.kt index 66d3709d14dc..4a489ab2773c 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthStatusInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthStatusInteractorKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.deviceentry.domain.interactor import android.content.res.mainResources import com.android.systemui.keyguard.data.repository.deviceEntryFaceAuthRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.deviceEntryFaceAuthStatusInteractor by Kosmos.Fixture { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractorKosmos.kt index ebed922c423e..4d767e57e631 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractorKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.deviceentry.domain.interactor import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository import com.android.systemui.keyguard.data.repository.deviceEntryFingerprintAuthRepository import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.deviceEntryFingerprintAuthInteractor by Kosmos.Fixture { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryHapticsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryHapticsInteractorKosmos.kt index 490b89bf6b13..6f570a86b19e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryHapticsInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryHapticsInteractorKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.deviceentry.domain.interactor import com.android.keyguard.logging.biometricUnlockLogger @@ -27,9 +25,7 @@ import com.android.systemui.keyguard.domain.interactor.keyguardBypassInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.util.time.systemClock -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.deviceEntryHapticsInteractor by Kosmos.Fixture { DeviceEntryHapticsInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt index 096022ce1507..1d3fd300da06 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt @@ -24,9 +24,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.scene.domain.interactor.sceneBackInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.deviceEntryInteractor by Kosmos.Fixture { DeviceEntryInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntrySourceInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntrySourceInteractorKosmos.kt index f91a044ad802..845d481cbbb7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntrySourceInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntrySourceInteractorKosmos.kt @@ -27,9 +27,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.statusbar.phone.dozeScrimController -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.deviceEntrySourceInteractor by Kosmos.Fixture { DeviceEntrySourceInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorKosmos.kt index 81123d09b43a..44d3c33c95fb 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.deviceentry.domain.interactor import com.android.systemui.biometrics.domain.interactor.fingerprintPropertyInteractor @@ -23,7 +21,6 @@ import com.android.systemui.keyguard.data.repository.biometricSettingsRepository import com.android.systemui.keyguard.data.repository.deviceEntryFingerprintAuthRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.deviceEntryUdfpsInteractor by Fixture { DeviceEntryUdfpsInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/FaceHelpMessageDeferralInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/FaceHelpMessageDeferralInteractorKosmos.kt index 724e943c9f55..79a9c57169a3 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/FaceHelpMessageDeferralInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/FaceHelpMessageDeferralInteractorKosmos.kt @@ -19,9 +19,7 @@ package com.android.systemui.deviceentry.domain.interactor import com.android.systemui.biometrics.domain.faceHelpMessageDeferralFactory import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.faceHelpMessageDeferralInteractor by Kosmos.Fixture { FaceHelpMessageDeferralInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractorKosmos.kt index 3680e651246b..3d5c99cf180a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractorKosmos.kt @@ -27,9 +27,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.plugins.activityStarter import com.android.systemui.power.domain.interactor.powerInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.occludingAppDeviceEntryInteractor by Kosmos.Fixture { OccludingAppDeviceEntryInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/ui/binder/LiftToRunFaceAuthBinderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/ui/binder/LiftToRunFaceAuthBinderKosmos.kt index 2fead91b430a..199a4a4d932c 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/ui/binder/LiftToRunFaceAuthBinderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/ui/binder/LiftToRunFaceAuthBinderKosmos.kt @@ -26,9 +26,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.util.sensors.asyncSensorManager -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.liftToRunFaceAuthBinder by Kosmos.Fixture { LiftToRunFaceAuthBinder( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt index 60a6f3d904d4..0192fa47b434 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt @@ -32,6 +32,7 @@ import com.android.systemui.keyboard.shortcut.data.repository.ShortcutCategories import com.android.systemui.keyboard.shortcut.data.repository.ShortcutHelperInputDeviceRepository import com.android.systemui.keyboard.shortcut.data.repository.ShortcutHelperStateRepository import com.android.systemui.keyboard.shortcut.data.repository.ShortcutHelperTestHelper +import com.android.systemui.keyboard.shortcut.data.source.AccessibilityShortcutsSource import com.android.systemui.keyboard.shortcut.data.source.AppCategoriesShortcutsSource import com.android.systemui.keyboard.shortcut.data.source.CurrentAppShortcutsSource import com.android.systemui.keyboard.shortcut.data.source.InputShortcutsSource @@ -78,6 +79,9 @@ var Kosmos.shortcutHelperInputShortcutsSource: KeyboardShortcutGroupsSource by var Kosmos.shortcutHelperCurrentAppShortcutsSource: KeyboardShortcutGroupsSource by Kosmos.Fixture { CurrentAppShortcutsSource(windowManager) } +val Kosmos.shortcutHelperAccessibilityShortcutsSource: KeyboardShortcutGroupsSource by + Kosmos.Fixture { AccessibilityShortcutsSource(mainResources) } + val Kosmos.shortcutHelperExclusions by Kosmos.Fixture { ShortcutHelperExclusions(applicationContext) } @@ -100,6 +104,7 @@ val Kosmos.defaultShortcutCategoriesRepository by shortcutHelperAppCategoriesShortcutsSource, shortcutHelperInputShortcutsSource, shortcutHelperCurrentAppShortcutsSource, + shortcutHelperAccessibilityShortcutsSource, shortcutHelperInputDeviceRepository, shortcutCategoriesUtils, ) @@ -154,7 +159,7 @@ val Kosmos.shortcutHelperCoreStartable by shortcutHelperStateRepository, activityStarter, testScope, - customInputGesturesRepository + customInputGesturesRepository, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryKosmos.kt index d59b5d56db3f..a91ed0f4b904 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryKosmos.kt @@ -68,6 +68,7 @@ val Kosmos.defaultKeyguardBlueprint by keyguardSliceViewSection = mock(), udfpsAccessibilityOverlaySection = mock(), accessibilityActionsSection = mock(), + aodPromotedNotificationSection = mock(), ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractorKosmos.kt index 40131c772de7..26ebe2e41a17 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/BurnInInteractorKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.domain.interactor import android.content.applicationContext @@ -24,7 +22,6 @@ import com.android.systemui.doze.util.burnInHelperWrapper import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.burnInInteractor by Fixture { BurnInInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractorKosmos.kt index 75eb3c9ad7ad..b920dbf88e77 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractorKosmos.kt @@ -18,9 +18,7 @@ package com.android.systemui.keyguard.domain.interactor import com.android.systemui.keyguard.data.repository.devicePostureRepository import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.devicePostureInteractor by Kosmos.Fixture { DevicePostureInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt index ce317d43e988..7b0d208298d0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt @@ -24,9 +24,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.testDispatcher import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.fromAlternateBouncerTransitionInteractor by Kosmos.Fixture { FromAlternateBouncerTransitionInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt index e6c98cd83b5e..d995b868a162 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt @@ -27,9 +27,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.testDispatcher import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) var Kosmos.fromDreamingTransitionInteractor by Kosmos.Fixture { FromDreamingTransitionInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.kt index 09f5fd79eeca..1d7671170d5b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.kt @@ -25,9 +25,7 @@ import com.android.systemui.kosmos.testScope import com.android.systemui.log.logcatLogBuffer import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.keyguardDismissActionInteractor by Kosmos.Fixture { KeyguardDismissActionInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorKosmos.kt index 339210c07437..277c2ffa6e9a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorKosmos.kt @@ -26,9 +26,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.testDispatcher import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.user.domain.interactor.selectedUserInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.keyguardDismissInteractor by Kosmos.Fixture { KeyguardDismissInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardSmartspaceInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardSmartspaceInteractorKosmos.kt index b5d5d641b0fe..87109b17ef0e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardSmartspaceInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardSmartspaceInteractorKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.domain.interactor import com.android.systemui.keyguard.data.repository.keyguardSmartspaceRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.keyguardSmartspaceInteractor by Fixture { KeyguardSmartspaceInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowKosmos.kt index 1a05d21cc30a..31fb36eb26db 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui import com.android.keyguard.logging.keyguardTransitionAnimationLogger import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.keyguardTransitionAnimationFlow by Fixture { KeyguardTransitionAnimationFlow( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderKosmos.kt index 740d8919cbc0..697e7b9476ca 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderKosmos.kt @@ -38,9 +38,7 @@ import com.android.systemui.log.logcatLogBuffer import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.statusbar.gesture.TapGestureDetector import com.android.systemui.util.mockito.mock -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.alternateBouncerViewBinder by Kosmos.Fixture { AlternateBouncerViewBinder( @@ -52,7 +50,6 @@ val Kosmos.alternateBouncerViewBinder by ) } -@ExperimentalCoroutinesApi private val Kosmos.alternateBouncerDependencies by Kosmos.Fixture { AlternateBouncerDependencies( @@ -69,7 +66,6 @@ private val Kosmos.alternateBouncerDependencies by ) } -@ExperimentalCoroutinesApi private val Kosmos.alternateBouncerUdfpsIconViewModel by Kosmos.Fixture { AlternateBouncerUdfpsIconViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerMessageAreaViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerMessageAreaViewModelKosmos.kt index b7d9676040d0..938556e71cbb 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerMessageAreaViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerMessageAreaViewModelKosmos.kt @@ -20,9 +20,7 @@ import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor import com.android.systemui.deviceentry.domain.interactor.biometricMessageInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.util.time.systemClock -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.alternateBouncerMessageAreaViewModel by Kosmos.Fixture { AlternateBouncerMessageAreaViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToAodTransitionViewModelKosmos.kt index 3ed9392bab2a..7d729e38fdca 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToAodTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToAodTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.alternateBouncerToAodTransitionViewModel by Fixture { AlternateBouncerToAodTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToDozingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToDozingTransitionViewModelKosmos.kt index c6f07068aad4..71cfb40c11d6 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToDozingTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToDozingTransitionViewModelKosmos.kt @@ -20,9 +20,7 @@ import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsIntera import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.alternateBouncerToDozingTransitionViewModel by Fixture { AlternateBouncerToDozingTransitionViewModel( deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelKosmos.kt index b943298f6b53..3ec0ee040269 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.statusbar.sysuiStatusBarStateController -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.alternateBouncerToGoneTransitionViewModel by Fixture { AlternateBouncerToGoneTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToLockscreenTransitionViewModelKosmos.kt index 6c644eee24ff..346580a91f9b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToLockscreenTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.alternateBouncerToLockscreenTransitionViewModel by Fixture { AlternateBouncerToLockscreenTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModelKosmos.kt index 71ad3c6689f7..87367b24fc7d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.alternateBouncerToOccludedTransitionViewModel by Fixture { AlternateBouncerToOccludedTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelKosmos.kt index 79892442092c..7bf778deeab5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelKosmos.kt @@ -14,17 +14,13 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.alternateBouncerToPrimaryBouncerTransitionViewModel by Fixture { AlternateBouncerToPrimaryBouncerTransitionViewModel( animationFlow = keyguardTransitionAnimationFlow, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelKosmos.kt index f1d87fe3abb7..3da27cb3c11d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor @@ -25,7 +23,6 @@ import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInterac import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.statusbar.phone.statusBarKeyguardViewManager -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.alternateBouncerViewModel by Fixture { AlternateBouncerViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelKosmos.kt index 92cfbef987f6..335ab84a0851 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.alternateBouncerWindowViewModel by Fixture { AlternateBouncerWindowViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelKosmos.kt index c3c2c8c95aad..1471ddbcea61 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.common.ui.domain.interactor.configurationInteractor @@ -25,7 +23,6 @@ import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInterac import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.aodBurnInViewModel by Fixture { AodBurnInViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelKosmos.kt index b6f278c1b466..6aad53a5d067 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.aodToGoneTransitionViewModel by Fixture { AodToGoneTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelKosmos.kt index b8fcec648393..25a8d5d201be 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.shade.domain.interactor.shadeInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.aodToLockscreenTransitionViewModel by Fixture { AodToLockscreenTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelKosmos.kt index 8d066fc05996..3b33ee47bc41 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.aodToOccludedTransitionViewModel by Fixture { AodToOccludedTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToPrimaryBouncerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToPrimaryBouncerViewModelKosmos.kt index faa290be6129..ae411367fcfc 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToPrimaryBouncerViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToPrimaryBouncerViewModelKosmos.kt @@ -20,9 +20,7 @@ import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.aodToPrimaryBouncerTransitionViewModel by Fixture { AodToPrimaryBouncerTransitionViewModel( animationFlow = keyguardTransitionAnimationFlow, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt index 9774e4aa51a5..0b364eafb418 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.bouncer.domain.interactor.mockPrimaryBouncerInteractor @@ -25,7 +23,6 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.sysuiStatusBarStateController -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.bouncerToGoneFlows by Fixture { BouncerToGoneFlows( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelKosmos.kt index fc4f3a553d51..bd0045501ec8 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelKosmos.kt @@ -21,9 +21,7 @@ import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.deviceEntryBackgroundViewModel by Fixture { DeviceEntryBackgroundViewModel( context = applicationContext, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryFgIconViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryFgIconViewModelKosmos.kt index 4f638d0e4a38..1a4bd338ade7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryFgIconViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryFgIconViewModelKosmos.kt @@ -23,9 +23,7 @@ import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsIntera import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.deviceEntryForegroundIconViewModel by Fixture { DeviceEntryForegroundViewModel( context = applicationContext, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelKosmos.kt index 67fa857a1ecd..f8393d537f82 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelKosmos.kt @@ -29,7 +29,6 @@ import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.testScope import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.phone.statusBarKeyguardViewManager -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.fakeDeviceEntryIconViewModelTransition by Fixture { FakeDeviceEntryIconTransition() } @@ -37,7 +36,6 @@ val Kosmos.deviceEntryIconViewModelTransitionsMock by Fixture { setOf<DeviceEntryIconTransition>(fakeDeviceEntryIconViewModelTransition) } -@ExperimentalCoroutinesApi val Kosmos.deviceEntryIconViewModel by Fixture { DeviceEntryIconViewModel( transitions = deviceEntryIconViewModelTransitionsMock, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToGlanceableHubTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToGlanceableHubTransitionViewModelKosmos.kt index ef10459b45cb..87c3dbf9487e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToGlanceableHubTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToGlanceableHubTransitionViewModelKosmos.kt @@ -19,9 +19,7 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.dozingToGlanceableHubTransitionViewModel by Fixture { DozingToGlanceableHubTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToGoneTransitionViewModelKosmos.kt index 36ddc29b8914..7c066036b131 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToGoneTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToGoneTransitionViewModelKosmos.kt @@ -19,9 +19,7 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.dozingToGoneTransitionViewModel by Fixture { DozingToGoneTransitionViewModel( animationFlow = keyguardTransitionAnimationFlow, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModelKosmos.kt index de52d848e94b..46f9f8dcd962 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModelKosmos.kt @@ -19,9 +19,7 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.dozingToLockscreenTransitionViewModel by Fixture { DozingToLockscreenTransitionViewModel( animationFlow = keyguardTransitionAnimationFlow, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToOccludedTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToOccludedTransitionViewModelKosmos.kt index 8162520e5d88..25865ae8700f 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToOccludedTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToOccludedTransitionViewModelKosmos.kt @@ -18,9 +18,7 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.dozingToOccludedTransitionViewModel by Kosmos.Fixture { DozingToOccludedTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModelKosmos.kt index d3ccb297fc9d..39f9530bcb17 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModelKosmos.kt @@ -20,9 +20,7 @@ import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.dozingToPrimaryBouncerTransitionViewModel by Fixture { DozingToPrimaryBouncerTransitionViewModel( animationFlow = keyguardTransitionAnimationFlow, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToAodTransitionViewModelKosmos.kt index b5f0b897deba..ec1f906dc179 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToAodTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToAodTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.dreamingToAodTransitionViewModel by Fixture { DreamingToAodTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGoneTransitionViewModelKosmos.kt index f389142554b1..1e832bdf82dd 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGoneTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGoneTransitionViewModelKosmos.kt @@ -18,9 +18,7 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.dreamingToGoneTransitionViewModel by Kosmos.Fixture { DreamingToGoneTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelKosmos.kt index d06bab2f5345..1d0a210110ed 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelKosmos.kt @@ -19,9 +19,7 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.dreamingToLockscreenTransitionViewModel by Fixture { DreamingToLockscreenTransitionViewModel( animationFlow = keyguardTransitionAnimationFlow, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModelKosmos.kt index b1c21b8fa6cf..bb1098f14ea6 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModelKosmos.kt @@ -14,17 +14,13 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.glanceableHubToLockscreenTransitionViewModel by Fixture { GlanceableHubToLockscreenTransitionViewModel( configurationInteractor = configurationInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelKosmos.kt index 8549a30c346e..2d24ef2fcfee 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor @@ -23,7 +21,6 @@ import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.power.domain.interactor.powerInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.goneToAodTransitionViewModel by Fixture { GoneToAodTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDozingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDozingTransitionViewModelKosmos.kt index b19d4e87e68c..3f7348be8fe5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDozingTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDozingTransitionViewModelKosmos.kt @@ -20,9 +20,7 @@ import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsIntera import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.goneToDozingTransitionViewModel by Fixture { GoneToDozingTransitionViewModel( deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelKosmos.kt index b267a962a1ff..86ef95cbab4c 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.goneToDreamingTransitionViewModel by Fixture { GoneToDreamingTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModelKosmos.kt index 1b6fa064854d..4322a887928a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.goneToLockscreenTransitionViewModel by Fixture { GoneToLockscreenTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt index 1c0f97d294df..40b8e0e62b03 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt @@ -13,8 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.communal.domain.interactor.communalInteractor @@ -31,7 +29,6 @@ import com.android.systemui.statusbar.notification.icon.ui.viewmodel.notificatio import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor import com.android.systemui.statusbar.phone.dozeParameters import com.android.systemui.statusbar.phone.screenOffAnimationController -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.keyguardRootViewModel by Fixture { KeyguardRootViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelKosmos.kt index f45e33bf6865..5234b5bd17e2 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor @@ -23,7 +21,6 @@ import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.power.domain.interactor.powerInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.lockscreenToAodTransitionViewModel by Fixture { LockscreenToAodTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModelKosmos.kt index aa8e9a8c9a8c..bf1af3c47674 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModelKosmos.kt @@ -20,9 +20,7 @@ import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsIntera import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.lockscreenToDozingTransitionViewModel by Fixture { LockscreenToDozingTransitionViewModel( deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelKosmos.kt index 56d5ff6e30eb..1246b9455b4b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.lockscreenToDreamingTransitionViewModel by Fixture { LockscreenToDreamingTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModelKosmos.kt index 471381f7a13f..0e961ccaf07b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModelKosmos.kt @@ -14,17 +14,13 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.lockscreenToGlanceableHubTransitionViewModel by Fixture { LockscreenToGlanceableHubTransitionViewModel( configurationInteractor = configurationInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt index 7a023ee29299..172b4f8db92b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt @@ -20,9 +20,7 @@ import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.statusbar.sysuiStatusBarStateController -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.lockscreenToGoneTransitionViewModel by Fixture { LockscreenToGoneTransitionViewModel( animationFlow = keyguardTransitionAnimationFlow, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelKosmos.kt index 9953d39e9a49..abd29cadb8f7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.lockscreenToOccludedTransitionViewModel by Fixture { LockscreenToOccludedTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelKosmos.kt index 68280d7622fd..b5c67b66ae5f 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.lockscreenToPrimaryBouncerTransitionViewModel by Fixture { LockscreenToPrimaryBouncerTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt index 2acd1b40af3e..39a545a8c451 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.occludedToAlternateBouncerTransitionViewModel by Fixture { OccludedToAlternateBouncerTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelKosmos.kt index b7867b6cabde..dd6d9acaa33e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.occludedToAodTransitionViewModel by Fixture { OccludedToAodTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModelKosmos.kt index 4196e54a085d..4e8896ab11c1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.occludedToDozingTransitionViewModel by Fixture { OccludedToDozingTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToGoneTransitionViewModelKosmos.kt index 3b96912b53c6..70e9af1b1058 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToGoneTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToGoneTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.occludedToGoneTransitionViewModel by Fixture { OccludedToGoneTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelKosmos.kt index f86e9b7216ce..5b1d8f126f84 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.common.ui.domain.interactor.configurationInteractor @@ -25,7 +23,6 @@ import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInterac import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi var Kosmos.occludedToLockscreenTransitionViewModel by Fixture { OccludedToLockscreenTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelKosmos.kt index 5d62a0f4a0cf..579819f6d265 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModelKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.offToLockscreenTransitionViewModel by Fixture { OffToLockscreenTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelKosmos.kt index 043a49f5f640..73ef4328657a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor @@ -23,7 +21,6 @@ import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.primaryBouncerToAodTransitionViewModel by Fixture { PrimaryBouncerToAodTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModelKosmos.kt index 59ea2c93089c..99297351bdaa 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModelKosmos.kt @@ -21,9 +21,7 @@ import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi -@ExperimentalCoroutinesApi val Kosmos.primaryBouncerToDozingTransitionViewModel by Fixture { PrimaryBouncerToDozingTransitionViewModel( deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt index b470ab12828b..acf0827b1614 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.bouncer.domain.interactor.mockPrimaryBouncerInteractor @@ -25,7 +23,6 @@ import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.statusbar.sysuiStatusBarStateController -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.primaryBouncerToGoneTransitionViewModel by Fixture { PrimaryBouncerToGoneTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelKosmos.kt index c3447753a86d..bd5a21195795 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelKosmos.kt @@ -14,15 +14,12 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.primaryBouncerToLockscreenTransitionViewModel by Fixture { PrimaryBouncerToLockscreenTransitionViewModel( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModelKosmos.kt index 8da16fc4e855..e38c419a97f2 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModelKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.keyguard.ui.viewmodel import android.content.applicationContext @@ -29,7 +27,6 @@ import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.statusbar.phone.dozeServiceHost -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.sideFpsProgressBarViewModel by Kosmos.Fixture { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt index 439df543b9fb..a4c2cc275e44 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt @@ -9,7 +9,6 @@ import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.settings.brightness.ui.BrightnessWarningToast import com.android.systemui.util.mockito.mock import kotlin.coroutines.CoroutineContext -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch @@ -73,7 +72,6 @@ fun <T> Kosmos.collectValues(flow: Flow<T>): FlowValue<List<T>> = testScope.coll * If you want to assert on a [Flow] that is not a [StateFlow], please use * [TestScope.collectLastValue], to make sure that the desired value is captured when emitted. */ -@OptIn(ExperimentalCoroutinesApi::class) fun <T> TestScope.currentValue(stateFlow: StateFlow<T>): T { val values = mutableListOf<T>() val job = backgroundScope.launch { stateFlow.collect(values::add) } @@ -90,7 +88,6 @@ fun <T> Kosmos.currentValue(fn: () -> T) = testScope.currentValue(fn) * Retrieve the result of [fn] after running all pending tasks. Do not use to retrieve the value of * a flow directly; for that, use either `currentValue(StateFlow)` or [collectLastValue] */ -@OptIn(ExperimentalCoroutinesApi::class) fun <T> TestScope.currentValue(fn: () -> T): T { runCurrent() return fn() @@ -102,7 +99,6 @@ fun <T> Kosmos.currentValue(stateFlow: StateFlow<T>): T { } /** Safely verify that a mock has been called after the test scope has caught up */ -@OptIn(ExperimentalCoroutinesApi::class) fun <T> TestScope.verifyCurrent(mock: T): T { runCurrent() return verify(mock) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt index 39f1ad42797b..35e90f06ddde 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.kosmos import android.content.applicationContext @@ -92,7 +90,6 @@ import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisionin import com.android.systemui.statusbar.ui.viewmodel.keyguardStatusBarViewModel import com.android.systemui.util.time.systemClock import com.android.systemui.volume.domain.interactor.volumeDialogInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi /** * Helper for using [Kosmos] from Java. diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/mediaprojection/taskswitcher/TaskSwitcherKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/mediaprojection/taskswitcher/TaskSwitcherKosmos.kt index 5acadd7f192a..2ef3f4a70998 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/mediaprojection/taskswitcher/TaskSwitcherKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/mediaprojection/taskswitcher/TaskSwitcherKosmos.kt @@ -23,7 +23,6 @@ import com.android.systemui.mediaprojection.data.repository.realMediaProjectionR import com.android.systemui.mediaprojection.taskswitcher.data.repository.ActivityTaskManagerTasksRepository import com.android.systemui.mediaprojection.taskswitcher.domain.interactor.TaskSwitchInteractor import com.android.systemui.mediaprojection.taskswitcher.ui.viewmodel.TaskSwitcherNotificationViewModel -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.UnconfinedTestDispatcher val Kosmos.fakeActivityTaskManager by Kosmos.Fixture { FakeActivityTaskManager() } @@ -47,5 +46,4 @@ val Kosmos.taskSwitcherInteractor by val Kosmos.taskSwitcherViewModel by Kosmos.Fixture { TaskSwitcherNotificationViewModel(taskSwitcherInteractor, testDispatcher) } -@OptIn(ExperimentalCoroutinesApi::class) fun taskSwitcherKosmos() = Kosmos().apply { testDispatcher = UnconfinedTestDispatcher() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt index 49957f0b43cc..65e580cafcb5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt @@ -39,9 +39,7 @@ import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.shade.transition.largeScreenShadeInterpolator import com.android.systemui.statusbar.disableflags.domain.interactor.disableFlagsInteractor import com.android.systemui.statusbar.sysuiStatusBarStateController -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.qsFragmentComposeViewModelFactory by Kosmos.Fixture { object : QSFragmentComposeViewModel.Factory { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModelKosmos.kt index aa6ce9a433df..f8fa5db4ddf7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModelKosmos.kt @@ -23,6 +23,7 @@ import com.android.systemui.qs.panels.ui.viewmodel.editModeViewModel import com.android.systemui.qs.panels.ui.viewmodel.quickQuickSettingsViewModelFactory import com.android.systemui.qs.panels.ui.viewmodel.tileGridViewModel import com.android.systemui.qs.panels.ui.viewmodel.toolbar.toolbarViewModelFactory +import com.android.systemui.shade.ui.viewmodel.shadeHeaderViewModelFactory val Kosmos.quickSettingsContainerViewModelFactory by Kosmos.Fixture { @@ -33,6 +34,7 @@ val Kosmos.quickSettingsContainerViewModelFactory by return QuickSettingsContainerViewModel( brightnessSliderViewModelFactory, quickQuickSettingsViewModelFactory, + shadeHeaderViewModelFactory, supportsBrightnessMirroring, tileGridViewModel, editModeViewModel, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/resolver/SceneResolverKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/resolver/SceneResolverKosmos.kt index a4a63ec6ca21..9d18fbfccb36 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/resolver/SceneResolverKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/resolver/SceneResolverKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.scene.domain.resolver import com.android.compose.animation.scene.SceneKey @@ -25,7 +23,6 @@ import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.scene.shared.model.SceneFamilies -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.sceneFamilyResolvers: Map<SceneKey, SceneResolver> get() = mapOf(SceneFamilies.Home to homeSceneFamilyResolver) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/ScrimStartableKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/ScrimStartableKosmos.kt index b64c84075936..12b46536b2a2 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/ScrimStartableKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/ScrimStartableKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.scene.domain.startable import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor @@ -31,7 +29,6 @@ import com.android.systemui.settings.brightness.domain.interactor.brightnessMirr import com.android.systemui.statusbar.phone.dozeServiceHost import com.android.systemui.statusbar.phone.scrimController import com.android.systemui.statusbar.phone.statusBarKeyguardViewManager -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.scrimStartable by Fixture { ScrimStartable( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/StatusBarStartableKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/StatusBarStartableKosmos.kt index ee69c30fe6b9..881d110dff25 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/StatusBarStartableKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/startable/StatusBarStartableKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.scene.domain.startable import android.content.applicationContext @@ -33,7 +31,6 @@ import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.user.domain.interactor.selectedUserInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.statusBarStartable by Fixture { StatusBarStartable( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt index b9f0c9a70d3d..e2b2026550f1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.shade import com.android.systemui.assist.AssistManager @@ -39,7 +37,6 @@ import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.deviceProvisionedController import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import com.android.systemui.util.mockito.mock -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.shadeControllerSceneImpl by Kosmos.Fixture { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt index b3d89dbb834d..e143324baeae 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt @@ -25,7 +25,6 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.shade.data.repository.ShadeRepository -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.TestScope @@ -193,7 +192,6 @@ class ShadeTestUtilLegacyImpl( } /** Sets up shade state for tests when the scene container flag is enabled. */ -@OptIn(ExperimentalCoroutinesApi::class) class ShadeTestUtilSceneImpl( val testScope: TestScope, val sceneInteractor: SceneInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/PrivacyChipInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/PrivacyChipInteractorKosmos.kt index 7334286f00c4..b92ad9439936 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/PrivacyChipInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/PrivacyChipInteractorKosmos.kt @@ -21,6 +21,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.privacy.privacyDialogController import com.android.systemui.privacy.privacyDialogControllerV2 import com.android.systemui.shade.data.repository.fakePrivacyChipRepository +import com.android.systemui.shade.data.repository.shadeDialogContextInteractor import com.android.systemui.statusbar.policy.deviceProvisionedController var Kosmos.privacyChipInteractor: PrivacyChipInteractor by @@ -31,5 +32,6 @@ var Kosmos.privacyChipInteractor: PrivacyChipInteractor by privacyDialogController = privacyDialogController, privacyDialogControllerV2 = privacyDialogControllerV2, deviceProvisionedController = deviceProvisionedController, + shadeDialogContextInteractor = shadeDialogContextInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt index 923de2dcbf68..170d067b5c0c 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt @@ -18,12 +18,16 @@ package com.android.systemui.shade.domain.interactor import android.content.mockedContext import android.window.WindowContext +import com.android.systemui.common.ui.data.repository.configurationRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.shade.ShadeDisplayChangeLatencyTracker import com.android.systemui.shade.ShadeWindowLayoutParams import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository import com.android.systemui.shade.data.repository.shadeExpansionIntent +import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor +import com.android.systemui.statusbar.notification.row.notificationRebindingTracker +import com.android.systemui.statusbar.notification.stack.notificationStackRebindingHider import java.util.Optional import org.mockito.kotlin.any import org.mockito.kotlin.mock @@ -46,10 +50,14 @@ val Kosmos.shadeDisplaysInteractor by ShadeDisplaysInteractor( fakeShadeDisplaysRepository, mockedWindowContext, + configurationRepository, testScope.backgroundScope, testScope.backgroundScope.coroutineContext, mockedShadeDisplayChangeLatencyTracker, Optional.of(shadeExpandedStateInteractor), shadeExpansionIntent, + activeNotificationsInteractor, + notificationRebindingTracker, + Optional.of(notificationStackRebindingHider), ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelKosmos.kt index f5b856df8835..7eb9f3472482 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelKosmos.kt @@ -20,6 +20,7 @@ import android.content.applicationContext import com.android.systemui.broadcast.broadcastDispatcher import com.android.systemui.kosmos.Kosmos import com.android.systemui.plugins.activityStarter +import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.domain.interactor.privacyChipInteractor import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor @@ -31,6 +32,7 @@ val Kosmos.shadeHeaderViewModel: ShadeHeaderViewModel by ShadeHeaderViewModel( context = applicationContext, activityStarter = activityStarter, + sceneInteractor = sceneInteractor, shadeInteractor = shadeInteractor, mobileIconsInteractor = mobileIconsInteractor, mobileIconsViewModel = mobileIconsViewModel, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorKosmos.kt index 88bf9a5f2d5b..6593547f393d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorKosmos.kt @@ -27,9 +27,7 @@ import com.android.systemui.statusbar.notificationLockscreenUserManager import com.android.systemui.statusbar.policy.keyguardStateController import com.android.systemui.statusbar.policy.sensitiveNotificationProtectionController import com.android.systemui.user.domain.interactor.selectedUserInteractor -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) var Kosmos.sensitiveContentCoordinator: SensitiveContentCoordinator by Kosmos.Fixture { SensitiveContentCoordinatorImpl( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorKosmos.kt index 774782cc019c..dc7595f7f2e4 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.statusbar.notification.icon.domain.interactor import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor @@ -27,7 +25,6 @@ import com.android.systemui.statusbar.notification.data.repository.notifications import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor import com.android.systemui.statusbar.notification.domain.interactor.headsUpNotificationIconInteractor import com.android.wm.shell.bubbles.bubblesOptional -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.alwaysOnDisplayNotificationIconsInteractor by Fixture { AlwaysOnDisplayNotificationIconsInteractor( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt index 3fddd47c25f0..6246d986f9e5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt @@ -380,6 +380,7 @@ class ExpandableNotificationRowBuilder( mSmartReplyController, Mockito.mock(IStatusBarService::class.java, STUB_ONLY), Mockito.mock(UiEventLogger::class.java, STUB_ONLY), + Mockito.mock(NotificationRebindingTracker::class.java, STUB_ONLY), ) row.setAboveShelfChangedListener {} mBindStage.getStageParams(entry).requireContentViews(extraInflationFlags) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTrackerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTrackerKosmos.kt new file mode 100644 index 000000000000..deac37a55717 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRebindingTrackerKosmos.kt @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.row + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.testScope +import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor + +val Kosmos.notificationRebindingTracker by + Kosmos.Fixture { + NotificationRebindingTracker( + activeNotificationsInteractor = activeNotificationsInteractor, + bgScope = testScope.backgroundScope, + appScope = testScope.backgroundScope, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/AmbientStateKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/AmbientStateKosmos.kt index 65f4ec1c437c..d65a4a0532e3 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/AmbientStateKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/AmbientStateKosmos.kt @@ -23,9 +23,7 @@ import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.shade.transition.largeScreenShadeInterpolator import com.android.systemui.statusbar.notification.headsup.mockAvalancheController import com.android.systemui.statusbar.phone.statusBarKeyguardViewManager -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.ambientState by Fixture { AmbientState( /*context=*/ applicationContext, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerKosmos.kt index 569429f180df..73f296415a5a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerKosmos.kt @@ -21,3 +21,6 @@ import com.android.systemui.util.mockito.mock val Kosmos.notificationStackScrollLayoutController by Kosmos.Fixture { mock<NotificationStackScrollLayoutController>() } + +val Kosmos.notificationStackRebindingHider by + Kosmos.Fixture { mock<NotificationStackRebindingHider>() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt index b1e9d89dfd42..e250575ad3fc 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt @@ -14,8 +14,6 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.statusbar.notification.stack.domain.interactor import android.content.applicationContext @@ -25,7 +23,6 @@ import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.statusbar.policy.splitShadeStateController -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.sharedNotificationContainerInteractor by Kosmos.Fixture { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt index 8461da77796d..45c56ae0ab7a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt @@ -60,9 +60,7 @@ import com.android.systemui.statusbar.notification.stack.domain.interactor.notif import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor import com.android.systemui.unfold.domain.interactor.unfoldTransitionInteractor import com.android.systemui.window.ui.viewmodel.fakeBouncerTransitions -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.sharedNotificationContainerViewModel by Fixture { SharedNotificationContainerViewModel( interactor = sharedNotificationContainerInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/BiometricUnlockController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/BiometricUnlockController.kt index f377e28bb51a..c87a20e660a1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/BiometricUnlockController.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/BiometricUnlockController.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.statusbar.phone import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.util.mockito.mock -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.biometricUnlockController: BiometricUnlockController by Fixture { mock<BiometricUnlockController>() diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/DozeServiceHostKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/DozeServiceHostKosmos.kt index d0bf584d9a62..78140416cb40 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/DozeServiceHostKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/DozeServiceHostKosmos.kt @@ -31,9 +31,7 @@ import com.android.systemui.statusbar.notificationShadeWindowController import com.android.systemui.statusbar.policy.batteryController import com.android.systemui.statusbar.policy.deviceProvisionedController import com.android.systemui.statusbar.pulseExpansionHandler -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.dozeServiceHost: DozeServiceHost by Kosmos.Fixture { DozeServiceHost( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ManagedProfileControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ManagedProfileControllerKosmos.kt index ef04b9d907f1..7c8ad12ccf0d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ManagedProfileControllerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ManagedProfileControllerKosmos.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -@file:OptIn(ExperimentalCoroutinesApi::class) - package com.android.systemui.statusbar.phone import android.testing.LeakCheck import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.utils.leaks.FakeManagedProfileController -import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.fakeManagedProfileController by Fixture { FakeManagedProfileController(LeakCheck()) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerKosmos.kt index ddce4c896c14..4e15ea2d9377 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerKosmos.kt @@ -18,7 +18,5 @@ package com.android.systemui.statusbar.phone import com.android.systemui.kosmos.Kosmos import com.android.systemui.util.mockito.mock -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) var Kosmos.statusBarKeyguardViewManager by Kosmos.Fixture { mock<StatusBarKeyguardViewManager>() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterKosmos.kt index 7743a1c7e0cd..0d6ac4481742 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterKosmos.kt @@ -47,9 +47,7 @@ import com.android.systemui.statusbar.notificationShadeWindowController import com.android.systemui.statusbar.policy.keyguardStateController import com.android.systemui.wmshell.bubblesManager import java.util.Optional -import kotlinx.coroutines.ExperimentalCoroutinesApi -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.statusBarNotificationActivityStarter by Kosmos.Fixture { StatusBarNotificationActivityStarter( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/coroutines/MainDispatcherRule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/util/coroutines/MainDispatcherRule.kt index 577620347991..a0d9227cc048 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/coroutines/MainDispatcherRule.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/coroutines/MainDispatcherRule.kt @@ -17,7 +17,6 @@ package com.android.systemui.util.coroutines import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain @@ -28,7 +27,6 @@ import org.junit.runner.Description * Overrides main dispatcher to passed testDispatcher. You probably want to use it when using * viewModelScope which has hardcoded main dispatcher. */ -@OptIn(ExperimentalCoroutinesApi::class) class MainDispatcherRule(val testDispatcher: TestDispatcher) : TestWatcher() { override fun starting(description: Description) { Dispatchers.setMain(testDispatcher) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/time/FakeSystemClockKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/util/time/FakeSystemClockKosmos.kt index f3a8b14abab8..703d6ad83eac 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/time/FakeSystemClockKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/time/FakeSystemClockKosmos.kt @@ -20,10 +20,8 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.currentTime -@OptIn(ExperimentalCoroutinesApi::class) val Kosmos.systemClock by Kosmos.Fixture<SystemClock> { mock { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/mediaoutput/MediaOutputModuleKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/mediaoutput/MediaOutputModuleKosmos.kt index 0c814c566d63..556c34d85f8e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/mediaoutput/MediaOutputModuleKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/mediaoutput/MediaOutputModuleKosmos.kt @@ -16,13 +16,16 @@ package com.android.systemui.volume.panel.component.mediaoutput +import android.content.applicationContext import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.testScope +import com.android.systemui.volume.panel.component.mediaoutput.domain.MediaOutputAvailabilityCriteria import com.android.systemui.volume.panel.component.mediaoutput.ui.composable.MediaOutputComponent import com.android.systemui.volume.panel.component.mediaoutput.ui.viewmodel.mediaOutputViewModel -import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria -import com.android.systemui.volume.panel.domain.availableCriteria var Kosmos.mediaOutputComponent: MediaOutputComponent by Kosmos.Fixture { MediaOutputComponent(mediaOutputViewModel) } -var Kosmos.mediaOutputAvailabilityCriteria: ComponentAvailabilityCriteria by - Kosmos.Fixture { availableCriteria } +var Kosmos.mediaOutputAvailabilityCriteria by + Kosmos.Fixture { + MediaOutputAvailabilityCriteria(applicationContext, testScope.backgroundScope) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractorKosmos.kt index ad30ea26c5b8..151f3d45b906 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractorKosmos.kt @@ -17,7 +17,9 @@ package com.android.systemui.window.domain.interactor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor +import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.window.data.repository.windowRootViewBlurRepository val Kosmos.windowRootViewBlurInteractor by @@ -25,5 +27,7 @@ val Kosmos.windowRootViewBlurInteractor by WindowRootViewBlurInteractor( repository = windowRootViewBlurRepository, keyguardInteractor = keyguardInteractor, + keyguardTransitionInteractor = keyguardTransitionInteractor, + applicationScope = applicationCoroutineScope, ) } diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig index 7f0bf0375b4a..722255404dd1 100644 --- a/services/accessibility/accessibility.aconfig +++ b/services/accessibility/accessibility.aconfig @@ -145,6 +145,16 @@ flag { } flag { + name: "event_dispatcher_raw_event" + namespace: "accessibility" + description: "Fixes EventDispatcher#sendMotionEvent callers to properly provide raw event" + bug: "385812366" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "fix_drag_pointer_when_ending_drag" namespace: "accessibility" description: "Send the correct pointer id when transitioning from dragging to delegating states." diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/EventDispatcher.java b/services/accessibility/java/com/android/server/accessibility/gestures/EventDispatcher.java index bf9202f1b266..5c0bbf4e01eb 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/EventDispatcher.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/EventDispatcher.java @@ -31,6 +31,7 @@ import android.view.accessibility.AccessibilityManager; import com.android.server.accessibility.AccessibilityManagerService; import com.android.server.accessibility.EventStreamTransformation; +import com.android.server.accessibility.Flags; import com.android.server.policy.WindowManagerPolicy; /** @@ -297,7 +298,8 @@ class EventDispatcher { sendMotionEvent( prototype, action, - mState.getLastReceivedEvent(), + Flags.eventDispatcherRawEvent() ? mState.getLastReceivedRawEvent() : + mState.getLastReceivedEvent(), pointerIdBits, policyFlags); } @@ -327,7 +329,8 @@ class EventDispatcher { sendMotionEvent( event, action, - mState.getLastReceivedEvent(), + Flags.eventDispatcherRawEvent() ? mState.getLastReceivedRawEvent() : + mState.getLastReceivedEvent(), pointerIdBits, policyFlags); } @@ -394,8 +397,10 @@ class EventDispatcher { continue; } final int action = computeInjectionAction(MotionEvent.ACTION_POINTER_UP, i); - sendMotionEvent( - prototype, action, mState.getLastReceivedEvent(), pointerIdBits, policyFlags); + sendMotionEvent(prototype, action, + Flags.eventDispatcherRawEvent() ? mState.getLastReceivedRawEvent() : + mState.getLastReceivedEvent(), + pointerIdBits, policyFlags); pointerIdBits &= ~(1 << pointerId); } } diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java index 2c106d31ae59..fd230f69aec0 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java @@ -497,13 +497,14 @@ public class TouchExplorer extends BaseEventStreamTransformation // We have just decided that the user is touch, // exploring so start sending events. - mSendHoverEnterAndMoveDelayed.addEvent(event, mState.getLastReceivedEvent()); + mSendHoverEnterAndMoveDelayed.addEvent(event, + Flags.eventDispatcherRawEvent() ? rawEvent : mState.getLastReceivedEvent()); mSendHoverEnterAndMoveDelayed.forceSendAndRemove(); mSendHoverExitDelayed.cancel(); mDispatcher.sendMotionEvent( event, ACTION_HOVER_MOVE, - event, + Flags.eventDispatcherRawEvent() ? rawEvent : event, pointerIdBits, policyFlags); return true; @@ -1099,7 +1100,8 @@ public class TouchExplorer extends BaseEventStreamTransformation * * @param policyFlags The policy flags associated with the event. */ - private void sendHoverExitAndTouchExplorationGestureEndIfNeeded(int policyFlags) { + @VisibleForTesting + void sendHoverExitAndTouchExplorationGestureEndIfNeeded(int policyFlags) { MotionEvent event = mState.getLastInjectedHoverEvent(); if (event != null && event.getActionMasked() != ACTION_HOVER_EXIT) { final int pointerIdBits = event.getPointerIdBits(); @@ -1109,7 +1111,8 @@ public class TouchExplorer extends BaseEventStreamTransformation mDispatcher.sendMotionEvent( event, ACTION_HOVER_EXIT, - mState.getLastReceivedEvent(), + Flags.eventDispatcherRawEvent() ? mState.getLastReceivedRawEvent() : + mState.getLastReceivedEvent(), pointerIdBits, policyFlags); } @@ -1131,7 +1134,8 @@ public class TouchExplorer extends BaseEventStreamTransformation mDispatcher.sendMotionEvent( event, ACTION_HOVER_ENTER, - mState.getLastReceivedEvent(), + Flags.eventDispatcherRawEvent() ? mState.getLastReceivedRawEvent() : + mState.getLastReceivedEvent(), pointerIdBits, policyFlags); } diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index 11710c9d8a9b..b39b5b1a7660 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -73,6 +73,7 @@ import android.util.LocalLog; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; +import android.view.autofill.AutofillFeatureFlags; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillManager.AutofillCommitReason; @@ -672,7 +673,7 @@ final class AutofillManagerServiceImpl flags, mInputMethodManagerInternal, isPrimaryCredential); mSessions.put(newSession.id, newSession); - if (Flags.multipleFillHistory() && !forAugmentedAutofillOnly) { + if (AutofillFeatureFlags.isMultipleFillEventHistoryEnabled() && !forAugmentedAutofillOnly) { mFillHistories.put(newSession.id, new FillEventHistory(sessionId, null)); } @@ -772,7 +773,8 @@ final class AutofillManagerServiceImpl FillEventHistory history = null; - if (Flags.multipleFillHistory() && mFillHistories != null) { + if (AutofillFeatureFlags.isMultipleFillEventHistoryEnabled() + && mFillHistories != null) { history = mFillHistories.get(sessionId); mFillHistories.delete(sessionId); } @@ -922,7 +924,7 @@ final class AutofillManagerServiceImpl } } mSessions.clear(); - if (Flags.multipleFillHistory()) { + if (AutofillFeatureFlags.isMultipleFillEventHistoryEnabled()) { mFillHistories.clear(); } @@ -991,7 +993,7 @@ final class AutofillManagerServiceImpl mEventHistory.addEvent(event); } - if (Flags.multipleFillHistory()) { + if (AutofillFeatureFlags.isMultipleFillEventHistoryEnabled()) { FillEventHistory history = mFillHistories.get(sessionId); if (history != null) { history.addEvent(event); @@ -1180,7 +1182,7 @@ final class AutofillManagerServiceImpl logViewEnteredForHistory(sessionId, clientState, mEventHistory, focusedId); } - if (Flags.multipleFillHistory()) { + if (AutofillFeatureFlags.isMultipleFillEventHistoryEnabled()) { FillEventHistory history = mFillHistories.get(sessionId); if (history != null) { logViewEnteredForHistory(sessionId, clientState, history, focusedId); diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 3ecff3b3ebae..6fdb2b6b83f7 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -442,6 +442,9 @@ final class Session private Bundle mClientState; @GuardedBy("mLock") + private Bundle mClientStateForSecondary; + + @GuardedBy("mLock") boolean mDestroyed; /** @@ -980,13 +983,19 @@ final class Session mergePreviousSessionLocked(/* forSave= */ false); final List<String> hints = getTypeHintsForProvider(); + Bundle sendBackClientState = mClientState; + if (Flags.multipleFillHistory() + && mRequestId.isSecondaryProvider(requestId)) { + sendBackClientState = mClientStateForSecondary; + } + mDelayedFillPendingIntent = createPendingIntent(requestId); request = new FillRequest( requestId, contexts, hints, - mClientState, + sendBackClientState, flags, /* inlineSuggestionsRequest= */ null, /* delayedFillIntentSender= */ mDelayedFillPendingIntent == null @@ -3317,7 +3326,7 @@ final class Session AUTHENTICATION_RESULT_SUCCESS); if (newClientState != null) { if (sDebug) Slog.d(TAG, "Updating client state from auth dataset"); - mClientState = newClientState; + setClientState(newClientState, requestId); } Dataset datasetFromResult = getEffectiveDatasetForAuthentication((Dataset) result); final Dataset oldDataset = authenticatedResponse.getDatasets().get(datasetIdx); @@ -6700,6 +6709,18 @@ final class Session } @GuardedBy("mLock") + private void setClientState(@Nullable Bundle newClientState, int requestId) { + if (Flags.multipleFillHistory() + && mRequestId.isSecondaryProvider(requestId)) { + // Set the secondary clientstate + mClientStateForSecondary = newClientState; + } else { + // The old way - only set the primary provider clientstate + mClientState = newClientState; + } + } + + @GuardedBy("mLock") private void processResponseLocked( @NonNull FillResponse newResponse, @Nullable Bundle newClientState, int flags) { // Make sure we are hiding the UI which will be shown @@ -6734,7 +6755,9 @@ final class Session mResponses = new SparseArray<>(2); } mResponses.put(requestId, newResponse); - mClientState = newClientState != null ? newClientState : newResponse.getClientState(); + + setClientState(newClientState != null ? newClientState : newResponse.getClientState(), + requestId); boolean webviewRequestedCredman = newClientState != null diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java index a54a66312b1d..5184a2c4ec30 100644 --- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java @@ -111,6 +111,7 @@ public class SettingsToPropertiesMapper { DeviceConfig.NAMESPACE_LMKD_NATIVE, DeviceConfig.NAMESPACE_MEDIA_NATIVE, DeviceConfig.NAMESPACE_MGLRU_NATIVE, + DeviceConfig.NAMESPACE_MMD_NATIVE, DeviceConfig.NAMESPACE_NETD_NATIVE, DeviceConfig.NAMESPACE_NNAPI_NATIVE, DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT, diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 12b666fc458a..709c13bc9704 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -68,6 +68,7 @@ import static com.android.media.audio.Flags.alarmMinVolumeZero; import static com.android.media.audio.Flags.asDeviceConnectionFailure; import static com.android.media.audio.Flags.audioserverPermissions; import static com.android.media.audio.Flags.disablePrescaleAbsoluteVolume; +import static com.android.media.audio.Flags.deferWearPermissionUpdates; import static com.android.media.audio.Flags.equalScoLeaVcIndexRange; import static com.android.media.audio.Flags.replaceStreamBtSco; import static com.android.media.audio.Flags.ringMyCar; @@ -514,6 +515,15 @@ public class AudioService extends IAudioService.Stub // check playback or record activity every 6 seconds for UIDs owning mode IN_COMMUNICATION private static final int CHECK_MODE_FOR_UID_PERIOD_MS = 6000; + // Roughly chosen to be long enough to suppress the autocork behavior of the permission + // cache (50ms), while not introducing visible permission leaks - since the app needs to + // restart, and trigger an action which requires permissions from audioserver before this + // delay. For RECORD_AUDIO, we are additionally protected by appops. + private static final int SCHEDULED_PERMISSION_UPDATE_DELAY_MS = 60; + + // Increased delay to not interefere with low core app launch latency + private static final int SCHEDULED_PERMISSION_UPDATE_LONG_DELAY_MS = 500; + /** @see AudioSystemThread */ private AudioSystemThread mAudioSystemThread; /** @see AudioHandler */ @@ -10975,12 +10985,7 @@ public class AudioService extends IAudioService.Stub } /* Listen to permission invalidations for the PermissionProvider */ - private void setupPermissionListener() { - // Roughly chosen to be long enough to suppress the autocork behavior of the permission - // cache (50ms), while not introducing visible permission leaks - since the app needs to - // restart, and trigger an action which requires permissions from audioserver before this - // delay. For RECORD_AUDIO, we are additionally protected by appops. - final long UPDATE_DELAY_MS = 60; + private void setupPermissionListener() { // instanceof to simplify the construction requirements of AudioService for testing: no // delayed execution during unit tests. if (mAudioServerLifecycleExecutor instanceof ScheduledExecutorService exec) { @@ -11022,7 +11027,7 @@ public class AudioService extends IAudioService.Stub Thread.getDefaultUncaughtExceptionHandler() .uncaughtException(Thread.currentThread(), e); } - }, UPDATE_DELAY_MS, TimeUnit.MILLISECONDS)); + }, getAudioPermissionsDelay(), TimeUnit.MILLISECONDS)); } }; mSysPropListenerNativeHandle = mAudioSystem.listenForSystemPropertyChange( @@ -13029,10 +13034,10 @@ public class AudioService extends IAudioService.Stub int uid = intent.getIntExtra(Intent.EXTRA_UID, Process.INVALID_UID); if (intent.getBooleanExtra(EXTRA_REPLACING, false) || intent.getBooleanExtra(EXTRA_ARCHIVAL, false)) return; - if (action.equals(ACTION_PACKAGE_ADDED)) { + if (ACTION_PACKAGE_ADDED.equals(action)) { audioserverExecutor.execute(() -> provider.onModifyPackageState(uid, pkgName, false /* isRemoved */)); - } else if (action.equals(ACTION_PACKAGE_REMOVED)) { + } else if (ACTION_PACKAGE_REMOVED.equals(action)) { audioserverExecutor.execute(() -> provider.onModifyPackageState(uid, pkgName, true /* isRemoved */)); } @@ -15513,6 +15518,18 @@ public class AudioService extends IAudioService.Stub } } + private long getAudioPermissionsDelay() { + return isAudioPermissionUpdatesAddtionallyDelayed() + ? SCHEDULED_PERMISSION_UPDATE_LONG_DELAY_MS + : SCHEDULED_PERMISSION_UPDATE_DELAY_MS; + } + + private boolean isAudioPermissionUpdatesAddtionallyDelayed() { + // Additional delays on low core devices in order to optimize app launch latencies + return deferWearPermissionUpdates() + && mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH); + } + //==================== // Helper functions for app ops //==================== diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 3598b9b2e879..9427c270c57f 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -37,10 +37,12 @@ import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_CAN_S import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP; +import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_FOCUS; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SECURE; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS; +import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_STEAL_TOP_FOCUS_DISABLED; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED; import static android.hardware.display.DisplayManagerGlobal.DisplayEvent; import static android.hardware.display.DisplayViewport.VIEWPORT_EXTERNAL; @@ -1800,7 +1802,11 @@ public final class DisplayManagerService extends SystemService { } if ((flags & VIRTUAL_DISPLAY_FLAG_PUBLIC) != 0) { - flags |= VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; + if ((flags & VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY) == 0) { + Slog.d(TAG, "Public virtual displays are auto mirror by default, hence adding " + + "VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR."); + flags |= VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; + } // Public displays can't be allowed to show content when locked. if ((flags & VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD) != 0) { @@ -1808,10 +1814,16 @@ public final class DisplayManagerService extends SystemService { "Public display must not be marked as SHOW_WHEN_LOCKED_INSECURE"); } } - if ((flags & VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY) != 0) { + if ((flags & VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY) != 0 + && (flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) != 0) { + Slog.d(TAG, "Own content displays cannot auto mirror other displays, hence ignoring " + + "VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR."); flags &= ~VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; } - if ((flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) != 0) { + if ((flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) != 0 + && (flags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) != 0) { + Slog.d(TAG, "Auto mirror displays must be in the default display group, hence ignoring " + + "VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP."); flags &= ~VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP; } // Put the display in the virtual device's display group only if it's not a mirror display, @@ -1821,6 +1833,8 @@ public final class DisplayManagerService extends SystemService { && (flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) == 0 && (flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) == VIRTUAL_DISPLAY_FLAG_TRUSTED && virtualDevice != null) { + Slog.d(TAG, "Own content displays owned by virtual devices are put in that device's " + + "display group, hence adding VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP."); flags |= VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP; } @@ -1852,8 +1866,7 @@ public final class DisplayManagerService extends SystemService { Binder.restoreCallingIdentity(firstToken); } - if (callingUid != Process.SYSTEM_UID - && (flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) != 0) { + if (callingUid != Process.SYSTEM_UID && (flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) != 0) { // Only a valid media projection or a virtual device can create a mirror virtual // display. if (!canProjectVideo(projection) && !canCreateMirrorDisplays(virtualDevice) @@ -1901,6 +1914,14 @@ public final class DisplayManagerService extends SystemService { } } + if ((flags & VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED) != 0 + && (flags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) == 0 + && (flags & VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP) == 0) { + Slog.d(TAG, "Always unlocked displays cannot be in the default display group, hence " + + "ignoring flag VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED."); + flags &= ~VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED; + } + if ((flags & VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED) != 0) { if (callingUid != Process.SYSTEM_UID && !checkCallingPermission(ADD_ALWAYS_UNLOCKED_DISPLAY, @@ -1911,7 +1932,24 @@ public final class DisplayManagerService extends SystemService { } } - if ((flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) == 0) { + if ((flags & VIRTUAL_DISPLAY_FLAG_OWN_FOCUS) != 0 + && (flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) == 0) { + Slog.d(TAG, "Untrusted displays cannot have own focus, hence ignoring flag " + + "VIRTUAL_DISPLAY_FLAG_OWN_FOCUS."); + flags &= ~VIRTUAL_DISPLAY_FLAG_OWN_FOCUS; + } + + if ((flags & VIRTUAL_DISPLAY_FLAG_STEAL_TOP_FOCUS_DISABLED) != 0 + && (flags & VIRTUAL_DISPLAY_FLAG_OWN_FOCUS) == 0) { + Slog.d(TAG, "Virtual displays that cannot steal top focus must have their own " + + " focus, hence ignoring flag VIRTUAL_DISPLAY_FLAG_STEAL_TOP_FOCUS_DISABLED."); + flags &= ~VIRTUAL_DISPLAY_FLAG_STEAL_TOP_FOCUS_DISABLED; + } + + if ((flags & VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS) != 0 + && (flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) == 0) { + Slog.d(TAG, "Untrusted displays cannot show system decorations, hence ignoring flag " + + "VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS."); flags &= ~VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS; } @@ -4157,7 +4195,8 @@ public final class DisplayManagerService extends SystemService { public boolean shouldReceiveRefreshRateWithChangeUpdate(int event) { if (mFlags.isRefreshRateEventForForegroundAppsEnabled() - && event == DisplayManagerGlobal.EVENT_DISPLAY_REFRESH_RATE_CHANGED) { + && event == DisplayManagerGlobal.EVENT_DISPLAY_REFRESH_RATE_CHANGED + && mActivityManagerInternal != null) { int procState = mActivityManagerInternal.getUidProcessState(mUid); int importance = ActivityManager.RunningAppProcessInfo .procStateToImportance(procState); diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java index 558afd1da380..abbdeb9da364 100644 --- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java +++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java @@ -33,13 +33,6 @@ import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SUPPO import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TOUCH_FEEDBACK_DISABLED; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED; -import static com.android.server.display.DisplayDeviceInfo.FLAG_ALWAYS_UNLOCKED; -import static com.android.server.display.DisplayDeviceInfo.FLAG_DEVICE_DISPLAY_GROUP; -import static com.android.server.display.DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP; -import static com.android.server.display.DisplayDeviceInfo.FLAG_STEAL_TOP_FOCUS_DISABLED; -import static com.android.server.display.DisplayDeviceInfo.FLAG_TOUCH_FEEDBACK_DISABLED; -import static com.android.server.display.DisplayDeviceInfo.FLAG_TRUSTED; - import android.annotation.Nullable; import android.content.Context; import android.graphics.Point; @@ -574,15 +567,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter { mInfo.flags &= ~DisplayDeviceInfo.FLAG_NEVER_BLANK; } else { mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY; - - if ((mFlags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) != 0) { - mInfo.flags |= FLAG_OWN_DISPLAY_GROUP; - } + } + if ((mFlags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) != 0) { + mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP; } if ((mFlags & VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP) != 0) { - mInfo.flags |= FLAG_DEVICE_DISPLAY_GROUP; + mInfo.flags |= DisplayDeviceInfo.FLAG_DEVICE_DISPLAY_GROUP; } - if ((mFlags & VIRTUAL_DISPLAY_FLAG_SECURE) != 0) { mInfo.flags |= DisplayDeviceInfo.FLAG_SECURE; } @@ -611,41 +602,19 @@ public class VirtualDisplayAdapter extends DisplayAdapter { mInfo.flags |= DisplayDeviceInfo.FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS; } if ((mFlags & VIRTUAL_DISPLAY_FLAG_TRUSTED) != 0) { - mInfo.flags |= FLAG_TRUSTED; + mInfo.flags |= DisplayDeviceInfo.FLAG_TRUSTED; } if ((mFlags & VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED) != 0) { - if ((mInfo.flags & DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP) != 0 - || (mFlags & VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP) != 0) { - mInfo.flags |= FLAG_ALWAYS_UNLOCKED; - } else { - Slog.w( - TAG, - "Ignoring VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED as it requires" - + " VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP or" - + " VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP."); - } + mInfo.flags |= DisplayDeviceInfo.FLAG_ALWAYS_UNLOCKED; } if ((mFlags & VIRTUAL_DISPLAY_FLAG_TOUCH_FEEDBACK_DISABLED) != 0) { - mInfo.flags |= FLAG_TOUCH_FEEDBACK_DISABLED; + mInfo.flags |= DisplayDeviceInfo.FLAG_TOUCH_FEEDBACK_DISABLED; } if ((mFlags & VIRTUAL_DISPLAY_FLAG_OWN_FOCUS) != 0) { - if ((mFlags & VIRTUAL_DISPLAY_FLAG_TRUSTED) != 0) { - mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_FOCUS; - } else { - Slog.w(TAG, "Ignoring VIRTUAL_DISPLAY_FLAG_OWN_FOCUS as it requires " - + "VIRTUAL_DISPLAY_FLAG_TRUSTED."); - } + mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_FOCUS; } if ((mFlags & VIRTUAL_DISPLAY_FLAG_STEAL_TOP_FOCUS_DISABLED) != 0) { - if ((mFlags & VIRTUAL_DISPLAY_FLAG_TRUSTED) != 0 - && (mFlags & VIRTUAL_DISPLAY_FLAG_OWN_FOCUS) != 0) { - mInfo.flags |= FLAG_STEAL_TOP_FOCUS_DISABLED; - } else { - Slog.w(TAG, - "Ignoring VIRTUAL_DISPLAY_FLAG_STEAL_TOP_FOCUS_DISABLED as it " - + "requires VIRTUAL_DISPLAY_FLAG_OWN_FOCUS which requires " - + "VIRTUAL_DISPLAY_FLAG_TRUSTED."); - } + mInfo.flags |= DisplayDeviceInfo.FLAG_STEAL_TOP_FOCUS_DISABLED; } mInfo.type = Display.TYPE_VIRTUAL; diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index bd8b67b9d626..c0dbfa546a94 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -1721,6 +1721,8 @@ public class HdmiControlService extends SystemService { if (result != SendMessageResult.SUCCESS) { localDevice.addAndStartAction(new ResendCecCommandAction(localDevice, command, callback)); + } else if (callback != null) { + callback.onSendCompleted(result); } } }); diff --git a/services/core/java/com/android/server/media/AudioManagerRouteController.java b/services/core/java/com/android/server/media/AudioManagerRouteController.java index 2686f2b30d27..280d051be239 100644 --- a/services/core/java/com/android/server/media/AudioManagerRouteController.java +++ b/services/core/java/com/android/server/media/AudioManagerRouteController.java @@ -51,6 +51,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; /** * Maintains a list of all available routes and supports transfers to any of them. @@ -90,7 +91,11 @@ import java.util.Objects; @NonNull private final Context mContext; @NonNull private final AudioManager mAudioManager; @NonNull private final Handler mHandler; - @NonNull private final OnDeviceRouteChangedListener mOnDeviceRouteChangedListener; + + @NonNull + private final CopyOnWriteArrayList<OnDeviceRouteChangedListener> + mOnDeviceRouteChangedListeners = new CopyOnWriteArrayList<>(); + @NonNull private final BluetoothDeviceRoutesManager mBluetoothRouteController; @NonNull private final AudioProductStrategy mStrategyForMedia; @@ -131,7 +136,7 @@ import java.util.Objects; mAudioManager = Objects.requireNonNull(audioManager); mHandler = new Handler(Objects.requireNonNull(looper)); mStrategyForMedia = Objects.requireNonNull(strategyForMedia); - mOnDeviceRouteChangedListener = Objects.requireNonNull(onDeviceRouteChangedListener); + mOnDeviceRouteChangedListeners.add(Objects.requireNonNull(onDeviceRouteChangedListener)); mBuiltInSpeakerSuitabilityStatus = DeviceRouteController.getBuiltInSpeakerSuitabilityStatus(mContext); @@ -144,6 +149,11 @@ import java.util.Objects; rebuildAvailableRoutes(); } + public void registerRouteChangeListener( + @NonNull OnDeviceRouteChangedListener onDeviceRouteChangedListener) { + mOnDeviceRouteChangedListeners.add(onDeviceRouteChangedListener); + } + @RequiresPermission( anyOf = { Manifest.permission.MODIFY_AUDIO_ROUTING, @@ -281,7 +291,9 @@ import java.util.Objects; }) private void rebuildAvailableRoutesAndNotify() { rebuildAvailableRoutes(); - mOnDeviceRouteChangedListener.onDeviceRouteChanged(); + for (OnDeviceRouteChangedListener listener : mOnDeviceRouteChangedListeners) { + listener.onDeviceRouteChanged(); + } } @RequiresPermission( diff --git a/services/core/java/com/android/server/media/quality/MediaQualityService.java b/services/core/java/com/android/server/media/quality/MediaQualityService.java index 6ad7ea7b768f..2a5b779546d5 100644 --- a/services/core/java/com/android/server/media/quality/MediaQualityService.java +++ b/services/core/java/com/android/server/media/quality/MediaQualityService.java @@ -72,6 +72,8 @@ import org.json.JSONException; import org.json.JSONObject; import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -1067,35 +1069,37 @@ public class MediaQualityService extends SystemService { } } - enum Mode { - ADD, - UPDATE, - REMOVE, - ERROR + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + private @interface ProfileModes { + int ADD = 1; + int UPDATE = 2; + int REMOVE = 3; + int ERROR = 4; } private void notifyOnPictureProfileAdded(String profileId, PictureProfile profile, int uid, int pid) { - notifyPictureProfileHelper(Mode.ADD, profileId, profile, null, uid, pid); + notifyPictureProfileHelper(ProfileModes.ADD, profileId, profile, null, uid, pid); } private void notifyOnPictureProfileUpdated(String profileId, PictureProfile profile, int uid, int pid) { - notifyPictureProfileHelper(Mode.UPDATE, profileId, profile, null, uid, pid); + notifyPictureProfileHelper(ProfileModes.UPDATE, profileId, profile, null, uid, pid); } private void notifyOnPictureProfileRemoved(String profileId, PictureProfile profile, int uid, int pid) { - notifyPictureProfileHelper(Mode.REMOVE, profileId, profile, null, uid, pid); + notifyPictureProfileHelper(ProfileModes.REMOVE, profileId, profile, null, uid, pid); } private void notifyOnPictureProfileError(String profileId, int errorCode, int uid, int pid) { - notifyPictureProfileHelper(Mode.ERROR, profileId, null, errorCode, uid, pid); + notifyPictureProfileHelper(ProfileModes.ERROR, profileId, null, errorCode, uid, pid); } - private void notifyPictureProfileHelper(Mode mode, String profileId, PictureProfile profile, - Integer errorCode, int uid, int pid) { + private void notifyPictureProfileHelper(int mode, String profileId, + PictureProfile profile, Integer errorCode, int uid, int pid) { UserState userState = getOrCreateUserStateLocked(UserHandle.USER_SYSTEM); int n = userState.mPictureProfileCallbacks.beginBroadcast(); @@ -1107,28 +1111,28 @@ public class MediaQualityService extends SystemService { .get(callback); if (pidUid.first == pid && pidUid.second == uid) { - if (mode == Mode.ADD) { + if (mode == ProfileModes.ADD) { userState.mPictureProfileCallbacks.getBroadcastItem(i) .onPictureProfileAdded(profileId, profile); - } else if (mode == Mode.UPDATE) { + } else if (mode == ProfileModes.UPDATE) { userState.mPictureProfileCallbacks.getBroadcastItem(i) .onPictureProfileUpdated(profileId, profile); - } else if (mode == Mode.REMOVE) { + } else if (mode == ProfileModes.REMOVE) { userState.mPictureProfileCallbacks.getBroadcastItem(i) .onPictureProfileRemoved(profileId, profile); - } else if (mode == Mode.ERROR) { + } else if (mode == ProfileModes.ERROR) { userState.mPictureProfileCallbacks.getBroadcastItem(i) .onError(profileId, errorCode); } } } catch (RemoteException e) { - if (mode == Mode.ADD) { + if (mode == ProfileModes.ADD) { Slog.e(TAG, "Failed to report added picture profile to callback", e); - } else if (mode == Mode.UPDATE) { + } else if (mode == ProfileModes.UPDATE) { Slog.e(TAG, "Failed to report updated picture profile to callback", e); - } else if (mode == Mode.REMOVE) { + } else if (mode == ProfileModes.REMOVE) { Slog.e(TAG, "Failed to report removed picture profile to callback", e); - } else if (mode == Mode.ERROR) { + } else if (mode == ProfileModes.ERROR) { Slog.e(TAG, "Failed to report picture profile error to callback", e); } } @@ -1138,25 +1142,25 @@ public class MediaQualityService extends SystemService { private void notifyOnSoundProfileAdded(String profileId, SoundProfile profile, int uid, int pid) { - notifySoundProfileHelper(Mode.ADD, profileId, profile, null, uid, pid); + notifySoundProfileHelper(ProfileModes.ADD, profileId, profile, null, uid, pid); } private void notifyOnSoundProfileUpdated(String profileId, SoundProfile profile, int uid, int pid) { - notifySoundProfileHelper(Mode.UPDATE, profileId, profile, null, uid, pid); + notifySoundProfileHelper(ProfileModes.UPDATE, profileId, profile, null, uid, pid); } private void notifyOnSoundProfileRemoved(String profileId, SoundProfile profile, int uid, int pid) { - notifySoundProfileHelper(Mode.REMOVE, profileId, profile, null, uid, pid); + notifySoundProfileHelper(ProfileModes.REMOVE, profileId, profile, null, uid, pid); } private void notifyOnSoundProfileError(String profileId, int errorCode, int uid, int pid) { - notifySoundProfileHelper(Mode.ERROR, profileId, null, errorCode, uid, pid); + notifySoundProfileHelper(ProfileModes.ERROR, profileId, null, errorCode, uid, pid); } - private void notifySoundProfileHelper(Mode mode, String profileId, SoundProfile profile, - Integer errorCode, int uid, int pid) { + private void notifySoundProfileHelper(int mode, String profileId, + SoundProfile profile, Integer errorCode, int uid, int pid) { UserState userState = getOrCreateUserStateLocked(UserHandle.USER_SYSTEM); int n = userState.mSoundProfileCallbacks.beginBroadcast(); @@ -1168,28 +1172,28 @@ public class MediaQualityService extends SystemService { .get(callback); if (pidUid.first == pid && pidUid.second == uid) { - if (mode == Mode.ADD) { + if (mode == ProfileModes.ADD) { userState.mSoundProfileCallbacks.getBroadcastItem(i) .onSoundProfileAdded(profileId, profile); - } else if (mode == Mode.UPDATE) { + } else if (mode == ProfileModes.UPDATE) { userState.mSoundProfileCallbacks.getBroadcastItem(i) .onSoundProfileUpdated(profileId, profile); - } else if (mode == Mode.REMOVE) { + } else if (mode == ProfileModes.REMOVE) { userState.mSoundProfileCallbacks.getBroadcastItem(i) .onSoundProfileRemoved(profileId, profile); - } else if (mode == Mode.ERROR) { + } else if (mode == ProfileModes.ERROR) { userState.mSoundProfileCallbacks.getBroadcastItem(i) .onError(profileId, errorCode); } } } catch (RemoteException e) { - if (mode == Mode.ADD) { + if (mode == ProfileModes.ADD) { Slog.e(TAG, "Failed to report added sound profile to callback", e); - } else if (mode == Mode.UPDATE) { + } else if (mode == ProfileModes.UPDATE) { Slog.e(TAG, "Failed to report updated sound profile to callback", e); - } else if (mode == Mode.REMOVE) { + } else if (mode == ProfileModes.REMOVE) { Slog.e(TAG, "Failed to report removed sound profile to callback", e); - } else if (mode == Mode.ERROR) { + } else if (mode == ProfileModes.ERROR) { Slog.e(TAG, "Failed to report sound profile error to callback", e); } } diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index 6303ecd53dbb..8710438d76b3 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -1064,10 +1064,12 @@ public final class OverlayManagerService extends SystemService { return; } try { - dumpState.setUserId(Integer.parseInt(args[opti])); + final int userId = UserHandle.parseUserArg(args[opti]); + final int realUserId = handleIncomingUser(userId, "dump"); + dumpState.setUserId(realUserId); opti++; - } catch (NumberFormatException e) { - pw.println("Error: user argument is not a number: " + args[opti]); + } catch (Exception e) { + pw.println("Error: " + e.getMessage()); return; } } else if ("--verbose".equals(opt)) { diff --git a/services/core/java/com/android/server/security/FileIntegrityService.java b/services/core/java/com/android/server/security/FileIntegrityService.java index 587be0746149..bfd86d724583 100644 --- a/services/core/java/com/android/server/security/FileIntegrityService.java +++ b/services/core/java/com/android/server/security/FileIntegrityService.java @@ -17,47 +17,24 @@ package com.android.server.security; import android.annotation.EnforcePermission; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Binder; -import android.os.Build; -import android.os.Environment; import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.PermissionEnforcer; import android.os.RemoteException; -import android.os.ResultReceiver; -import android.os.ShellCallback; -import android.os.ShellCommand; import android.os.UserHandle; import android.os.storage.StorageManagerInternal; import android.security.IFileIntegrityService; -import android.util.Slog; -import com.android.internal.annotations.GuardedBy; import com.android.internal.security.VerityUtils; import com.android.server.LocalServices; import com.android.server.SystemService; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileDescriptor; import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.cert.Certificate; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.util.ArrayList; import java.util.Objects; /** @@ -67,15 +44,6 @@ import java.util.Objects; public class FileIntegrityService extends SystemService { private static final String TAG = "FileIntegrityService"; - /** The maximum size of signature file. This is just to avoid potential abuse. */ - private static final int MAX_SIGNATURE_FILE_SIZE_BYTES = 8192; - - private static CertificateFactory sCertFactory; - - @GuardedBy("mTrustedCertificates") - private final ArrayList<X509Certificate> mTrustedCertificates = - new ArrayList<X509Certificate>(); - /** Gets the instance of the service */ public static FileIntegrityService getService() { return LocalServices.getService(FileIntegrityService.class); @@ -91,43 +59,6 @@ public class FileIntegrityService extends SystemService { return VerityUtils.isFsVeritySupported(); } - @Override - public boolean isAppSourceCertificateTrusted(@Nullable byte[] certificateBytes, - @NonNull String packageName) { - checkCallerPermission(packageName); - - if (android.security.Flags.deprecateFsvSig()) { - // When deprecated, stop telling the caller that any app source certificate is - // trusted on the current device. This behavior is also consistent with devices - // without this feature support. - return false; - } - - try { - if (!VerityUtils.isFsVeritySupported()) { - return false; - } - if (certificateBytes == null) { - Slog.w(TAG, "Received a null certificate"); - return false; - } - synchronized (mTrustedCertificates) { - return mTrustedCertificates.contains(toCertificate(certificateBytes)); - } - } catch (CertificateException e) { - Slog.e(TAG, "Failed to convert the certificate: " + e); - return false; - } - } - - @Override - public void onShellCommand(FileDescriptor in, FileDescriptor out, - FileDescriptor err, String[] args, ShellCallback callback, - ResultReceiver resultReceiver) { - new FileIntegrityServiceShellCommand() - .exec(this, in, out, err, args, callback, resultReceiver); - } - private void checkCallerPackageName(String packageName) { final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); @@ -195,12 +126,6 @@ public class FileIntegrityService extends SystemService { public FileIntegrityService(final Context context) { super(context); mService = new BinderService(context); - try { - sCertFactory = CertificateFactory.getInstance("X.509"); - } catch (CertificateException e) { - Slog.wtf(TAG, "Cannot get an instance of X.509 certificate factory"); - } - LocalServices.addService(FileIntegrityService.class, this); } @@ -215,155 +140,6 @@ public class FileIntegrityService extends SystemService { @Override public void onStart() { - loadAllCertificates(); publishBinderService(Context.FILE_INTEGRITY_SERVICE, mService); } - - /** - * Returns whether the signature over the file's fs-verity digest can be verified by one of the - * known certiticates. - */ - public boolean verifyPkcs7DetachedSignature(String signaturePath, String filePath) - throws IOException { - if (Files.size(Paths.get(signaturePath)) > MAX_SIGNATURE_FILE_SIZE_BYTES) { - throw new SecurityException("Signature file is unexpectedly large: " - + signaturePath); - } - byte[] signatureBytes = Files.readAllBytes(Paths.get(signaturePath)); - byte[] digest = VerityUtils.getFsverityDigest(filePath); - synchronized (mTrustedCertificates) { - for (var cert : mTrustedCertificates) { - try { - byte[] derEncoded = cert.getEncoded(); - if (VerityUtils.verifyPkcs7DetachedSignature(signatureBytes, digest, - new ByteArrayInputStream(derEncoded))) { - return true; - } - } catch (CertificateEncodingException e) { - Slog.w(TAG, "Ignoring ill-formed certificate: " + e); - } - } - } - return false; - } - - private void loadAllCertificates() { - // Load certificates trusted by the device manufacturer. - final String relativeDir = "etc/security/fsverity"; - loadCertificatesFromDirectory(Environment.getRootDirectory().toPath() - .resolve(relativeDir)); - loadCertificatesFromDirectory(Environment.getProductDirectory().toPath() - .resolve(relativeDir)); - } - - private void loadCertificatesFromDirectory(Path path) { - try { - File[] files = path.toFile().listFiles(); - if (files == null) { - return; - } - - for (File cert : files) { - byte[] certificateBytes = Files.readAllBytes(cert.toPath()); - collectCertificate(certificateBytes); - } - } catch (IOException e) { - Slog.wtf(TAG, "Failed to load fs-verity certificate from " + path, e); - } - } - - /** - * Tries to convert {@code bytes} into an X.509 certificate and store in memory. - * Errors need to be surpressed in order fo the next certificates to still be collected. - */ - private void collectCertificate(@NonNull byte[] bytes) { - try { - synchronized (mTrustedCertificates) { - mTrustedCertificates.add(toCertificate(bytes)); - } - } catch (CertificateException e) { - Slog.e(TAG, "Invalid certificate, ignored: " + e); - } - } - - /** - * Converts byte array into one X.509 certificate. If multiple certificate is defined, ignore - * the rest. The rational is to make it harder to smuggle. - */ - @NonNull - private static X509Certificate toCertificate(@NonNull byte[] bytes) - throws CertificateException { - Certificate certificate = sCertFactory.generateCertificate(new ByteArrayInputStream(bytes)); - if (!(certificate instanceof X509Certificate)) { - throw new CertificateException("Expected to contain an X.509 certificate"); - } - return (X509Certificate) certificate; - } - - - private class FileIntegrityServiceShellCommand extends ShellCommand { - @Override - public int onCommand(String cmd) { - if (!Build.IS_DEBUGGABLE) { - return -1; - } - if (cmd == null) { - return handleDefaultCommands(cmd); - } - final PrintWriter pw = getOutPrintWriter(); - switch (cmd) { - case "append-cert": - String nextArg = getNextArg(); - if (nextArg == null) { - pw.println("Invalid argument"); - pw.println(""); - onHelp(); - return -1; - } - ParcelFileDescriptor pfd = openFileForSystem(nextArg, "r"); - if (pfd == null) { - pw.println("Cannot open the file"); - return -1; - } - InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(pfd); - try { - collectCertificate(is.readAllBytes()); - } catch (IOException e) { - pw.println("Failed to add certificate: " + e); - return -1; - } - pw.println("Certificate is added successfully"); - return 0; - - case "remove-last-cert": - synchronized (mTrustedCertificates) { - if (mTrustedCertificates.size() == 0) { - pw.println("Certificate list is already empty"); - return -1; - } - mTrustedCertificates.remove(mTrustedCertificates.size() - 1); - } - pw.println("Certificate is removed successfully"); - return 0; - default: - pw.println("Unknown action"); - pw.println(""); - onHelp(); - } - return -1; - } - - @Override - public void onHelp() { - final PrintWriter pw = getOutPrintWriter(); - pw.println("File integrity service commands:"); - pw.println(" help"); - pw.println(" Print this help text."); - pw.println(" append-cert path/to/cert.der"); - pw.println(" Add the DER-encoded certificate (only in debug builds)"); - pw.println(" remove-last-cert"); - pw.println(" Remove the last certificate in the key list (only in debug builds)"); - pw.println(""); - } - } } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index b7ce050aaadd..4827c9f414ad 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -177,6 +177,13 @@ public interface StatusBarManagerInternal { */ void onDisplayReady(int displayId); + /** + * Notifies System UI that the system decorations should be removed from the display. + * + * @param displayId display ID + */ + void onDisplayRemoveSystemDecorations(int displayId); + /** @see com.android.internal.statusbar.IStatusBar#onSystemBarAttributesChanged */ void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, @@ -275,7 +282,13 @@ public interface StatusBarManagerInternal { */ void moveFocusedTaskToDesktop(int displayId); - /** Passes through the given shell commands to SystemUI */ void passThroughShellCommand(String[] args, FileDescriptor fd); + + /** + * Set whether the display should have a navigation bar. + * + * TODO(b/390591772): Refactor this method + */ + void setHasNavigationBar(int displayId, boolean hasNavigationBar); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 4ece470d9b8d..37056a4af250 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -793,6 +793,26 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override + public void onDisplayRemoveSystemDecorations(int displayId) { + if (isVisibleBackgroundUserOnDisplay(displayId)) { + if (SPEW) { + Slog.d(TAG, + "Skipping onDisplayRemoveSystemDecorations for visible background " + + "user " + + mUserManagerInternal.getUserAssignedToDisplay(displayId)); + } + return; + } + + IStatusBar bar = mBar; + if (bar != null) { + try { + bar.onDisplayRemoveSystemDecorations(displayId); + } catch (RemoteException ex) {} + } + } + + @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, @Behavior int behavior, @InsetsType int requestedVisibleTypes, @@ -996,6 +1016,23 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D public void passThroughShellCommand(String[] args, FileDescriptor fd) { StatusBarManagerService.this.passThroughShellCommand(args, fd); } + + @Override + public void setHasNavigationBar(int displayId, boolean hasNavigationBar) { + if (isVisibleBackgroundUserOnDisplay(displayId)) { + if (SPEW) { + Slog.d(TAG, "Skipping setHasNavigationBar for visible background user " + + mUserManagerInternal.getUserAssignedToDisplay(displayId)); + } + return; + } + IStatusBar bar = mBar; + if (bar != null) { + try { + bar.setHasNavigationBar(displayId, hasNavigationBar); + } catch (RemoteException ex) {} + } + } }; private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() { @@ -1542,10 +1579,13 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D getUiState(displayId).setImeWindowState(vis, backDisposition, showImeSwitcher); mHandler.post(() -> { - if (mBar == null) return; - try { - mBar.setImeWindowStatus(displayId, vis, backDisposition, showImeSwitcher); - } catch (RemoteException ex) { } + IStatusBar bar = mBar; + if (bar != null) { + try { + bar.setImeWindowStatus(displayId, vis, backDisposition, showImeSwitcher); + } catch (RemoteException ex) { + } + } }); } } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 415896b6230f..a8deeeac311d 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.MANAGE_EXTERNAL_STORAGE; import static android.Manifest.permission.READ_WALLPAPER_INTERNAL; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; +import static android.app.Flags.enableConnectedDisplaysWallpaper; import static android.app.Flags.fixWallpaperChanged; import static android.app.Flags.liveWallpaperContentHandling; import static android.app.Flags.removeNextWallpaperComponent; @@ -89,6 +90,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; import android.hardware.display.DisplayManager; +import android.hardware.display.DisplayManager.DisplayListener; import android.multiuser.Flags; import android.os.Binder; import android.os.Bundle; @@ -655,8 +657,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub private final MyPackageMonitor mMonitor; private final AppOpsManager mAppOpsManager; - private final DisplayManager.DisplayListener mDisplayListener = - new DisplayManager.DisplayListener() { + private final DisplayListener mDisplayListener = new DisplayListener() { @Override public void onDisplayAdded(int displayId) { @@ -665,24 +666,64 @@ public class WallpaperManagerService extends IWallpaperManager.Stub @Override public void onDisplayRemoved(int displayId) { synchronized (mLock) { - if (mLastWallpaper != null) { - WallpaperData targetWallpaper = null; - if (mLastWallpaper.connection != null && - mLastWallpaper.connection.containsDisplay(displayId)) { - targetWallpaper = mLastWallpaper; - } else if (mFallbackWallpaper != null && - mFallbackWallpaper.connection != null && - mFallbackWallpaper.connection.containsDisplay(displayId)) { - targetWallpaper = mFallbackWallpaper; + if (enableConnectedDisplaysWallpaper()) { + // There could be at most 2 wallpaper connections per display: + // 1. system & lock are the same: mLastWallpaper + // 2. system, lock are different: mLastWallpaper, mLastLockWallpaper + // 3. fallback used as both system & lock wallpaper: mFallbackWallpaper + // 4. fallback used as lock only wallpaper: mFallbackWallpaper, + // mLastWallpaper + // 5. fallback used as system only wallpaper: mFallbackWallpaper, + // mLastLockWallpaper + List<WallpaperData> pendingDisconnectWallpapers = new ArrayList<>(); + if (mLastWallpaper != null && mLastWallpaper.connection != null + && mLastWallpaper.connection.containsDisplay(displayId)) { + pendingDisconnectWallpapers.add(mLastWallpaper); + } + if (mLastLockWallpaper != null && mLastLockWallpaper.connection != null + && mLastLockWallpaper.connection.containsDisplay(displayId)) { + pendingDisconnectWallpapers.add(mLastLockWallpaper); + } + if (mFallbackWallpaper != null && mFallbackWallpaper.connection != null + && mFallbackWallpaper.connection.containsDisplay(displayId)) { + pendingDisconnectWallpapers.add(mFallbackWallpaper); + } + for (int i = 0; i < pendingDisconnectWallpapers.size(); i++) { + WallpaperData wallpaper = pendingDisconnectWallpapers.get(i); + DisplayConnector displayConnector = + wallpaper.connection.getDisplayConnectorOrCreate(displayId); + if (displayConnector == null) { + Slog.w(TAG, + "Fail to disconnect wallpaper upon display removal"); + return; + } + displayConnector.disconnectLocked(wallpaper.connection); + wallpaper.connection.removeDisplayConnector(displayId); + } + } else { + if (mLastWallpaper != null) { + WallpaperData targetWallpaper = null; + if (mLastWallpaper.connection != null + && mLastWallpaper.connection.containsDisplay(displayId)) { + targetWallpaper = mLastWallpaper; + } else if (mFallbackWallpaper != null + && mFallbackWallpaper.connection != null + && mFallbackWallpaper.connection.containsDisplay( + displayId)) { + targetWallpaper = mFallbackWallpaper; + } + if (targetWallpaper == null) return; + DisplayConnector connector = + targetWallpaper.connection.getDisplayConnectorOrCreate( + displayId); + if (connector == null) return; + connector.disconnectLocked(targetWallpaper.connection); + targetWallpaper.connection.removeDisplayConnector(displayId); } - if (targetWallpaper == null) return; - DisplayConnector connector = - targetWallpaper.connection.getDisplayConnectorOrCreate(displayId); - if (connector == null) return; - connector.disconnectLocked(targetWallpaper.connection); - targetWallpaper.connection.removeDisplayConnector(displayId); - mWallpaperDisplayHelper.removeDisplayData(displayId); } + + mWallpaperDisplayHelper.removeDisplayData(displayId); + for (int i = mColorsChangedListeners.size() - 1; i >= 0; i--) { final SparseArray<RemoteCallbackList<IWallpaperManagerCallback>> callbacks = mColorsChangedListeners.valueAt(i); @@ -1627,6 +1668,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub public void onScreenTurnedOn(int displayId) { notifyScreenTurnedOn(displayId); } + @Override public void onScreenTurningOn(int displayId) { notifyScreenTurningOn(displayId); @@ -3707,6 +3749,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } if (newWallpaper.mWhich == (FLAG_SYSTEM | FLAG_LOCK)) { mLastWallpaper = newWallpaper; + mLastLockWallpaper = null; } else if (newWallpaper.mWhich == FLAG_SYSTEM) { mLastWallpaper = newWallpaper; } else if (newWallpaper.mWhich == FLAG_LOCK) { @@ -3916,13 +3959,49 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (mLastWallpaper == null) { return; } - if (supportsMultiDisplay(mLastWallpaper.connection)) { - final DisplayConnector connector = - mLastWallpaper.connection.getDisplayConnectorOrCreate(displayId); - if (connector == null) return; - connector.connectLocked(mLastWallpaper.connection, mLastWallpaper); - return; + if (enableConnectedDisplaysWallpaper()) { + int useFallbackWallpaperWhich = 0; + List<WallpaperData> wallpapers = new ArrayList<>(); + wallpapers.add(mLastWallpaper); + // If the system and the lock wallpapers are not the same, we should also + // establish a display connector to the lock wallpaper for this display. + if (mLastLockWallpaper != null && mLastWallpaper != mLastLockWallpaper) { + wallpapers.add(mLastLockWallpaper); + } + + for (int i = 0; i < wallpapers.size(); i++) { + WallpaperData wallpaper = wallpapers.get(i); + if (supportsMultiDisplay(wallpaper.connection)) { + final DisplayConnector connector = + wallpaper.connection.getDisplayConnectorOrCreate(displayId); + if (connector != null) { + connector.connectLocked(wallpaper.connection, wallpaper); + } else { + Slog.w(TAG, "Fail to connect to wallpaper for display id " + displayId + + " due to null connector. Use fallback wallpaper."); + useFallbackWallpaperWhich |= wallpaper.mWhich; + } + } else { + useFallbackWallpaperWhich |= wallpaper.mWhich; + } + } + + if (useFallbackWallpaperWhich == 0 + || mFallbackWallpaper == null + || mFallbackWallpaper.connection == null) { + return; + } + mFallbackWallpaper.mWhich = useFallbackWallpaperWhich; + } else { + if (supportsMultiDisplay(mLastWallpaper.connection)) { + final DisplayConnector connector = + mLastWallpaper.connection.getDisplayConnectorOrCreate(displayId); + if (connector == null) return; + connector.connectLocked(mLastWallpaper.connection, mLastWallpaper); + return; + } } + // System wallpaper does not support multiple displays, attach this display to // the fallback wallpaper. if (mFallbackWallpaper != null && mFallbackWallpaper diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 8e4d4be693f8..c7d4467a6e98 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -103,6 +103,7 @@ import android.app.PendingIntent; import android.app.ProfilerInfo; import android.app.WaitResult; import android.app.WindowConfiguration; +import android.app.WindowConfiguration.WindowingMode; import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; import android.compat.annotation.Disabled; @@ -233,6 +234,7 @@ class ActivityStarter { // The task display area to launch the activity onto, barring any strong reason to do otherwise. private TaskDisplayArea mPreferredTaskDisplayArea; + @WindowingMode private int mPreferredWindowingMode; private Task mInTask; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 1bbae7f17308..a0d2d260b39e 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3261,9 +3261,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } mWmService.mDisplayWindowSettings.setShouldShowSystemDecorsLocked(this, shouldShow); - if (shouldShow) { - mRootWindowContainer.startSystemDecorations(this, "onDisplayInfoChangeApplied"); - } else { + if (!shouldShow) { clearAllTasksOnDisplay(null); } } @@ -6471,7 +6469,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mRemoving; } - private void clearAllTasksOnDisplay(@Nullable Runnable clearTasksCallback) { + void clearAllTasksOnDisplay(@Nullable Runnable clearTasksCallback) { Task lastReparentedRootTask; mRootWindowContainer.mTaskSupervisor.beginDeferResume(); try { diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 319b48a89316..e1a50a93edcc 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -67,6 +67,7 @@ import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON; +import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_TIMEOUT; import static com.android.server.policy.WindowManagerPolicy.TRANSIT_PREVIEW_DONE; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT; @@ -746,6 +747,31 @@ public class DisplayPolicy { return mHasNavigationBar; } + void updateHasNavigationBarIfNeeded() { + if (!enableDisplayContentModeManagement()) { + Slog.e(TAG, "mHasNavigationBar shouldn't be updated when the flag is off."); + } + + if (mDisplayContent.isDefaultDisplay) { + return; + } + + final boolean hasNavigationBar = mDisplayContent.isSystemDecorationsSupported(); + if (mHasNavigationBar == hasNavigationBar) { + return; + } + + mHasNavigationBar = hasNavigationBar; + mHandler.post( + () -> { + final int displayId = getDisplayId(); + StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); + if (statusBar != null) { + statusBar.setHasNavigationBar(displayId, mHasNavigationBar); + } + }); + } + public boolean hasStatusBar() { return mHasStatusBar; } @@ -1876,6 +1902,17 @@ public class DisplayPolicy { }); } + void notifyDisplayRemoveSystemDecorations() { + mHandler.post( + () -> { + final int displayId = getDisplayId(); + StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); + if (statusBar != null) { + statusBar.onDisplayRemoveSystemDecorations(displayId); + } + }); + } + /** * Return corner radius in pixels that should be used on windows in order to cover the display. * diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index 4ae100857f55..28aa6eff911b 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -26,6 +26,8 @@ import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_AUTO; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_DISABLED; +import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; + import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WindowConfiguration; @@ -244,11 +246,27 @@ class DisplayWindowSettings { } void setShouldShowSystemDecorsLocked(@NonNull DisplayContent dc, boolean shouldShow) { + final boolean changed = (shouldShow != shouldShowSystemDecorsLocked(dc)); + final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); overrideSettings.mShouldShowSystemDecors = shouldShow; mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); + + if (enableDisplayContentModeManagement()) { + if (dc.isDefaultDisplay || dc.isPrivate() || !changed) { + return; + } + + dc.getDisplayPolicy().updateHasNavigationBarIfNeeded(); + + if (shouldShow) { + mService.mRoot.startSystemDecorations(dc, "setShouldShowSystemDecorsLocked"); + } else { + dc.getDisplayPolicy().notifyDisplayRemoveSystemDecorations(); + } + } } boolean isHomeSupportedLocked(@NonNull DisplayContent dc) { diff --git a/services/core/java/com/android/server/wm/LaunchParamsController.java b/services/core/java/com/android/server/wm/LaunchParamsController.java index ba1401ab3978..4f5c0c8ecf6e 100644 --- a/services/core/java/com/android/server/wm/LaunchParamsController.java +++ b/services/core/java/com/android/server/wm/LaunchParamsController.java @@ -28,6 +28,7 @@ import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier. import android.annotation.IntDef; import android.annotation.Nullable; import android.app.ActivityOptions; +import android.app.WindowConfiguration.WindowingMode; import android.content.pm.ActivityInfo.WindowLayout; import android.graphics.Rect; @@ -186,6 +187,7 @@ class LaunchParamsController { TaskDisplayArea mPreferredTaskDisplayArea; /** The windowing mode to be in. */ + @WindowingMode int mWindowingMode; /** Sets values back to default. {@link #isEmpty} will return {@code true} once called. */ diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp index 6393e11b7432..1db9e8d545e4 100644 --- a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp +++ b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp @@ -1,7 +1,7 @@ aconfig_declarations { name: "device_state_flags", package: "com.android.server.policy.feature.flags", - container: "system", + container: "system_ext", srcs: [ "device_state_flags.aconfig", ], diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig index da2e5ee37c1a..bbbbe5db91dd 100644 --- a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig +++ b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig @@ -1,5 +1,5 @@ package: "com.android.server.policy.feature.flags" -container: "system" +container: "system_ext" flag { name: "enable_dual_display_blocking" diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java index e8b28ac19a85..72f08dd07658 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -759,6 +759,83 @@ public class DisplayManagerServiceTest { } @Test + public void testCreateVirtualDisplayStealTopFocusDisabled() throws RemoteException { + DisplayManagerService displayManager = + new DisplayManagerService(mContext, mBasicInjector); + registerDefaultDisplays(displayManager); + + // This is effectively the DisplayManager service published to ServiceManager. + DisplayManagerService.BinderService bs = displayManager.new BinderService(); + + String uniqueId = "uniqueId --- Steal Top Focus Test"; + int width = 600; + int height = 800; + int dpi = 320; + int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_STEAL_TOP_FOCUS_DISABLED + | DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_FOCUS + | DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED; + + when(mContext.checkCallingPermission(ADD_TRUSTED_DISPLAY)).thenReturn( + PackageManager.PERMISSION_GRANTED); + when(mMockAppToken.asBinder()).thenReturn(mMockAppToken); + final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder( + VIRTUAL_DISPLAY_NAME, width, height, dpi); + builder.setFlags(flags); + builder.setUniqueId(uniqueId); + int displayId = bs.createVirtualDisplay(builder.build(), /* callback= */ mMockAppToken, + /* projection= */ null, PACKAGE_NAME); + verify(mMockProjectionService, never()).setContentRecordingSession(any(), + nullable(IMediaProjection.class)); + + performTraversalInternal(displayManager); + + // flush the handler + displayManager.getDisplayHandler().runWithScissors(() -> {}, /* now= */ 0); + + DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayId); + assertNotNull(ddi); + assertTrue((ddi.flags & DisplayDeviceInfo.FLAG_STEAL_TOP_FOCUS_DISABLED) != 0); + } + + @Test + public void testCreateVirtualDisplayOwnFocus_nonOwnFocusDisplay() throws RemoteException { + DisplayManagerService displayManager = + new DisplayManagerService(mContext, mBasicInjector); + registerDefaultDisplays(displayManager); + + // This is effectively the DisplayManager service published to ServiceManager. + DisplayManagerService.BinderService bs = displayManager.new BinderService(); + + String uniqueId = "uniqueId --- Steal Top Focus Test -- nonOwnFocusDisplay"; + int width = 600; + int height = 800; + int dpi = 320; + int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_STEAL_TOP_FOCUS_DISABLED + | DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED; + + when(mContext.checkCallingPermission(ADD_TRUSTED_DISPLAY)).thenReturn( + PackageManager.PERMISSION_GRANTED); + when(mMockAppToken.asBinder()).thenReturn(mMockAppToken); + final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder( + VIRTUAL_DISPLAY_NAME, width, height, dpi); + builder.setFlags(flags); + builder.setUniqueId(uniqueId); + int displayId = bs.createVirtualDisplay(builder.build(), /* callback= */ mMockAppToken, + /* projection= */ null, PACKAGE_NAME); + verify(mMockProjectionService, never()).setContentRecordingSession(any(), + nullable(IMediaProjection.class)); + + performTraversalInternal(displayManager); + + // flush the handler + displayManager.getDisplayHandler().runWithScissors(() -> {}, /* now= */ 0); + + DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayId); + assertNotNull(ddi); + assertTrue((ddi.flags & DisplayDeviceInfo.FLAG_STEAL_TOP_FOCUS_DISABLED) == 0); + } + + @Test public void testCreateVirtualDisplayOwnFocus_checkDisplayDeviceInfo() throws RemoteException { DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector); @@ -2126,11 +2203,12 @@ public class DisplayManagerServiceTest { @Test public void test_displayChangedNotified_displayInfoFramerateOverridden() { + when(mMockFlags.isFramerateOverrideTriggersRrCallbacksEnabled()).thenReturn(false); + DisplayManagerService displayManager = - new DisplayManagerService(mContext, mShortMockedInjector); + new DisplayManagerService(mContext, mBasicInjector); DisplayManagerService.BinderService displayManagerBinderService = displayManager.new BinderService(); - when(mMockFlags.isFramerateOverrideTriggersRrCallbacksEnabled()).thenReturn(false); registerDefaultDisplays(displayManager); displayManager.onBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java index 8a10040f986f..8dc657ed75a6 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java @@ -49,6 +49,7 @@ import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.KeyguardManager; +import android.app.PropertyInvalidatedCache; import android.content.Context; import android.content.pm.PackageManagerInternal; import android.content.pm.UserInfo; @@ -181,8 +182,8 @@ public final class UserManagerServiceTest { MockitoAnnotations.initMocks(this); mSpiedContext = spy(mRealContext); - // Called when WatchedUserStates is constructed - doNothing().when(() -> UserManager.invalidateIsUserUnlockedCache()); + // Disable binder caches in this process. + PropertyInvalidatedCache.disableForTestMode(); // Called when creating new users when(mDeviceStorageMonitorInternal.isMemoryLow()).thenReturn(false); diff --git a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java index db323f1b68e7..1cf655675a30 100644 --- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java @@ -33,6 +33,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertEquals; @@ -65,6 +66,7 @@ import android.content.pm.ParceledListSlice; import android.content.pm.ServiceInfo; import android.graphics.Color; import android.hardware.display.DisplayManager; +import android.hardware.display.DisplayManager.DisplayListener; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; import android.os.RemoteException; @@ -75,6 +77,7 @@ import android.platform.test.annotations.Presubmit; import android.platform.test.flag.junit.SetFlagsRule; import android.service.wallpaper.IWallpaperConnection; import android.service.wallpaper.IWallpaperEngine; +import android.service.wallpaper.IWallpaperService; import android.service.wallpaper.WallpaperService; import android.testing.TestableContext; import android.util.Log; @@ -105,6 +108,7 @@ import org.junit.Test; import org.junit.rules.RuleChain; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.quality.Strictness; @@ -154,6 +158,8 @@ public class WallpaperManagerServiceTests { private WallpaperManagerService mService; private static IWallpaperConnection.Stub sWallpaperService; + private static WindowManagerInternal sWindowManagerInternal; + @BeforeClass public static void setUpClass() { sMockitoSession = mockitoSession() @@ -163,8 +169,8 @@ public class WallpaperManagerServiceTests { .spyStatic(WallpaperManager.class) .startMocking(); - final WindowManagerInternal dmi = mock(WindowManagerInternal.class); - LocalServices.addService(WindowManagerInternal.class, dmi); + sWindowManagerInternal = mock(WindowManagerInternal.class); + LocalServices.addService(WindowManagerInternal.class, sWindowManagerInternal); sContext.addMockSystemService(Context.APP_OPS_SERVICE, mock(AppOpsManager.class)); @@ -336,6 +342,43 @@ public class WallpaperManagerServiceTests { } /** + * Test setWallpaperComponent with FLAG_LOCK should update the mLastLockWallpaper. + */ + @Test + public void testSetLockWallpaper() { + final int testUserId = USER_SYSTEM; + mService.switchUser(testUserId, null); + verifyLastWallpaperData(testUserId, sDefaultWallpaperComponent); + verifyCurrentSystemData(testUserId); + + mService.setWallpaperComponent(sImageWallpaperComponentName, sContext.getOpPackageName(), + FLAG_LOCK, testUserId); + verifyLastLockWallpaperData(testUserId, sImageWallpaperComponentName); + verifyCurrentSystemData(testUserId); + } + + /** + * Test setWallpaperComponent with FLAG_LOCK and then setWallpaperComponent with + * FLAG_LOCK | FLAG_SYSTEM should set mLastLockWallpaper to null. + */ + @Test + public void testSetLockWallpaperThenSetLockAndSystemWallpaper_setLastLockWallpaperToNull() { + final int testUserId = USER_SYSTEM; + mService.switchUser(testUserId, null); + verifyLastWallpaperData(testUserId, sDefaultWallpaperComponent); + verifyCurrentSystemData(testUserId); + + mService.setWallpaperComponent(sImageWallpaperComponentName, sContext.getOpPackageName(), + FLAG_LOCK, testUserId); + mService.setWallpaperComponent(sImageWallpaperComponentName, sContext.getOpPackageName(), + FLAG_LOCK | FLAG_SYSTEM, testUserId); + + verifyLastWallpaperData(testUserId, sImageWallpaperComponentName); + assertThat(mService.mLastLockWallpaper).isNull(); + verifyCurrentSystemData(testUserId); + } + + /** * Tests that when setWallpaperComponent is called with the currently set component, a command * is issued to the wallpaper. */ @@ -661,6 +704,171 @@ public class WallpaperManagerServiceTests { assertPfdAndFileContentsEqual(pfd, originalSystemWallpaperFile); } + // Verify a secondary display added started + @Test + @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WALLPAPER) + public void displayAdded_sameSystemAndLockWallpaper_shouldAttachWallpaperServiceOnce() + throws Exception { + // GIVEN the same wallpaper used for the lock and system. + final int testUserId = USER_SYSTEM; + mService.switchUser(testUserId, null); + final WallpaperData wallpaper = mService.getCurrentWallpaperData(FLAG_SYSTEM, testUserId); + IWallpaperService mockIWallpaperService = mock(IWallpaperService.class); + wallpaper.connection.mService = mockIWallpaperService; + // GIVEN there are two displays: DEFAULT_DISPLAY, 2 + final int testDisplayId = 2; + setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId)); + + // WHEN displayId, 2, is ready. + WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService( + WallpaperManagerInternal.class); + wallpaperManagerInternal.onDisplayReady(testDisplayId); + + // Then there is a connection established for the system & lock wallpaper for display ID, 2. + verify(mockIWallpaperService).attach( + /* connection= */ eq(wallpaper.connection), + /* windowToken= */ any(), + /* windowType= */ anyInt(), + /* isPreview= */ anyBoolean(), + /* reqWidth= */ anyInt(), + /* reqHeight= */ anyInt(), + /* padding= */ any(), + /* displayId= */ eq(testDisplayId), + /* which= */ eq(FLAG_SYSTEM | FLAG_LOCK), + /* info= */ any(), + /* description= */ any()); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WALLPAPER) + public void displayAdded_differentSystemAndLockWallpapers_shouldAttachWallpaperServiceTwice() + throws Exception { + // GIVEN different wallpapers used for the lock and system. + final int testUserId = USER_SYSTEM; + mService.switchUser(testUserId, null); + mService.setWallpaperComponent(sImageWallpaperComponentName, sContext.getOpPackageName(), + FLAG_LOCK, testUserId); + final WallpaperData systemWallpaper = mService.getCurrentWallpaperData(FLAG_SYSTEM, + testUserId); + final WallpaperData lockWallpaper = mService.getCurrentWallpaperData(FLAG_LOCK, + testUserId); + IWallpaperService mockIWallpaperService = mock(IWallpaperService.class); + systemWallpaper.connection.mService = mockIWallpaperService; + lockWallpaper.connection.mService = mockIWallpaperService; + // GIVEN there are two displays: DEFAULT_DISPLAY, 2 + final int testDisplayId = 2; + setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId)); + + // WHEN displayId, 2, is ready. + WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService( + WallpaperManagerInternal.class); + wallpaperManagerInternal.onDisplayReady(testDisplayId); + + // Then there is a connection established for the system wallpaper for display ID, 2. + verify(mockIWallpaperService).attach( + /* connection= */ eq(systemWallpaper.connection), + /* windowToken= */ any(), + /* windowType= */ anyInt(), + /* isPreview= */ anyBoolean(), + /* reqWidth= */ anyInt(), + /* reqHeight= */ anyInt(), + /* padding= */ any(), + /* displayId= */ eq(testDisplayId), + /* which= */ eq(FLAG_SYSTEM), + /* info= */ any(), + /* description= */ any()); + // Then there is a connection established for the lock wallpaper for display ID, 2. + verify(mockIWallpaperService).attach( + /* connection= */ eq(lockWallpaper.connection), + /* windowToken= */ any(), + /* windowType= */ anyInt(), + /* isPreview= */ anyBoolean(), + /* reqWidth= */ anyInt(), + /* reqHeight= */ anyInt(), + /* padding= */ any(), + /* displayId= */ eq(testDisplayId), + /* which= */ eq(FLAG_LOCK), + /* info= */ any(), + /* description= */ any()); + } + // Verify a secondary display added end + + // Verify a secondary display removed started + @Test + @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WALLPAPER) + public void displayRemoved_sameSystemAndLockWallpaper_shouldDetachWallpaperServiceOnce() + throws Exception { + ArgumentCaptor<DisplayListener> displayListenerCaptor = ArgumentCaptor.forClass( + DisplayListener.class); + verify(mDisplayManager).registerDisplayListener(displayListenerCaptor.capture(), eq(null)); + // GIVEN the same wallpaper used for the lock and system. + final int testUserId = USER_SYSTEM; + mService.switchUser(testUserId, null); + final WallpaperData wallpaper = mService.getCurrentWallpaperData(FLAG_SYSTEM, testUserId); + IWallpaperService mockIWallpaperService = mock(IWallpaperService.class); + wallpaper.connection.mService = mockIWallpaperService; + // GIVEN there are two displays: DEFAULT_DISPLAY, 2 + final int testDisplayId = 2; + setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId)); + // GIVEN wallpaper connections have been established for displayID, 2. + WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService( + WallpaperManagerInternal.class); + wallpaperManagerInternal.onDisplayReady(testDisplayId); + // Save displayConnector for displayId 2 before display removal. + WallpaperManagerService.DisplayConnector displayConnector = + wallpaper.connection.getDisplayConnectorOrCreate(testDisplayId); + + // WHEN displayId, 2, is removed. + DisplayListener displayListener = displayListenerCaptor.getValue(); + displayListener.onDisplayRemoved(testDisplayId); + + // Then the wallpaper connection for displayId, 2, is detached. + verify(mockIWallpaperService).detach(eq(displayConnector.mToken)); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WALLPAPER) + public void displayRemoved_differentSystemAndLockWallpapers_shouldDetachWallpaperServiceTwice() + throws Exception { + ArgumentCaptor<DisplayListener> displayListenerCaptor = ArgumentCaptor.forClass( + DisplayListener.class); + verify(mDisplayManager).registerDisplayListener(displayListenerCaptor.capture(), eq(null)); + // GIVEN different wallpapers used for the lock and system. + final int testUserId = USER_SYSTEM; + mService.switchUser(testUserId, null); + mService.setWallpaperComponent(sImageWallpaperComponentName, sContext.getOpPackageName(), + FLAG_LOCK, testUserId); + final WallpaperData systemWallpaper = mService.getCurrentWallpaperData(FLAG_SYSTEM, + testUserId); + final WallpaperData lockWallpaper = mService.getCurrentWallpaperData(FLAG_LOCK, + testUserId); + IWallpaperService mockIWallpaperService = mock(IWallpaperService.class); + systemWallpaper.connection.mService = mockIWallpaperService; + lockWallpaper.connection.mService = mockIWallpaperService; + // GIVEN there are two displays: DEFAULT_DISPLAY, 2 + final int testDisplayId = 2; + setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId)); + // GIVEN wallpaper connections have been established for displayID, 2. + WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService( + WallpaperManagerInternal.class); + wallpaperManagerInternal.onDisplayReady(testDisplayId); + // Save displayConnectors for displayId 2 before display removal. + WallpaperManagerService.DisplayConnector systemWallpaperDisplayConnector = + systemWallpaper.connection.getDisplayConnectorOrCreate(testDisplayId); + WallpaperManagerService.DisplayConnector lockWallpaperDisplayConnector = + lockWallpaper.connection.getDisplayConnectorOrCreate(testDisplayId); + + // WHEN displayId, 2, is removed. + DisplayListener displayListener = displayListenerCaptor.getValue(); + displayListener.onDisplayRemoved(testDisplayId); + + // Then the system wallpaper connection for displayId, 2, is detached. + verify(mockIWallpaperService).detach(eq(systemWallpaperDisplayConnector.mToken)); + // Then the lock wallpaper connection for displayId, 2, is detached. + verify(mockIWallpaperService).detach(eq(lockWallpaperDisplayConnector.mToken)); + } + // Verify a secondary display removed ended + // Verify that after continue switch user from userId 0 to lastUserId, the wallpaper data for // non-current user must not bind to wallpaper service. private void verifyNoConnectionBeforeLastUser(int lastUserId) { @@ -681,11 +889,31 @@ public class WallpaperManagerServiceTests { lastData.connection); } + private void verifyLastLockWallpaperData(int lastUserId, ComponentName expectedComponent) { + final WallpaperData lastLockData = mService.mLastLockWallpaper; + assertWithMessage("Last wallpaper must not be null").that(lastLockData).isNotNull(); + assertWithMessage("Last wallpaper component must be equals.") + .that(expectedComponent) + .isEqualTo(lastLockData.getComponent()); + assertWithMessage("The user id in last wallpaper should be the last switched user") + .that(lastUserId) + .isEqualTo(lastLockData.userId); + assertWithMessage("Must exist user data connection on last wallpaper data") + .that(lastLockData.connection) + .isNotNull(); + } + private void verifyCurrentSystemData(int userId) { final WallpaperData lastData = mService.mLastWallpaper; final WallpaperData wallpaper = mService.getCurrentWallpaperData(FLAG_SYSTEM, userId); assertEquals("Last wallpaper should be equals to current system wallpaper", lastData, wallpaper); + + final WallpaperData lastLockData = mService.mLastLockWallpaper; + final WallpaperData lockWallpaper = mService.getCurrentWallpaperData(FLAG_LOCK, userId); + assertWithMessage("Last lock wallpaper should be equals to current lock wallpaper") + .that(lastLockData) + .isEqualTo(lockWallpaper); } private void verifyDisplayData() { @@ -698,6 +926,32 @@ public class WallpaperManagerServiceTests { } /** + * Sets up mock displays for testing. + * + * <p>This method creates mock {@link Display} objects and configures the {@link DisplayManager} + * to return them. It also sets up the {@link WindowManagerInternal} to indicate that all + * displays support home. + * + * @param displayIds A list of display IDs to create mock displays for. + */ + private void setUpDisplays(List<Integer> displayIds) { + doReturn(true).when(sWindowManagerInternal).isHomeSupportedOnDisplay(anyInt()); + + Display[] mockDisplays = new Display[displayIds.size()]; + for (int i = 0; i < displayIds.size(); i++) { + final int displayId = displayIds.get(i); + final Display mockDisplay = mock(Display.class); + mockDisplays[i] = mockDisplay; + doReturn(DISPLAY_SIZE_DIMENSION).when(mockDisplay).getMaximumSizeDimension(); + doReturn(mockDisplay).when(mDisplayManager).getDisplay(eq(displayId)); + doReturn(displayId).when(mockDisplay).getDisplayId(); + doReturn(true).when(mockDisplay).hasAccess(anyInt()); + } + + doReturn(mockDisplays).when(mDisplayManager).getDisplays(); + } + + /** * Asserts that the contents of the given {@link ParcelFileDescriptor} and {@link File} contain * exactly the same bytes. * diff --git a/services/tests/servicestests/src/com/android/server/accessibility/gestures/TouchExplorerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/gestures/TouchExplorerTest.java index e5005d1beed4..1af59daa9c78 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/gestures/TouchExplorerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/gestures/TouchExplorerTest.java @@ -33,6 +33,8 @@ import static com.android.server.accessibility.gestures.TouchState.STATE_DRAGGIN import static com.android.server.accessibility.gestures.TouchState.STATE_GESTURE_DETECTING; import static com.android.server.accessibility.gestures.TouchState.STATE_TOUCH_EXPLORING; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; @@ -132,10 +134,12 @@ public class TouchExplorerTest { */ private class EventCaptor implements EventStreamTransformation { List<MotionEvent> mEvents = new ArrayList<>(); + List<MotionEvent> mRawEvents = new ArrayList<>(); @Override public void onMotionEvent(MotionEvent event, MotionEvent rawEvent, int policyFlags) { mEvents.add(0, event.copy()); + mRawEvents.add(0, rawEvent.copy()); } @Override @@ -461,6 +465,45 @@ public class TouchExplorerTest { AccessibilityService.GESTURE_3_FINGER_SWIPE_DOWN); } + @Test + public void testSendHoverExitIfNeeded_lastSentHoverExit_noActionNeeded() { + // Prep TouchState so that the last injected hover event was a HOVER_EXIT + mTouchExplorer.getState().onInjectedMotionEvent(hoverExitEvent()); + + mTouchExplorer.sendHoverExitAndTouchExplorationGestureEndIfNeeded(/*policyFlags=*/0); + + assertNoCapturedEvents(); + } + + @Test + @EnableFlags(Flags.FLAG_EVENT_DISPATCHER_RAW_EVENT) + public void testSendHoverExitIfNeeded_lastSentHoverEnter_sendsHoverExit_withCorrectRawEvent() { + final MotionEvent rawEvent = downEvent(); + final MotionEvent modifiedEvent = hoverEnterEvent(); + // Use different display IDs just so that we can differentiate between the raw event and + // the modified event later during test assertions. + final int rawDisplayId = 123; + final int modifiedDisplayId = 456; + rawEvent.setDisplayId(rawDisplayId); + modifiedEvent.setDisplayId(modifiedDisplayId); + // Prep TouchState to track the last received modified and raw events + mTouchExplorer.getState().onReceivedMotionEvent(modifiedEvent, rawEvent, /*policyFlags=*/0); + // Prep TouchState so that the last injected hover event was not a HOVER_EXIT + mTouchExplorer.getState().onInjectedMotionEvent(modifiedEvent); + + mTouchExplorer.sendHoverExitAndTouchExplorationGestureEndIfNeeded(/*policyFlags=*/0); + + assertThat(getCapturedEvents().size()).isEqualTo(1); + assertThat(getCapturedRawEvents().size()).isEqualTo(1); + MotionEvent sentEvent = getCapturedEvents().get(0); + MotionEvent sentRawEvent = getCapturedRawEvents().get(0); + // TouchExplorer should send ACTION_HOVER_EXIT built from the last injected hover event + assertThat(sentEvent.getAction()).isEqualTo(ACTION_HOVER_EXIT); + assertThat(sentEvent.getDisplayId()).isEqualTo(modifiedDisplayId); + // ... while passing along the original raw (unmodified) event + assertThat(sentRawEvent.getDisplayId()).isEqualTo(rawDisplayId); + } + /** * Used to play back event data of a gesture by parsing the log into MotionEvents and sending * them to TouchExplorer. @@ -630,6 +673,10 @@ public class TouchExplorerTest { return ((EventCaptor) mCaptor).mEvents; } + private List<MotionEvent> getCapturedRawEvents() { + return ((EventCaptor) mCaptor).mRawEvents; + } + private MotionEvent cancelEvent() { mLastDownTime = SystemClock.uptimeMillis(); return fromTouchscreen( @@ -688,6 +735,20 @@ public class TouchExplorerTest { return event; } + private MotionEvent hoverEnterEvent() { + mLastDownTime = SystemClock.uptimeMillis(); + return fromTouchscreen( + MotionEvent.obtain( + mLastDownTime, mLastDownTime, ACTION_HOVER_ENTER, DEFAULT_X, DEFAULT_Y, 0)); + } + + private MotionEvent hoverExitEvent() { + mLastDownTime = SystemClock.uptimeMillis(); + return fromTouchscreen( + MotionEvent.obtain( + mLastDownTime, mLastDownTime, ACTION_HOVER_EXIT, DEFAULT_X, DEFAULT_Y, 0)); + } + private void moveEachPointers(MotionEvent event, PointF... points) { final float[] x = new float[points.length]; final float[] y = new float[points.length]; diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java index 39206dcf21ef..3b32701b5169 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java @@ -1612,7 +1612,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { ); } - public void testThrottling() { + public void disabled_testThrottling() { final ShortcutInfo si1 = makeShortcut("shortcut1"); assertTrue(mManager.setDynamicShortcuts(list(si1))); @@ -1685,7 +1685,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime()); } - public void testThrottling_rewind() { + public void disabled_testThrottling_rewind() { final ShortcutInfo si1 = makeShortcut("shortcut1"); assertTrue(mManager.setDynamicShortcuts(list(si1))); @@ -1715,7 +1715,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(3, mManager.getRemainingCallCount()); } - public void testThrottling_perPackage() { + public void disabled_testThrottling_perPackage() { final ShortcutInfo si1 = makeShortcut("shortcut1"); assertTrue(mManager.setDynamicShortcuts(list(si1))); @@ -1847,7 +1847,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { }); } - public void testThrottling_foreground() throws Exception { + public void disabled_testThrottling_foreground() throws Exception { prepareCrossProfileDataSet(); dumpsysOnLogcat("Before save & load"); diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest3.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest3.java index aad06c6d6c0e..9ca2282d1d8e 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest3.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest3.java @@ -80,7 +80,7 @@ public class ShortcutManagerTest3 extends BaseShortcutManagerTest { genPackageAddIntent(CALLING_PACKAGE, USER_10)); } - public void testSetDynamicShortcuts_noManifestShortcuts() { + public void disabled_testSetDynamicShortcuts_noManifestShortcuts() { mManager.setDynamicShortcuts(list( shortcut("s1", A1) )); @@ -171,11 +171,12 @@ public class ShortcutManagerTest3 extends BaseShortcutManagerTest { .haveRanksInOrder("ms1"); } - public void testSetDynamicShortcuts_withManifestShortcuts() { - runTestWithManifestShortcuts(() -> testSetDynamicShortcuts_noManifestShortcuts()); + public void disabled_Shortcuts_withManifestShortcuts() { + runTestWithManifestShortcuts(() -> + disabled_testSetDynamicShortcuts_noManifestShortcuts()); } - public void testAddDynamicShortcuts_noManifestShortcuts() { + public void disabled_testAddDynamicShortcuts_noManifestShortcuts() { mManager.addDynamicShortcuts(list( shortcut("s1", A1) )); @@ -264,11 +265,12 @@ public class ShortcutManagerTest3 extends BaseShortcutManagerTest { .haveIds("s1", "s2", "s4", "s5", "s10"); } - public void testAddDynamicShortcuts_withManifestShortcuts() { - runTestWithManifestShortcuts(() -> testAddDynamicShortcuts_noManifestShortcuts()); + public void disabled_testAddDynamicShortcuts_withManifestShortcuts() { + runTestWithManifestShortcuts(() -> + disabled_testAddDynamicShortcuts_noManifestShortcuts()); } - public void testUpdateShortcuts_noManifestShortcuts() { + public void disabled_testUpdateShortcuts_noManifestShortcuts() { mManager.addDynamicShortcuts(list( shortcut("s5", A1, 0), shortcut("s4", A1), @@ -374,11 +376,12 @@ public class ShortcutManagerTest3 extends BaseShortcutManagerTest { .haveIds("s3", "s2"); } - public void testUpdateShortcuts_withManifestShortcuts() { - runTestWithManifestShortcuts(() -> testUpdateShortcuts_noManifestShortcuts()); + public void disabled_testUpdateShortcuts_withManifestShortcuts() { + runTestWithManifestShortcuts(() -> + disabled_testUpdateShortcuts_noManifestShortcuts()); } - public void testDeleteDynamicShortcuts_noManifestShortcuts() { + public void disabled_testDeleteDynamicShortcuts_noManifestShortcuts() { mManager.addDynamicShortcuts(list( shortcut("s5", A1, 0), shortcut("s4", A1), @@ -435,11 +438,12 @@ public class ShortcutManagerTest3 extends BaseShortcutManagerTest { .haveIds("s2", "s4"); } - public void testDeleteDynamicShortcuts_withManifestShortcuts() { - runTestWithManifestShortcuts(() -> testDeleteDynamicShortcuts_noManifestShortcuts()); + public void disabled_testDeleteDynamicShortcuts_withManifestShortcuts() { + runTestWithManifestShortcuts(() -> + disabled_testDeleteDynamicShortcuts_noManifestShortcuts()); } - public void testDisableShortcuts_noManifestShortcuts() { + public void disabled_testDisableShortcuts_noManifestShortcuts() { mManager.addDynamicShortcuts(list( shortcut("s5", A1, 0), shortcut("s4", A1), @@ -508,8 +512,9 @@ public class ShortcutManagerTest3 extends BaseShortcutManagerTest { .haveIds("s4", "x2"); } - public void testDisableShortcuts_withManifestShortcuts() { - runTestWithManifestShortcuts(() -> testDisableShortcuts_noManifestShortcuts()); + public void disabled_testDisableShortcuts_withManifestShortcuts() { + runTestWithManifestShortcuts(() -> + disabled_testDisableShortcuts_noManifestShortcuts()); } public void testGetSharingShortcutCount() { diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java index 400d3a891a8d..5562e3d7c532 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java @@ -66,7 +66,7 @@ public class ShortcutManagerTest5 extends BaseShortcutManagerTest { mMyUserId = android.os.Process.myUserHandle().getIdentifier(); } - public void testGetPackageUid() { + public void disabled_testGetPackageUid() { assertTrue(mShortcutService.injectGetPackageUid( mMyPackage, mMyUserId) != 0); @@ -74,7 +74,7 @@ public class ShortcutManagerTest5 extends BaseShortcutManagerTest { "no.such.package", mMyUserId)); } - public void testGetPackageInfo() { + public void disabled_testGetPackageInfo() { PackageInfo pi = mShortcutService.getPackageInfo( mMyPackage, mMyUserId, /*signature*/ false); assertEquals(mMyPackage, pi.packageName); @@ -132,7 +132,7 @@ public class ShortcutManagerTest5 extends BaseShortcutManagerTest { meta.close(); } - public void testGetInstalledPackages() { + public void disabled_testGetInstalledPackages() { List<PackageInfo> apks = mShortcutService.getInstalledPackages(mMyUserId); Set<String> expectedPackages = set("com.android.settings", mMyPackage); diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest6.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest6.java index 7f7a4ae13245..306f908258d1 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest6.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest6.java @@ -26,7 +26,7 @@ import androidx.test.filters.SmallTest; @Presubmit @SmallTest public class ShortcutManagerTest6 extends BaseShortcutManagerTest { - public void testHasShortcutHostPermissionInner_with3pLauncher_complicated() { + public void disabled_testHasShortcutHostPermissionInner_with3pLauncher_complicated() { // Set the default launcher. prepareGetRoleHoldersAsUser(CALLING_PACKAGE_2, USER_10); assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_10)); diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest7.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest7.java index 86bde837bfe1..748b397abe89 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest7.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest7.java @@ -128,7 +128,7 @@ public class ShortcutManagerTest7 extends BaseShortcutManagerTest { assertEquals(1, mService.mMaxUpdatesPerInterval); } - public void testResetThrottling() throws Exception { + public void disabled_testResetThrottling() throws Exception { prepareCrossProfileDataSet(); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { @@ -149,7 +149,7 @@ public class ShortcutManagerTest7 extends BaseShortcutManagerTest { }); } - public void testResetThrottling_user_not_running() throws Exception { + public void disabled_testResetThrottling_user_not_running() throws Exception { prepareCrossProfileDataSet(); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { @@ -177,7 +177,7 @@ public class ShortcutManagerTest7 extends BaseShortcutManagerTest { }); } - public void testResetThrottling_user_running() throws Exception { + public void disabled_testResetThrottling_user_running() throws Exception { prepareCrossProfileDataSet(); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { @@ -201,7 +201,7 @@ public class ShortcutManagerTest7 extends BaseShortcutManagerTest { }); } - public void testResetAllThrottling() throws Exception { + public void disabled_testResetAllThrottling() throws Exception { prepareCrossProfileDataSet(); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { @@ -276,7 +276,7 @@ public class ShortcutManagerTest7 extends BaseShortcutManagerTest { assertNull(mService.getShortcutsForTest().get(USER_11)); } - public void testClearShortcuts() throws Exception { + public void disabled_testClearShortcuts() throws Exception { mRunningUsers.put(USER_11, true); diff --git a/telephony/java/android/telephony/PreciseDisconnectCause.java b/telephony/java/android/telephony/PreciseDisconnectCause.java index 2d650ab20802..bb9e7065b154 100644 --- a/telephony/java/android/telephony/PreciseDisconnectCause.java +++ b/telephony/java/android/telephony/PreciseDisconnectCause.java @@ -326,6 +326,13 @@ public final class PreciseDisconnectCause { @Deprecated public static final int CDMA_ACCESS_BLOCKED = 1009; + /** Call was disconnected with cause code retry over volte. */ + @FlaggedApi(Flags.FLAG_ADD_IMS_REDIAL_CODES_FOR_EMERGENCY_CALLS) + public static final int EMERGENCY_REDIAL_ON_IMS = 3001; + /** Call was disconnected with cause code retry over vowifi. */ + @FlaggedApi(Flags.FLAG_ADD_IMS_REDIAL_CODES_FOR_EMERGENCY_CALLS) + public static final int EMERGENCY_REDIAL_ON_VOWIFI = 3002; + /* OEM specific error codes. To be used by OEMs when they don't want to reveal error code which would be replaced by ERROR_UNSPECIFIED */ public static final int OEM_CAUSE_1 = 0xf001; diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java index 567314beadd3..5daa29b940bf 100644 --- a/telephony/java/android/telephony/data/ApnSetting.java +++ b/telephony/java/android/telephony/data/ApnSetting.java @@ -130,10 +130,10 @@ public class ApnSetting implements Parcelable { public static final int TYPE_RCS = ApnTypes.RCS; /** APN type for OEM_PAID networks (Automotive PANS) */ @FlaggedApi(Flags.FLAG_OEM_PAID_PRIVATE) - public static final int TYPE_OEM_PAID = 1 << 16; // TODO(b/366194627): ApnTypes.OEM_PAID; + public static final int TYPE_OEM_PAID = ApnTypes.OEM_PAID; /** APN type for OEM_PRIVATE networks (Automotive PANS) */ @FlaggedApi(Flags.FLAG_OEM_PAID_PRIVATE) - public static final int TYPE_OEM_PRIVATE = 1 << 17; // TODO(b/366194627): ApnTypes.OEM_PRIVATE; + public static final int TYPE_OEM_PRIVATE = ApnTypes.OEM_PRIVATE; /** @hide */ @IntDef(flag = true, prefix = {"TYPE_"}, value = { diff --git a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt index d75a8f433af8..40f4f1ab0791 100644 --- a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt +++ b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt @@ -314,7 +314,17 @@ class InputManagerServiceTests { } } - private fun createVirtualDisplays(count: Int): List<VirtualDisplay> { + private class AutoClosingVirtualDisplays(val displays: List<VirtualDisplay>) : AutoCloseable { + operator fun get(i: Int): VirtualDisplay = displays[i] + + override fun close() { + for (display in displays) { + display.release() + } + } + } + + private fun createVirtualDisplays(count: Int): AutoClosingVirtualDisplays { val displayManager: DisplayManager = context.getSystemService( DisplayManager::class.java ) as DisplayManager @@ -329,7 +339,7 @@ class InputManagerServiceTests { /* flags= */ 0 )) } - return virtualDisplays + return AutoClosingVirtualDisplays(virtualDisplays) } // Helper function that creates a KeyEvent with Keycode A with the given action @@ -374,50 +384,51 @@ class InputManagerServiceTests { val mockSurfaceHolder2 = mock(SurfaceHolder::class.java) `when`(mockSurfaceView2.holder).thenReturn(mockSurfaceHolder2) - val virtualDisplays = createVirtualDisplays(2) + createVirtualDisplays(2).use { virtualDisplays -> + // Simulate an InputDevice + val inputDevice = createInputDevice() - // Simulate an InputDevice - val inputDevice = createInputDevice() - - // Associate input device with display - service.addUniqueIdAssociationByDescriptor( - inputDevice.descriptor, - virtualDisplays[0].display.displayId.toString() - ) + // Associate input device with display + service.addUniqueIdAssociationByDescriptor( + inputDevice.descriptor, + virtualDisplays[0].display.displayId.toString() + ) - // Simulate 2 different KeyEvents - val downEvent = createKeycodeAEvent(inputDevice, KeyEvent.ACTION_DOWN) - val upEvent = createKeycodeAEvent(inputDevice, KeyEvent.ACTION_UP) + // Simulate 2 different KeyEvents + val downEvent = createKeycodeAEvent(inputDevice, KeyEvent.ACTION_DOWN) + val upEvent = createKeycodeAEvent(inputDevice, KeyEvent.ACTION_UP) - // Create a mock OnKeyListener object - val mockOnKeyListener = mock(OnKeyListener::class.java) + // Create a mock OnKeyListener object + val mockOnKeyListener = mock(OnKeyListener::class.java) - // Verify that the event went to Display 1 not Display 2 - service.injectInputEvent(downEvent, InputEventInjectionSync.NONE) + // Verify that the event went to Display 1 not Display 2 + service.injectInputEvent(downEvent, InputEventInjectionSync.NONE) - // Call the onKey method on the mock OnKeyListener object - mockOnKeyListener.onKey(mockSurfaceView1, /* keyCode= */ KeyEvent.KEYCODE_A, downEvent) - mockOnKeyListener.onKey(mockSurfaceView2, /* keyCode= */ KeyEvent.KEYCODE_A, upEvent) + // Call the onKey method on the mock OnKeyListener object + mockOnKeyListener.onKey(mockSurfaceView1, /* keyCode= */ KeyEvent.KEYCODE_A, downEvent) + mockOnKeyListener.onKey(mockSurfaceView2, /* keyCode= */ KeyEvent.KEYCODE_A, upEvent) - // Verify that the onKey method was called with the expected arguments - verify(mockOnKeyListener).onKey(mockSurfaceView1, KeyEvent.KEYCODE_A, downEvent) - verify(mockOnKeyListener, never()).onKey(mockSurfaceView2, KeyEvent.KEYCODE_A, downEvent) + // Verify that the onKey method was called with the expected arguments + verify(mockOnKeyListener).onKey(mockSurfaceView1, KeyEvent.KEYCODE_A, downEvent) + verify(mockOnKeyListener, never()) + .onKey(mockSurfaceView2, KeyEvent.KEYCODE_A, downEvent) - // Remove association - service.removeUniqueIdAssociationByDescriptor(inputDevice.descriptor) + // Remove association + service.removeUniqueIdAssociationByDescriptor(inputDevice.descriptor) - // Associate with Display 2 - service.addUniqueIdAssociationByDescriptor( - inputDevice.descriptor, - virtualDisplays[1].display.displayId.toString() - ) + // Associate with Display 2 + service.addUniqueIdAssociationByDescriptor( + inputDevice.descriptor, + virtualDisplays[1].display.displayId.toString() + ) - // Simulate a KeyEvent - service.injectInputEvent(upEvent, InputEventInjectionSync.NONE) + // Simulate a KeyEvent + service.injectInputEvent(upEvent, InputEventInjectionSync.NONE) - // Verify that the event went to Display 2 not Display 1 - verify(mockOnKeyListener).onKey(mockSurfaceView2, KeyEvent.KEYCODE_A, upEvent) - verify(mockOnKeyListener, never()).onKey(mockSurfaceView1, KeyEvent.KEYCODE_A, upEvent) + // Verify that the event went to Display 2 not Display 1 + verify(mockOnKeyListener).onKey(mockSurfaceView2, KeyEvent.KEYCODE_A, upEvent) + verify(mockOnKeyListener, never()).onKey(mockSurfaceView1, KeyEvent.KEYCODE_A, upEvent) + } } @Test @@ -436,50 +447,51 @@ class InputManagerServiceTests { val mockSurfaceHolder2 = mock(SurfaceHolder::class.java) `when`(mockSurfaceView2.holder).thenReturn(mockSurfaceHolder2) - val virtualDisplays = createVirtualDisplays(2) + createVirtualDisplays(2).use { virtualDisplays -> + // Simulate an InputDevice + val inputDevice = createInputDevice() - // Simulate an InputDevice - val inputDevice = createInputDevice() - - // Associate input device with display - service.addUniqueIdAssociationByPort( - inputDevice.name, - virtualDisplays[0].display.displayId.toString() - ) + // Associate input device with display + service.addUniqueIdAssociationByPort( + inputDevice.name, + virtualDisplays[0].display.displayId.toString() + ) - // Simulate 2 different KeyEvents - val downEvent = createKeycodeAEvent(inputDevice, KeyEvent.ACTION_DOWN) - val upEvent = createKeycodeAEvent(inputDevice, KeyEvent.ACTION_UP) + // Simulate 2 different KeyEvents + val downEvent = createKeycodeAEvent(inputDevice, KeyEvent.ACTION_DOWN) + val upEvent = createKeycodeAEvent(inputDevice, KeyEvent.ACTION_UP) - // Create a mock OnKeyListener object - val mockOnKeyListener = mock(OnKeyListener::class.java) + // Create a mock OnKeyListener object + val mockOnKeyListener = mock(OnKeyListener::class.java) - // Verify that the event went to Display 1 not Display 2 - service.injectInputEvent(downEvent, InputEventInjectionSync.NONE) + // Verify that the event went to Display 1 not Display 2 + service.injectInputEvent(downEvent, InputEventInjectionSync.NONE) - // Call the onKey method on the mock OnKeyListener object - mockOnKeyListener.onKey(mockSurfaceView1, /* keyCode= */ KeyEvent.KEYCODE_A, downEvent) - mockOnKeyListener.onKey(mockSurfaceView2, /* keyCode= */ KeyEvent.KEYCODE_A, upEvent) + // Call the onKey method on the mock OnKeyListener object + mockOnKeyListener.onKey(mockSurfaceView1, /* keyCode= */ KeyEvent.KEYCODE_A, downEvent) + mockOnKeyListener.onKey(mockSurfaceView2, /* keyCode= */ KeyEvent.KEYCODE_A, upEvent) - // Verify that the onKey method was called with the expected arguments - verify(mockOnKeyListener).onKey(mockSurfaceView1, KeyEvent.KEYCODE_A, downEvent) - verify(mockOnKeyListener, never()).onKey(mockSurfaceView2, KeyEvent.KEYCODE_A, downEvent) + // Verify that the onKey method was called with the expected arguments + verify(mockOnKeyListener).onKey(mockSurfaceView1, KeyEvent.KEYCODE_A, downEvent) + verify(mockOnKeyListener, never()) + .onKey(mockSurfaceView2, KeyEvent.KEYCODE_A, downEvent) - // Remove association - service.removeUniqueIdAssociationByPort(inputDevice.name) + // Remove association + service.removeUniqueIdAssociationByPort(inputDevice.name) - // Associate with Display 2 - service.addUniqueIdAssociationByPort( - inputDevice.name, - virtualDisplays[1].display.displayId.toString() - ) + // Associate with Display 2 + service.addUniqueIdAssociationByPort( + inputDevice.name, + virtualDisplays[1].display.displayId.toString() + ) - // Simulate a KeyEvent - service.injectInputEvent(upEvent, InputEventInjectionSync.NONE) + // Simulate a KeyEvent + service.injectInputEvent(upEvent, InputEventInjectionSync.NONE) - // Verify that the event went to Display 2 not Display 1 - verify(mockOnKeyListener).onKey(mockSurfaceView2, KeyEvent.KEYCODE_A, upEvent) - verify(mockOnKeyListener, never()).onKey(mockSurfaceView1, KeyEvent.KEYCODE_A, upEvent) + // Verify that the event went to Display 2 not Display 1 + verify(mockOnKeyListener).onKey(mockSurfaceView2, KeyEvent.KEYCODE_A, upEvent) + verify(mockOnKeyListener, never()).onKey(mockSurfaceView1, KeyEvent.KEYCODE_A, upEvent) + } } @Test diff --git a/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt b/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt index 9e0f7347943d..bc0b7a5c816c 100644 --- a/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt +++ b/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt @@ -29,6 +29,7 @@ import android.view.MotionEvent import androidx.test.platform.app.InstrumentationRegistry import com.android.cts.input.BatchedEventSplitter import com.android.cts.input.CaptureEventActivity +import com.android.cts.input.DebugInputRule import com.android.cts.input.InputJsonParser import com.android.cts.input.VirtualDisplayActivityScenario import com.android.cts.input.inputeventmatchers.isResampled @@ -97,6 +98,10 @@ class UinputRecordingIntegrationTests { private lateinit var instrumentation: Instrumentation private lateinit var parser: InputJsonParser + + @get:Rule + val debugInputRule = DebugInputRule() + @get:Rule val testName = TestName() @@ -109,6 +114,7 @@ class UinputRecordingIntegrationTests { parser = InputJsonParser(instrumentation.context) } + @DebugInputRule.DebugInput(bug = 389901828) @Test fun testEvemuRecording() { VirtualDisplayActivityScenario.AutoClose<CaptureEventActivity>( diff --git a/tools/lint/framework/checks/src/main/java/com/google/android/lint/AndroidFrameworkIssueRegistry.kt b/tools/lint/framework/checks/src/main/java/com/google/android/lint/AndroidFrameworkIssueRegistry.kt index af753e5963a3..b62843ca3ff4 100644 --- a/tools/lint/framework/checks/src/main/java/com/google/android/lint/AndroidFrameworkIssueRegistry.kt +++ b/tools/lint/framework/checks/src/main/java/com/google/android/lint/AndroidFrameworkIssueRegistry.kt @@ -19,6 +19,7 @@ package com.google.android.lint import com.android.tools.lint.client.api.IssueRegistry import com.android.tools.lint.client.api.Vendor import com.android.tools.lint.detector.api.CURRENT_API +import com.google.android.lint.multiuser.PendingIntentGetActivityDetector import com.google.android.lint.parcel.SaferParcelChecker import com.google.auto.service.AutoService @@ -40,6 +41,7 @@ class AndroidFrameworkIssueRegistry : IssueRegistry() { PermissionMethodDetector.ISSUE_PERMISSION_METHOD_USAGE, PermissionMethodDetector.ISSUE_CAN_BE_PERMISSION_METHOD, FeatureAutomotiveDetector.ISSUE, + PendingIntentGetActivityDetector.ISSUE_PENDING_INTENT_GET_ACTIVITY, ) override val api: Int diff --git a/tools/lint/framework/checks/src/main/java/com/google/android/lint/multiuser/PendingIntentGetActivityDetector.kt b/tools/lint/framework/checks/src/main/java/com/google/android/lint/multiuser/PendingIntentGetActivityDetector.kt new file mode 100644 index 000000000000..b9f22ebfa8ec --- /dev/null +++ b/tools/lint/framework/checks/src/main/java/com/google/android/lint/multiuser/PendingIntentGetActivityDetector.kt @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.google.android.lint.multiuser + +import com.android.tools.lint.detector.api.Category +import com.android.tools.lint.detector.api.Detector +import com.android.tools.lint.detector.api.Implementation +import com.android.tools.lint.detector.api.Issue +import com.android.tools.lint.detector.api.JavaContext +import com.android.tools.lint.detector.api.Scope +import com.android.tools.lint.detector.api.Severity +import com.android.tools.lint.detector.api.SourceCodeScanner +import com.intellij.psi.PsiMethod +import java.util.EnumSet +import org.jetbrains.uast.UCallExpression + +/** + * Detector for flagging potential multiuser issues in `PendingIntent.getActivity()` calls. + * + * This detector checks for calls to `PendingIntent#getActivity()` and + * reports a warning if such a call is found, suggesting that the + * default user 0 context might not be the right one. + */ +class PendingIntentGetActivityDetector : Detector(), SourceCodeScanner { + + companion object { + + val description = """Flags potential multiuser issue in PendingIntent.getActivity() calls.""" + + val EXPLANATION = + """ + **Problem:** + + Calling `PendingIntent.getActivity()` in the `system_server` often accidentally uses the user 0 context. Moreover, since there's no explicit user parameter in the `getActivity` method, it can be hard to tell which user the `PendingIntent` activity is associated with, making the code error-prone and less readable. + + **Solution:** + + Always use the user aware methods to refer the correct user context. You can achieve this by: + + * **Using `PendingIntent.getActivityAsUser(...)`:** This API allows you to explicitly specify the user for the activity. + + ```java + PendingIntent.getActivityAsUser( + mContext, /*requestCode=*/0, intent, + PendingIntent.FLAG_IMMUTABLE, /*options=*/null, + UserHandle.of(mUserId)); + ``` + + **When to Ignore this Warning:** + + You can safely ignore this warning if you are certain that: + + * You've confirmed that the `PendingIntent` activity you're targeting is the correct one and is **rightly** associated with the context parameter passed into the `PendingIntent.getActivity` method. + + **Note:** If you are unsure about the user context, it's best to err on the side of caution and explicitly specify the user using the method specified above. + + **For any further questions, please reach out to go/multiuser-help.** + """.trimIndent() + + val ISSUE_PENDING_INTENT_GET_ACTIVITY: Issue = + Issue.create( + id = "PendingIntent#getActivity", + briefDescription = description, + explanation = EXPLANATION, + category = Category.SECURITY, + priority = 8, + severity = Severity.WARNING, + implementation = + Implementation( + PendingIntentGetActivityDetector::class.java, + EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES), + ), + ) + } + + override fun getApplicableMethodNames() = listOf("getActivity") + + override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) { + // Check if the method call is PendingIntent.getActivity + if ( + context.evaluator.isMemberInClass(method, "android.app.PendingIntent") && + method.name == "getActivity" + ) { + context.report( + ISSUE_PENDING_INTENT_GET_ACTIVITY, + node, + context.getLocation(node), + "Using `PendingIntent.getActivity(...)` might not be multiuser-aware. " + + "Consider using the user aware method `PendingIntent.getActivityAsUser(...)`.", + ) + } + } +} diff --git a/tools/lint/framework/checks/src/test/java/com/google/android/lint/multiuser/PendingIntentGetActivityDetectorTest.kt b/tools/lint/framework/checks/src/test/java/com/google/android/lint/multiuser/PendingIntentGetActivityDetectorTest.kt new file mode 100644 index 000000000000..401055055232 --- /dev/null +++ b/tools/lint/framework/checks/src/test/java/com/google/android/lint/multiuser/PendingIntentGetActivityDetectorTest.kt @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.google.android.lint.multiuser + +import com.android.tools.lint.checks.infrastructure.LintDetectorTest +import com.android.tools.lint.checks.infrastructure.TestFile +import com.android.tools.lint.checks.infrastructure.TestLintTask +import com.android.tools.lint.detector.api.Detector +import com.android.tools.lint.detector.api.Issue + +@Suppress("UnstableApiUsage") +class PendingIntentGetActivityDetectorTest : LintDetectorTest() { + + override fun getDetector(): Detector = PendingIntentGetActivityDetector() + + override fun getIssues(): List<Issue> = + listOf(PendingIntentGetActivityDetector.ISSUE_PENDING_INTENT_GET_ACTIVITY) + + override fun lint(): TestLintTask = super.lint().allowMissingSdk(true) + + fun testPendingIntentGetActivity() { + lint() + .files( + java( + """ + package test.pkg; + + import android.app.PendingIntent; + import android.content.Context; + import android.content.Intent; + + public class TestClass { + private Context mContext; + + public void testMethod(Intent intent) { + PendingIntent.getActivity( + mContext, /*requestCode=*/0, intent, + PendingIntent.FLAG_IMMUTABLE, /*options=*/null + ); + } + } + """ + ) + .indented(), + *stubs, + ) + .issues(PendingIntentGetActivityDetector.ISSUE_PENDING_INTENT_GET_ACTIVITY) + .run() + .expect( + """ + src/test/pkg/TestClass.java:11: Warning: Using PendingIntent.getActivity(...) might not be multiuser-aware. Consider using the user aware method PendingIntent.getActivityAsUser(...). [PendingIntent#getActivity] + PendingIntent.getActivity( + ^ + 0 errors, 1 warnings + """ + ) + } + + fun testPendingIntentGetActivityAsUser() { + lint() + .files( + java( + """ + package test.pkg; + + import android.app.PendingIntent; + import android.content.Context; + import android.content.Intent; + import android.os.UserHandle; + + public class TestClass { + private Context mContext; + + public void testMethod(Intent intent) { + PendingIntent.getActivityAsUser( + mContext, /*requestCode=*/0, intent, + 0, /*options=*/null, + UserHandle.CURRENT + ); + } + } + """ + ) + .indented(), + *stubs, + ) + .issues(PendingIntentGetActivityDetector.ISSUE_PENDING_INTENT_GET_ACTIVITY) + .run() + .expectClean() + } + + private val pendingIntentStub: TestFile = + java( + """ + package android.app; + + import android.content.Context; + import android.content.Intent; + import android.os.UserHandle; + + public class PendingIntent { + public static boolean getActivity(Context context, int requestCode, Intent intent, int flags) { + return true; + } + + public static boolean getActivityAsUser( + Context context, + int requestCode, + Intent intent, + int flags, + UserHandle userHandle + ) { + return true; + } + } + """ + ) + + private val contxtStub: TestFile = + java( + """ + package android.content; + + import android.os.UserHandle; + + public class Context { + + public Context createContextAsUser(UserHandle userHandle, int flags) { + return this; + } + } + + """ + ) + + private val userHandleStub: TestFile = + java( + """ + package android.os; + + public class UserHandle { + + } + + """ + ) + + private val intentStub: TestFile = + java( + """ + package android.content; + + public class Intent { + + } + """ + ) + + private val stubs = arrayOf(pendingIntentStub, contxtStub, userHandleStub, intentStub) +} |