diff options
687 files changed, 12637 insertions, 5889 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index a60fd117fd17..e724ab885c39 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -12676,21 +12676,27 @@ package android.security { package android.security.advancedprotection { @FlaggedApi("android.security.aapm_api") public final class AdvancedProtectionFeature implements android.os.Parcelable { - ctor public AdvancedProtectionFeature(int); + ctor public AdvancedProtectionFeature(@NonNull String); method public int describeContents(); - method public int getId(); + method @NonNull public String getId(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.security.advancedprotection.AdvancedProtectionFeature> CREATOR; } @FlaggedApi("android.security.aapm_api") public final class AdvancedProtectionManager { + method @NonNull public android.content.Intent createSupportIntent(@NonNull String, @Nullable String); method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ADVANCED_PROTECTION_MODE) public java.util.List<android.security.advancedprotection.AdvancedProtectionFeature> getAdvancedProtectionFeatures(); method @RequiresPermission(android.Manifest.permission.MANAGE_ADVANCED_PROTECTION_MODE) public void setAdvancedProtectionEnabled(boolean); - field public static final int FEATURE_ID_DISALLOW_CELLULAR_2G = 0; // 0x0 - field public static final int FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES = 1; // 0x1 - field public static final int FEATURE_ID_DISALLOW_USB = 2; // 0x2 - field public static final int FEATURE_ID_DISALLOW_WEP = 3; // 0x3 - field public static final int FEATURE_ID_ENABLE_MTE = 4; // 0x4 + field @FlaggedApi("android.security.aapm_api") public static final String ACTION_SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG = "android.security.advancedprotection.action.SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG"; + field public static final String EXTRA_SUPPORT_DIALOG_FEATURE = "android.security.advancedprotection.extra.SUPPORT_DIALOG_FEATURE"; + field public static final String EXTRA_SUPPORT_DIALOG_TYPE = "android.security.advancedprotection.extra.SUPPORT_DIALOG_TYPE"; + field public static final String FEATURE_ID_DISALLOW_CELLULAR_2G = "android.security.advancedprotection.feature_disallow_2g"; + field public static final String FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES = "android.security.advancedprotection.feature_disallow_install_unknown_sources"; + field public static final String FEATURE_ID_DISALLOW_USB = "android.security.advancedprotection.feature_disallow_usb"; + field public static final String FEATURE_ID_DISALLOW_WEP = "android.security.advancedprotection.feature_disallow_wep"; + field public static final String FEATURE_ID_ENABLE_MTE = "android.security.advancedprotection.feature_enable_mte"; + field public static final String SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION = "android.security.advancedprotection.type_blocked_interaction"; + field public static final String SUPPORT_DIALOG_TYPE_DISABLED_SETTING = "android.security.advancedprotection.type_disabled_setting"; } } diff --git a/core/api/test-current.txt b/core/api/test-current.txt index f98fb4642bd1..ed8042d45243 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -4136,6 +4136,7 @@ package android.view.inputmethod { method @RequiresPermission(android.Manifest.permission.TEST_INPUT_METHOD) public boolean isInputMethodPickerShown(); method @NonNull @RequiresPermission(value=android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional=true) public boolean isStylusHandwritingAvailableAsUser(@NonNull android.os.UserHandle); method @RequiresPermission(android.Manifest.permission.TEST_INPUT_METHOD) public void setStylusWindowIdleTimeoutForTest(long); + method @RequiresPermission(android.Manifest.permission.TEST_INPUT_METHOD) public boolean shouldShowImeSwitcherButtonForTest(); field public static final long CLEAR_SHOW_FORCED_FLAG_WHEN_LEAVING = 214016041L; // 0xcc1a029L } diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java index 4db3727e3de2..0e459027102e 100644 --- a/core/java/android/app/BroadcastOptions.java +++ b/core/java/android/app/BroadcastOptions.java @@ -38,6 +38,7 @@ import android.os.BundleMerger; import android.os.PowerExemptionManager; import android.os.PowerExemptionManager.ReasonCode; import android.os.PowerExemptionManager.TempAllowListType; +import android.os.Process; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -76,6 +77,7 @@ public class BroadcastOptions extends ComponentOptions { FLAG_IS_ALARM_BROADCAST, FLAG_SHARE_IDENTITY, FLAG_INTERACTIVE, + FLAG_DEBUG_LOG, }) @Retention(RetentionPolicy.SOURCE) public @interface Flags {} @@ -86,6 +88,7 @@ public class BroadcastOptions extends ComponentOptions { private static final int FLAG_IS_ALARM_BROADCAST = 1 << 3; private static final int FLAG_SHARE_IDENTITY = 1 << 4; private static final int FLAG_INTERACTIVE = 1 << 5; + private static final int FLAG_DEBUG_LOG = 1 << 6; /** * Change ID which is invalid. @@ -1082,6 +1085,34 @@ public class BroadcastOptions extends ComponentOptions { } /** + * If enabled, additional debug messages for broadcast delivery will be logged. + * + * <p> This will only take effect when used by {@link Process#SHELL_UID} + * or {@link Process#ROOT_UID} or by apps under instrumentation. + * + * @hide + */ + @NonNull + public BroadcastOptions setDebugLogEnabled(boolean enabled) { + if (enabled) { + mFlags |= FLAG_DEBUG_LOG; + } else { + mFlags &= ~FLAG_DEBUG_LOG; + } + return this; + } + + /** + * @return if additional debug messages for broadcast delivery are enabled. + * + * @see #setDebugLogEnabled(boolean) + * @hide + */ + public boolean isDebugLogEnabled() { + return (mFlags & FLAG_DEBUG_LOG) != 0; + } + + /** * Returns the created options as a Bundle, which can be passed to * {@link android.content.Context#sendBroadcast(android.content.Intent) * Context.sendBroadcast(Intent)} and related methods. diff --git a/core/java/android/app/IApplicationStartInfoCompleteListener.aidl b/core/java/android/app/IApplicationStartInfoCompleteListener.aidl index 0f0d9198234f..f7e5f18c6170 100644 --- a/core/java/android/app/IApplicationStartInfoCompleteListener.aidl +++ b/core/java/android/app/IApplicationStartInfoCompleteListener.aidl @@ -25,6 +25,6 @@ import android.app.ApplicationStartInfo; * * @hide */ -interface IApplicationStartInfoCompleteListener { +oneway interface IApplicationStartInfoCompleteListener { void onApplicationStartInfoComplete(in ApplicationStartInfo applicationStartInfo); } diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index a6c1a57a8131..0451ac0d6897 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -270,6 +270,6 @@ interface INotificationManager int[] getAllowedAdjustmentKeyTypes(); void setAssistantAdjustmentKeyTypeState(int type, boolean enabled); - String[] getTypeAdjustmentDeniedPackages(); - void setTypeAdjustmentForPackageState(String pkg, boolean enabled); + int[] getAllowedAdjustmentKeyTypesForPackage(String pkg); + void setAssistantAdjustmentKeyTypeStateForPackage(String pkg, int type, boolean enabled); } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 2da71471488c..08bd854525ec 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -768,6 +768,10 @@ public class NotificationManager { INotificationManager service = service(); String sender = mContext.getPackageName(); + if (discardNotify(mContext.getUser(), targetPackage, tag, id, notification)) { + return; + } + try { if (localLOGV) Log.v(TAG, sender + ": notify(" + id + ", " + notification + ")"); service.enqueueNotificationWithTag(targetPackage, sender, tag, id, @@ -918,6 +922,10 @@ public class NotificationManager { * @param id An identifier for this notification. */ public void cancelAsPackage(@NonNull String targetPackage, @Nullable String tag, int id) { + if (discardCancel(mContext.getUser(), targetPackage, tag, id)) { + return; + } + INotificationManager service = service(); try { service.cancelNotificationWithTag(targetPackage, mContext.getOpPackageName(), @@ -981,16 +989,20 @@ public class NotificationManager { */ public void cancelAll() { + String pkg = mContext.getPackageName(); + UserHandle user = mContext.getUser(); + if (Flags.nmBinderPerfThrottleNotify()) { synchronized (mThrottleLock) { for (NotificationKey key : mKnownNotifications.snapshot().keySet()) { - mKnownNotifications.put(key, KNOWN_STATUS_CANCELLED); + if (key.pkg.equals(pkg) && key.user.equals(user)) { + mKnownNotifications.put(key, KNOWN_STATUS_CANCELLED); + } } } } INotificationManager service = service(); - String pkg = mContext.getPackageName(); if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); try { service.cancelAllNotifications(pkg, mContext.getUserId()); @@ -1014,7 +1026,7 @@ public class NotificationManager { public void setNotificationDelegate(@Nullable String delegate) { INotificationManager service = service(); String pkg = mContext.getPackageName(); - if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); + if (localLOGV) Log.v(TAG, pkg + ": setNotificationDelegate()"); try { service.setNotificationDelegate(pkg, delegate); } catch (RemoteException e) { @@ -1974,10 +1986,12 @@ public class NotificationManager { * @hide */ @FlaggedApi(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) - public void setTypeAdjustmentForPackageState(@NonNull String pkg, boolean enabled) { + public void setAssistantAdjustmentKeyTypeStateForPackage(@NonNull String pkg, + @Adjustment.Types int type, + boolean enabled) { INotificationManager service = service(); try { - service.setTypeAdjustmentForPackageState(pkg, enabled); + service.setAssistantAdjustmentKeyTypeStateForPackage(pkg, type, enabled); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl index 55957bf887f8..7f149259c9c8 100644 --- a/core/java/android/content/pm/ILauncherApps.aidl +++ b/core/java/android/content/pm/ILauncherApps.aidl @@ -83,8 +83,6 @@ interface ILauncherApps { ParceledListSlice getShortcuts(String callingPackage, in ShortcutQueryWrapper query, in UserHandle user); - void getShortcutsAsync(String callingPackage, in ShortcutQueryWrapper query, - in UserHandle user, in AndroidFuture<List<ShortcutInfo>> cb); void pinShortcuts(String callingPackage, String packageName, in List<String> shortcutIds, in UserHandle user); boolean startShortcut(String callingPackage, String packageName, String featureId, String id, diff --git a/core/java/android/content/pm/IShortcutService.aidl b/core/java/android/content/pm/IShortcutService.aidl index 86087cb0c0ef..371f6459da6d 100644 --- a/core/java/android/content/pm/IShortcutService.aidl +++ b/core/java/android/content/pm/IShortcutService.aidl @@ -21,8 +21,6 @@ import android.content.IntentSender; import android.content.pm.ParceledListSlice; import android.content.pm.ShortcutInfo; -import com.android.internal.infra.AndroidFuture; - /** {@hide} */ interface IShortcutService { @@ -38,11 +36,11 @@ interface IShortcutService { boolean updateShortcuts(String packageName, in ParceledListSlice shortcuts, int userId); - void requestPinShortcut(String packageName, in ShortcutInfo shortcut, - in IntentSender resultIntent, int userId, in AndroidFuture<String> ret); + boolean requestPinShortcut(String packageName, in ShortcutInfo shortcut, + in IntentSender resultIntent, int userId); - void createShortcutResultIntent(String packageName, in ShortcutInfo shortcut, int userId, - in AndroidFuture<Intent> ret); + Intent createShortcutResultIntent(String packageName, in ShortcutInfo shortcut, + int userId); void disableShortcuts(String packageName, in List<String> shortcutIds, CharSequence disabledMessage, int disabledMessageResId, int userId); diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 26b835689b67..a0c0f122497f 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -464,26 +464,26 @@ public class LauncherApps { public static final int FLAG_GET_KEY_FIELDS_ONLY = 1 << 2; /** - * Includes shortcuts from persistence layer in the search result. + * Populate the persons field in the result. See {@link ShortcutInfo#getPersons()}. * - * <p>The caller should make the query on a worker thread since accessing persistence layer - * is considered asynchronous. + * <p>The caller must have the system {@code ACCESS_SHORTCUTS} permission. * * @hide */ @SystemApi - public static final int FLAG_GET_PERSISTED_DATA = 1 << 12; + @RequiresPermission(android.Manifest.permission.ACCESS_SHORTCUTS) + public static final int FLAG_GET_PERSONS_DATA = 1 << 11; /** - * Populate the persons field in the result. See {@link ShortcutInfo#getPersons()}. + * Includes shortcuts from persistence layer in the search result. * - * <p>The caller must have the system {@code ACCESS_SHORTCUTS} permission. + * <p>The caller should make the query on a worker thread since accessing persistence layer + * is considered asynchronous. * * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.ACCESS_SHORTCUTS) - public static final int FLAG_GET_PERSONS_DATA = 1 << 11; + public static final int FLAG_GET_PERSISTED_DATA = 1 << 12; /** @hide */ @IntDef(flag = true, prefix = { "FLAG_" }, value = { @@ -1500,9 +1500,6 @@ public class LauncherApps { @NonNull UserHandle user) { logErrorForInvalidProfileAccess(user); try { - if ((query.mQueryFlags & ShortcutQuery.FLAG_GET_PERSISTED_DATA) != 0) { - return getShortcutsBlocked(query, user); - } // Note this is the only case we need to update the disabled message for shortcuts // that weren't restored. // The restore problem messages are only shown by the user, and publishers will never @@ -1517,22 +1514,6 @@ public class LauncherApps { } } - private List<ShortcutInfo> getShortcutsBlocked(@NonNull ShortcutQuery query, - @NonNull UserHandle user) { - logErrorForInvalidProfileAccess(user); - final AndroidFuture<List<ShortcutInfo>> future = new AndroidFuture<>(); - future.thenApply(this::maybeUpdateDisabledMessage); - try { - mService.getShortcutsAsync(mContext.getPackageName(), - new ShortcutQueryWrapper(query), user, future); - return future.get(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException(e); - } - } - /** * @hide // No longer used. Use getShortcuts() instead. Kept for unit tests. */ diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index cd62573f6e4e..d64ef75a8f7c 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -3617,7 +3617,9 @@ public class PackageInstaller { * automatically fetched and installed when installing an app that wants to use these * dependencies. * - * <p> This feature is enabled by default. + * <p> This feature is enabled by default. Note that in the case of a multi-package + * installation session, no dependencies will be automatically installed even if this field + * is set to true. * * @param enableAutoInstallDependencies {@code true} to enable auto-installation of missing * SDK or static shared library dependencies, @@ -4574,6 +4576,9 @@ public class PackageInstaller { * Check whether missing SDK or static shared library dependencies should be automatically * fetched and installed when installing an app that wants to use these dependencies. * + * <p> Note that in the case of a multi-package installation session, no dependencies will + * be automatically installed even if this method returns true. + * * @return true if the dependencies will be auto-installed, false otherwise. */ @FlaggedApi(Flags.FLAG_SDK_DEPENDENCY_INSTALLER) diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java index 3514914b1d86..683f312fd21b 100644 --- a/core/java/android/content/pm/ShortcutManager.java +++ b/core/java/android/content/pm/ShortcutManager.java @@ -44,7 +44,6 @@ import android.os.RemoteException; import android.os.ServiceManager; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.infra.AndroidFuture; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -598,10 +597,8 @@ public class ShortcutManager { public boolean requestPinShortcut(@NonNull ShortcutInfo shortcut, @Nullable IntentSender resultIntent) { try { - AndroidFuture<String> ret = new AndroidFuture<>(); - mService.requestPinShortcut(mContext.getPackageName(), shortcut, resultIntent, - injectMyUserId(), ret); - return Boolean.parseBoolean(getFutureOrThrow(ret)); + return mService.requestPinShortcut(mContext.getPackageName(), shortcut, resultIntent, + injectMyUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -626,11 +623,9 @@ public class ShortcutManager { */ @WorkerThread public Intent createShortcutResultIntent(@NonNull ShortcutInfo shortcut) { - final AndroidFuture<Intent> ret = new AndroidFuture<>(); try { - mService.createShortcutResultIntent(mContext.getPackageName(), - shortcut, injectMyUserId(), ret); - Intent result = getFutureOrThrow(ret); + Intent result = mService.createShortcutResultIntent(mContext.getPackageName(), + shortcut, injectMyUserId()); if (result != null) { result.prepareToEnterProcess(LOCAL_FLAG_FROM_SYSTEM, mContext.getAttributionSource()); @@ -793,21 +788,4 @@ public class ShortcutManager { throw e.rethrowFromSystemServer(); } } - - private static <T> T getFutureOrThrow(@NonNull AndroidFuture<T> future) { - try { - return future.get(); - } catch (Throwable e) { - if (e instanceof ExecutionException) { - e = e.getCause(); - } - if (e instanceof RuntimeException) { - throw (RuntimeException) e; - } - if (e instanceof Error) { - throw (Error) e; - } - throw new RuntimeException(e); - } - } } diff --git a/core/java/android/content/pm/ShortcutServiceInternal.java b/core/java/android/content/pm/ShortcutServiceInternal.java index c811a47e5b05..d38b2f0a727a 100644 --- a/core/java/android/content/pm/ShortcutServiceInternal.java +++ b/core/java/android/content/pm/ShortcutServiceInternal.java @@ -52,19 +52,6 @@ public abstract class ShortcutServiceInternal { @Nullable List<LocusId> locusIds, @Nullable ComponentName componentName, @ShortcutQuery.QueryFlags int flags, int userId, int callingPid, int callingUid); - /** - * Retrieves shortcuts asynchronously. Query will go through persistence layer (thus making the - * call async) if querying by shortcutIds in a specific package; otherwise it's effectively the - * same as calling {@link #getShortcuts}. - */ - public abstract void - getShortcutsAsync(int launcherUserId, - @NonNull String callingPackage, long changedSince, - @Nullable String packageName, @Nullable List<String> shortcutIds, - @Nullable List<LocusId> locusIds, @Nullable ComponentName componentName, - @ShortcutQuery.QueryFlags int flags, int userId, int callingPid, int callingUid, - AndroidFuture<List<ShortcutInfo>> cb); - public abstract boolean isPinnedByCaller(int launcherUserId, @NonNull String callingPackage, @NonNull String packageName, @NonNull String id, int userId); @@ -78,14 +65,6 @@ public abstract class ShortcutServiceInternal { @NonNull String packageName, @NonNull String shortcutId, int userId, int callingPid, int callingUid); - /** - * Retrieves the intents from a specified shortcut asynchronously. - */ - public abstract void createShortcutIntentsAsync( - int launcherUserId, @NonNull String callingPackage, - @NonNull String packageName, @NonNull String shortcutId, int userId, - int callingPid, int callingUid, @NonNull AndroidFuture<Intent[]> cb); - public abstract void addListener(@NonNull ShortcutChangeListener listener); public abstract void addShortcutChangeCallback( @@ -108,13 +87,6 @@ public abstract class ShortcutServiceInternal { @NonNull String callingPackage, @NonNull String packageName, @NonNull String shortcutId, int userId); - /** - * Retrieves a file descriptor from the icon in a specified shortcut asynchronously. - */ - public abstract void getShortcutIconFdAsync(int launcherUserId, @NonNull String callingPackage, - @NonNull String packageName, @NonNull String shortcutId, int userId, - @NonNull AndroidFuture<ParcelFileDescriptor> cb); - public abstract boolean hasShortcutHostPermission(int launcherUserId, @NonNull String callingPackage, int callingPid, int callingUid); @@ -155,14 +127,6 @@ public abstract class ShortcutServiceInternal { public abstract String getShortcutIconUri(int launcherUserId, @NonNull String launcherPackage, @NonNull String packageName, @NonNull String shortcutId, int userId); - /** - * Retrieves the icon Uri of the shortcut asynchronously, and grants Uri read permission to the - * caller. - */ - public abstract void getShortcutIconUriAsync(int launcherUserId, - @NonNull String launcherPackage, @NonNull String packageName, - @NonNull String shortcutId, int userId, @NonNull AndroidFuture<String> cb); - public abstract boolean isSharingShortcut(int callingUserId, @NonNull String callingPackage, @NonNull String packageName, @NonNull String shortcutId, int userId, @NonNull IntentFilter filter); diff --git a/core/java/android/content/pm/multiuser.aconfig b/core/java/android/content/pm/multiuser.aconfig index f29e2e8f10a3..2ad9660534a6 100644 --- a/core/java/android/content/pm/multiuser.aconfig +++ b/core/java/android/content/pm/multiuser.aconfig @@ -211,6 +211,16 @@ flag { } flag { + name: "place_add_user_dialog_within_activity" + namespace: "multiuser" + description: "Display dialog within activity to make it traversable by Accessibility" + bug: "383034393" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "property_invalidated_cache_bypass_mismatched_uids" namespace: "multiuser" description: "Bypass the cache when the process UID does not match the binder UID." diff --git a/core/java/android/hardware/display/DisplayTopology.java b/core/java/android/hardware/display/DisplayTopology.java index ba5dfc094afb..0e2c05f92e7c 100644 --- a/core/java/android/hardware/display/DisplayTopology.java +++ b/core/java/android/hardware/display/DisplayTopology.java @@ -27,10 +27,12 @@ import android.graphics.PointF; import android.graphics.RectF; import android.os.Parcel; import android.os.Parcelable; +import android.util.DisplayMetrics; import android.util.IndentingPrintWriter; import android.util.MathUtils; import android.util.Pair; import android.util.Slog; +import android.util.SparseArray; import android.view.Display; import androidx.annotation.NonNull; @@ -75,6 +77,24 @@ public final class DisplayTopology implements Parcelable { }; /** + * @param px The value in logical pixels + * @param dpi The logical density of the display + * @return The value in density-independent pixels + */ + public static float pxToDp(float px, int dpi) { + return px * DisplayMetrics.DENSITY_DEFAULT / dpi; + } + + /** + * @param dp The value in density-independent pixels + * @param dpi The logical density of the display + * @return The value in logical pixels + */ + public static float dpToPx(float dp, int dpi) { + return dp * dpi / DisplayMetrics.DENSITY_DEFAULT; + } + + /** * The topology tree */ @Nullable @@ -226,10 +246,9 @@ public final class DisplayTopology implements Parcelable { // The optimal pair is the pair which has the smallest deviation. The deviation consists of // an x-axis component and a y-axis component, called xDeviation and yDeviation. // - // The deviations are like distances but a little different. They are calculated in two - // steps. The first step calculates both axes in a similar way. The next step compares the - // two values and chooses which axis to attach along. Depending on which axis is chosen, - // the deviation for one axis is updated. See below for details. + // The deviations are like distances but a little different. When they are calculated, each + // dimension is treated differently, depending on which edges (left+right or top+bottom) are + // attached. while (!needsParent.isEmpty()) { double bestDist = Double.POSITIVE_INFINITY; TreeNode bestChild = null, bestParent = null; @@ -243,33 +262,32 @@ public final class DisplayTopology implements Parcelable { float parentRight = parentPos.x + parent.getWidth(); float parentBottom = parentPos.y + parent.getHeight(); - // This is the smaller of the two ranges minus the amount of overlap shared - // between them. The "amount of overlap" is negative if there is no overlap, but - // this does not make a parenting ineligible, because we allow for attaching at - // the corner and for floating point error. The overlap is more negative the - // farther apart the closest corner pair is. - // - // For each axis, this calculates (SmallerRange - Overlap). If one range lies - // completely in the other (or they are equal), the axis' deviation will be - // zero. - // - // The "SmallerRange," which refers to smaller of the widths of the two rects, - // or smaller of the heights of the two rects, is added to the deviation so that - // a maximum overlap results in a deviation of zero. - float xSmallerRange = Math.min(child.getWidth(), parent.getWidth()); - float ySmallerRange = Math.min(child.getHeight(), parent.getHeight()); - float xOverlap - = Math.min(parentRight, childRight) - - Math.max(parentPos.x, childPos.x); - float yOverlap - = Math.min(parentBottom, childBottom) - - Math.max(parentPos.y, childPos.y); - float xDeviation = xSmallerRange - xOverlap; - float yDeviation = ySmallerRange - yOverlap; + // The "amount of overlap" indicates how much of one display is within the other + // (considering one axis only). It's zero if they only share an edge and + // negative if they're away from each other. + // A zero or negative overlap does not make a parenting ineligible, because we + // allow for attaching at the corner and for floating point error. + float xOverlap = + Math.min(parentRight, childRight) - Math.max(parentPos.x, childPos.x); + float yOverlap = + Math.min(parentBottom, childBottom) - Math.max(parentPos.y, childPos.y); + float xDeviation, yDeviation; float offset; int pos; - if (xDeviation <= yDeviation) { + if (Math.abs(xOverlap) > Math.abs(yOverlap)) { + // Deviation in each dimension is a penalty in the potential parenting. To + // get the X deviation, overlap is subtracted from the lesser width so that + // a maximum overlap results in a deviation of zero. + // Note that because xOverlap is *subtracted* from the lesser width, no + // overlap in X becomes a *penalty* if we are attaching on the top+bottom + // edges. + // + // The Y deviation is simply the distance from the clamping edges. + // + // Treatment of the X and Y deviations are swapped for + // POSITION_LEFT/POSITION_RIGHT attachments in the "else" block below. + xDeviation = Math.min(child.getWidth(), parent.getWidth()) - xOverlap; if (childPos.y < parentPos.y) { yDeviation = childBottom - parentPos.y; pos = POSITION_TOP; @@ -279,6 +297,7 @@ public final class DisplayTopology implements Parcelable { } offset = childPos.x - parentPos.x; } else { + yDeviation = Math.min(child.getHeight(), parent.getHeight()) - yOverlap; if (childPos.x < parentPos.x) { xDeviation = childRight - parentPos.x; pos = POSITION_LEFT; @@ -474,6 +493,22 @@ public final class DisplayTopology implements Parcelable { return new DisplayTopology(rootCopy, mPrimaryDisplayId); } + /** + * Assign absolute bounds to each display. The top-left corner of the root is at position + * (0, 0). + * @return Map from logical display ID to the display's absolute bounds + */ + public SparseArray<RectF> getAbsoluteBounds() { + Map<TreeNode, RectF> bounds = new HashMap<>(); + getInfo(bounds, /* depths= */ null, /* parents= */ null, mRoot, /* x= */ 0, /* y= */ 0, + /* depth= */ 0); + SparseArray<RectF> boundsById = new SparseArray<>(); + for (Map.Entry<TreeNode, RectF> entry : bounds.entrySet()) { + boundsById.append(entry.getKey().mDisplayId, entry.getValue()); + } + return boundsById; + } + @Override public int describeContents() { return 0; @@ -575,7 +610,7 @@ public final class DisplayTopology implements Parcelable { } @Nullable - private static TreeNode findDisplay(int displayId, TreeNode startingNode) { + private static TreeNode findDisplay(int displayId, @Nullable TreeNode startingNode) { if (startingNode == null) { return null; } @@ -592,8 +627,8 @@ public final class DisplayTopology implements Parcelable { } /** - * Get information about the topology that will be used for the normalization algorithm. - * Assigns origins to each display to compute the bounds. + * Get information about the topology. + * Assigns positions to each display to compute the bounds. The root is at position (0, 0). * @param bounds The map where the bounds of each display will be put * @param depths The map where the depths of each display in the tree will be put * @param parents The map where the parent of each display will be put @@ -602,12 +637,22 @@ public final class DisplayTopology implements Parcelable { * @param y The starting y position * @param depth The starting depth */ - private static void getInfo(Map<TreeNode, RectF> bounds, Map<TreeNode, Integer> depths, - Map<TreeNode, TreeNode> parents, TreeNode display, float x, float y, int depth) { - bounds.put(display, new RectF(x, y, x + display.mWidth, y + display.mHeight)); - depths.put(display, depth); + private static void getInfo(@Nullable Map<TreeNode, RectF> bounds, + @Nullable Map<TreeNode, Integer> depths, @Nullable Map<TreeNode, TreeNode> parents, + @Nullable TreeNode display, float x, float y, int depth) { + if (display == null) { + return; + } + if (bounds != null) { + bounds.put(display, new RectF(x, y, x + display.mWidth, y + display.mHeight)); + } + if (depths != null) { + depths.put(display, depth); + } for (TreeNode child : display.mChildren) { - parents.put(child, display); + if (parents != null) { + parents.put(child, display); + } if (child.mPosition == POSITION_LEFT) { getInfo(bounds, depths, parents, child, x - child.mWidth, y + child.mOffset, depth + 1); @@ -662,7 +707,7 @@ public final class DisplayTopology implements Parcelable { * Ensure that the offsets of all displays within the given tree are within bounds. * @param display The starting node */ - private void clampOffsets(TreeNode display) { + private void clampOffsets(@Nullable TreeNode display) { if (display == null) { return; } diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java index 34c88e91a979..8da630c95135 100644 --- a/core/java/android/hardware/input/InputSettings.java +++ b/core/java/android/hardware/input/InputSettings.java @@ -28,6 +28,7 @@ import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag; import static com.android.hardware.input.Flags.mouseScrollingAcceleration; import static com.android.hardware.input.Flags.mouseReverseVerticalScrolling; import static com.android.hardware.input.Flags.mouseSwapPrimaryButton; +import static com.android.hardware.input.Flags.pointerAcceleration; import static com.android.hardware.input.Flags.touchpadSystemGestureDisable; import static com.android.hardware.input.Flags.touchpadThreeFingerTapShortcut; import static com.android.hardware.input.Flags.touchpadVisualizer; @@ -418,6 +419,15 @@ public class InputSettings { } /** + * Returns true if the feature flag for the pointer acceleration toggle is + * enabled. + * @hide + */ + public static boolean isPointerAccelerationFeatureFlagEnabled() { + return pointerAcceleration(); + } + + /** * Returns true if the touchpad visualizer is allowed to appear. * * @param context The application context. @@ -720,6 +730,47 @@ public class InputSettings { } /** + * Whether cursor acceleration is enabled or not for connected mice. + * + * @param context The application context. + * + * @hide + */ + public static boolean isMousePointerAccelerationEnabled(@NonNull Context context) { + if (!isPointerAccelerationFeatureFlagEnabled()) { + return false; + } + + return Settings.System.getIntForUser(context.getContentResolver(), + Settings.System.MOUSE_POINTER_ACCELERATION_ENABLED, 1, UserHandle.USER_CURRENT) + == 1; + } + + /** + * Sets whether mouse acceleration is enabled. + * + * When enabled, the mouse cursor moves farther when it is moved faster. + * When disabled, the mouse cursor speed becomes directly proportional to + * the speed at which the mouse is moved. + * + * @param context The application context. + * @param enabled Will enable mouse acceleration if true, disable it if + * false. + * @hide + */ + @RequiresPermission(Manifest.permission.WRITE_SETTINGS) + public static void setMouseAccelerationEnabled(@NonNull Context context, + boolean enabled) { + if (!isPointerAccelerationFeatureFlagEnabled()) { + return; + } + Settings.System.putIntForUser(context.getContentResolver(), + Settings.System.MOUSE_POINTER_ACCELERATION_ENABLED, enabled ? 1 : 0, + UserHandle.USER_CURRENT); + } + + + /** * Whether Accessibility bounce keys feature is enabled. * * <p> diff --git a/core/java/android/inputmethodservice/InlineSuggestionSession.java b/core/java/android/inputmethodservice/InlineSuggestionSession.java index 1cc64f9edc12..4c907502b8c8 100644 --- a/core/java/android/inputmethodservice/InlineSuggestionSession.java +++ b/core/java/android/inputmethodservice/InlineSuggestionSession.java @@ -29,6 +29,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; +import android.view.autofill.AutofillFeatureFlags; import android.view.autofill.AutofillId; import android.view.inputmethod.InlineSuggestionsRequest; import android.view.inputmethod.InlineSuggestionsResponse; @@ -81,6 +82,7 @@ class InlineSuggestionSession { @Nullable private Boolean mPreviousResponseIsEmpty; + private boolean mAlwaysNotifyAutofill = false; /** * Indicates whether {@link #makeInlineSuggestionRequestUncheck()} has been called or not, @@ -105,6 +107,7 @@ class InlineSuggestionSession { mResponseConsumer = responseConsumer; mInlineSuggestionSessionController = inlineSuggestionSessionController; mMainThreadHandler = mainThreadHandler; + mAlwaysNotifyAutofill = AutofillFeatureFlags.isImproveFillDialogEnabled(); } @MainThread @@ -176,6 +179,9 @@ class InlineSuggestionSession { try { final InlineSuggestionsRequest request = mRequestSupplier.apply( mRequestInfo.getUiExtras()); + if (mAlwaysNotifyAutofill) { + mResponseCallback = new InlineSuggestionsResponseCallbackImpl(this); + } if (request == null) { if (DEBUG) { Log.d(TAG, "onCreateInlineSuggestionsRequest() returned null request"); @@ -184,7 +190,9 @@ class InlineSuggestionSession { } else { request.setHostInputToken(mHostInputTokenSupplier.get()); request.filterContentTypes(); - mResponseCallback = new InlineSuggestionsResponseCallbackImpl(this); + if (!mAlwaysNotifyAutofill) { + mResponseCallback = new InlineSuggestionsResponseCallbackImpl(this); + } mCallback.onInlineSuggestionsRequest(request, mResponseCallback); } } catch (RemoteException e) { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index c57243d0bc73..6e58780ac7a7 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6362,6 +6362,16 @@ public final class Settings { public static final String MOUSE_SCROLLING_ACCELERATION = "mouse_scrolling_acceleration"; /** + * Whether mouse acceleration is enabled. + * + * When enabled, the mouse cursor will accelerate as the mouse moves faster. + * + * @hide + */ + public static final String MOUSE_POINTER_ACCELERATION_ENABLED = + "mouse_pointer_acceleration_enabled"; + + /** * Pointer fill style, specified by * {@link android.view.PointerIcon.PointerIconVectorStyleFill} constants. * @@ -6610,6 +6620,7 @@ public final class Settings { PRIVATE_SETTINGS.add(DEFAULT_DEVICE_FONT_SCALE); PRIVATE_SETTINGS.add(MOUSE_REVERSE_VERTICAL_SCROLLING); PRIVATE_SETTINGS.add(MOUSE_SWAP_PRIMARY_BUTTON); + PRIVATE_SETTINGS.add(MOUSE_POINTER_ACCELERATION_ENABLED); PRIVATE_SETTINGS.add(PREFERRED_REGION); PRIVATE_SETTINGS.add(MOUSE_SCROLLING_ACCELERATION); } @@ -9410,6 +9421,13 @@ public final class Settings { "even_dimmer_min_nits"; /** + * Setting that holds EM_VALUE (proprietary) + * + * @hide + */ + public static final String EM_VALUE = + "em_value"; + /** * List of the enabled print services. * * N and beyond uses {@link #DISABLED_PRINT_SERVICES}. But this might be used in an upgrade diff --git a/core/java/android/security/advancedprotection/AdvancedProtectionFeature.java b/core/java/android/security/advancedprotection/AdvancedProtectionFeature.java index d476d960890b..a086bf7f8b08 100644 --- a/core/java/android/security/advancedprotection/AdvancedProtectionFeature.java +++ b/core/java/android/security/advancedprotection/AdvancedProtectionFeature.java @@ -30,25 +30,26 @@ import android.security.Flags; @FlaggedApi(Flags.FLAG_AAPM_API) @SystemApi public final class AdvancedProtectionFeature implements Parcelable { - private final int mId; + private final String mId; /** * Create an object identifying an Advanced Protection feature for AdvancedProtectionManager - * @param id Feature identifier. It is used by Settings screens to display information about - * this feature. + * @param id A unique ID to identify this feature. It is used by Settings screens to display + * information about this feature. */ - public AdvancedProtectionFeature(@AdvancedProtectionManager.FeatureId int id) { + public AdvancedProtectionFeature(@NonNull String id) { mId = id; } private AdvancedProtectionFeature(Parcel in) { - mId = in.readInt(); + mId = in.readString8(); } /** * @return the unique ID representing this feature */ - public int getId() { + @NonNull + public String getId() { return mId; } @@ -59,7 +60,7 @@ public final class AdvancedProtectionFeature implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeInt(mId); + dest.writeString8(mId); } @NonNull diff --git a/core/java/android/security/advancedprotection/AdvancedProtectionManager.java b/core/java/android/security/advancedprotection/AdvancedProtectionManager.java index ea01fc98eda0..59628e8e69d7 100644 --- a/core/java/android/security/advancedprotection/AdvancedProtectionManager.java +++ b/core/java/android/security/advancedprotection/AdvancedProtectionManager.java @@ -24,18 +24,17 @@ import static android.os.UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY; import android.Manifest; import android.annotation.CallbackExecutor; import android.annotation.FlaggedApi; -import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.annotation.SdkConstant; +import android.annotation.StringDef; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; -import android.net.wifi.WifiManager; import android.os.Binder; import android.os.RemoteException; -import android.os.UserManager; import android.security.Flags; import android.util.Log; @@ -60,57 +59,54 @@ public final class AdvancedProtectionManager { private static final String TAG = "AdvancedProtectionMgr"; /** - * Advanced Protection's identifier for setting policies or restrictions in - * {@link DevicePolicyManager}. + * Advanced Protection's identifier for setting policies or restrictions in DevicePolicyManager. * * @hide */ public static final String ADVANCED_PROTECTION_SYSTEM_ENTITY = "android.security.advancedprotection"; /** - * Feature identifier for disallowing connections to 2G networks. + * Feature identifier for disallowing 2G. * - * @see UserManager#DISALLOW_CELLULAR_2G * @hide */ @SystemApi - public static final int FEATURE_ID_DISALLOW_CELLULAR_2G = 0; + public static final String FEATURE_ID_DISALLOW_CELLULAR_2G = + "android.security.advancedprotection.feature_disallow_2g"; /** - * Feature identifier for disallowing installs of apps from unknown sources. + * Feature identifier for disallowing install of unknown sources. * - * @see UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY * @hide */ @SystemApi - public static final int FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES = 1; + public static final String FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES = + "android.security.advancedprotection.feature_disallow_install_unknown_sources"; /** - * Feature identifier for disallowing USB connections. + * Feature identifier for disallowing USB. * * @hide */ @SystemApi - public static final int FEATURE_ID_DISALLOW_USB = 2; + public static final String FEATURE_ID_DISALLOW_USB = + "android.security.advancedprotection.feature_disallow_usb"; /** - * Feature identifier for disallowing connections to Wi-Fi Wired Equivalent Privacy (WEP) - * networks. + * Feature identifier for disallowing WEP. * - * @see WifiManager#isWepSupported() * @hide */ @SystemApi - public static final int FEATURE_ID_DISALLOW_WEP = 3; + public static final String FEATURE_ID_DISALLOW_WEP = + "android.security.advancedprotection.feature_disallow_wep"; /** - * Feature identifier for enabling the Memory Tagging Extension (MTE). MTE is a CPU extension - * that allows to protect against certain classes of security problems at a small runtime - * performance cost overhead. + * Feature identifier for enabling MTE. * - * @see DevicePolicyManager#setMtePolicy(int) * @hide */ @SystemApi - public static final int FEATURE_ID_ENABLE_MTE = 4; + public static final String FEATURE_ID_ENABLE_MTE = + "android.security.advancedprotection.feature_enable_mte"; /** @hide */ - @IntDef(prefix = { "FEATURE_ID_" }, value = { + @StringDef(prefix = { "FEATURE_ID_" }, value = { FEATURE_ID_DISALLOW_CELLULAR_2G, FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES, FEATURE_ID_DISALLOW_USB, @@ -120,7 +116,7 @@ public final class AdvancedProtectionManager { @Retention(RetentionPolicy.SOURCE) public @interface FeatureId {} - private static final Set<Integer> ALL_FEATURE_IDS = Set.of( + private static final Set<String> ALL_FEATURE_IDS = Set.of( FEATURE_ID_DISALLOW_CELLULAR_2G, FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES, FEATURE_ID_DISALLOW_USB, @@ -139,6 +135,9 @@ public final class AdvancedProtectionManager { * Output: Nothing. * * @hide */ + @SystemApi + @SdkConstant(SdkConstant.SdkConstantType.ACTIVITY_INTENT_ACTION) + @FlaggedApi(android.security.Flags.FLAG_AAPM_API) public static final String ACTION_SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG = "android.security.advancedprotection.action.SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG"; @@ -148,6 +147,7 @@ public final class AdvancedProtectionManager { * * @hide */ @FeatureId + @SystemApi public static final String EXTRA_SUPPORT_DIALOG_FEATURE = "android.security.advancedprotection.extra.SUPPORT_DIALOG_FEATURE"; @@ -157,41 +157,37 @@ public final class AdvancedProtectionManager { * * @hide */ @SupportDialogType + @SystemApi public static final String EXTRA_SUPPORT_DIALOG_TYPE = "android.security.advancedprotection.extra.SUPPORT_DIALOG_TYPE"; /** - * Type for {@link #EXTRA_SUPPORT_DIALOG_TYPE} indicating an unknown action was blocked by - * advanced protection, hence the support dialog should display a default explanation. - * - * @hide */ - public static final int SUPPORT_DIALOG_TYPE_UNKNOWN = 0; - - /** * Type for {@link #EXTRA_SUPPORT_DIALOG_TYPE} indicating a user performed an action that was * blocked by advanced protection. * * @hide */ - public static final int SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION = 1; + @SystemApi + public static final String SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION = + "android.security.advancedprotection.type_blocked_interaction"; /** * Type for {@link #EXTRA_SUPPORT_DIALOG_TYPE} indicating a user pressed on a setting toggle * that was disabled by advanced protection. * * @hide */ - public static final int SUPPORT_DIALOG_TYPE_DISABLED_SETTING = 2; + @SystemApi + public static final String SUPPORT_DIALOG_TYPE_DISABLED_SETTING = + "android.security.advancedprotection.type_disabled_setting"; /** @hide */ - @IntDef(prefix = { "SUPPORT_DIALOG_TYPE_" }, value = { - SUPPORT_DIALOG_TYPE_UNKNOWN, + @StringDef(prefix = { "SUPPORT_DIALOG_TYPE_" }, value = { SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION, SUPPORT_DIALOG_TYPE_DISABLED_SETTING, }) @Retention(RetentionPolicy.SOURCE) public @interface SupportDialogType {} - private static final Set<Integer> ALL_SUPPORT_DIALOG_TYPES = Set.of( - SUPPORT_DIALOG_TYPE_UNKNOWN, + private static final Set<String> ALL_SUPPORT_DIALOG_TYPES = Set.of( SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION, SUPPORT_DIALOG_TYPE_DISABLED_SETTING); @@ -328,13 +324,15 @@ public final class AdvancedProtectionManager { * disabled by advanced protection. * @hide */ - public static @NonNull Intent createSupportIntent(@FeatureId int featureId, - @SupportDialogType int type) { + @SystemApi + public @NonNull Intent createSupportIntent(@NonNull @FeatureId String featureId, + @Nullable @SupportDialogType String type) { + Objects.requireNonNull(featureId); if (!ALL_FEATURE_IDS.contains(featureId)) { throw new IllegalArgumentException(featureId + " is not a valid feature ID. See" + " FEATURE_ID_* APIs."); } - if (!ALL_SUPPORT_DIALOG_TYPES.contains(type)) { + if (type != null && !ALL_SUPPORT_DIALOG_TYPES.contains(type)) { throw new IllegalArgumentException(type + " is not a valid type. See" + " SUPPORT_DIALOG_TYPE_* APIs."); } @@ -342,19 +340,21 @@ public final class AdvancedProtectionManager { Intent intent = new Intent(ACTION_SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG); intent.setFlags(FLAG_ACTIVITY_NEW_TASK); intent.putExtra(EXTRA_SUPPORT_DIALOG_FEATURE, featureId); - intent.putExtra(EXTRA_SUPPORT_DIALOG_TYPE, type); + if (type != null) { + intent.putExtra(EXTRA_SUPPORT_DIALOG_TYPE, type); + } return intent; } /** @hide */ - public static @NonNull Intent createSupportIntentForPolicyIdentifierOrRestriction( - @NonNull String identifier, @SupportDialogType int type) { + public @NonNull Intent createSupportIntentForPolicyIdentifierOrRestriction( + @NonNull String identifier, @Nullable @SupportDialogType String type) { Objects.requireNonNull(identifier); - if (!ALL_SUPPORT_DIALOG_TYPES.contains(type)) { + if (type != null && !ALL_SUPPORT_DIALOG_TYPES.contains(type)) { throw new IllegalArgumentException(type + " is not a valid type. See" + " SUPPORT_DIALOG_TYPE_* APIs."); } - final int featureId; + final String featureId; if (DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY.equals(identifier)) { featureId = FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES; } else if (DISALLOW_CELLULAR_2G.equals(identifier)) { diff --git a/core/java/android/view/ImeInsetsSourceConsumer.java b/core/java/android/view/ImeInsetsSourceConsumer.java index 4f741982081b..880622a1e121 100644 --- a/core/java/android/view/ImeInsetsSourceConsumer.java +++ b/core/java/android/view/ImeInsetsSourceConsumer.java @@ -221,13 +221,13 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { @Override public boolean setControl(@Nullable InsetsSourceControl control, int[] showTypes, - int[] hideTypes, int[] cancelTypes) { + int[] hideTypes, int[] cancelTypes, int[] transientTypes) { if (Flags.refactorInsetsController()) { - return super.setControl(control, showTypes, hideTypes, cancelTypes); + return super.setControl(control, showTypes, hideTypes, cancelTypes, transientTypes); } else { ImeTracing.getInstance().triggerClientDump("ImeInsetsSourceConsumer#setControl", mController.getHost().getInputMethodManager(), null /* icProto */); - if (!super.setControl(control, showTypes, hideTypes, cancelTypes)) { + if (!super.setControl(control, showTypes, hideTypes, cancelTypes, transientTypes)) { return false; } if (control == null && !mIsRequestedVisibleAwaitingLeash) { diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index b0813f3a98f6..c174fbe0bbcd 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -959,6 +959,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation final @InsetsType int[] showTypes = new int[1]; final @InsetsType int[] hideTypes = new int[1]; final @InsetsType int[] cancelTypes = new int[1]; + final @InsetsType int[] transientTypes = new int[1]; ImeTracker.Token statsToken = null; // Ensure to update all existing source consumers @@ -984,7 +985,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation // control may be null, but we still need to update the control to null if it got // revoked. - consumer.setControl(control, showTypes, hideTypes, cancelTypes); + consumer.setControl(control, showTypes, hideTypes, cancelTypes, transientTypes); } // Ensure to create source consumers if not available yet. @@ -992,7 +993,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation for (int i = mTmpControlArray.size() - 1; i >= 0; i--) { final InsetsSourceControl control = mTmpControlArray.valueAt(i); getSourceConsumer(control.getId(), control.getType()) - .setControl(control, showTypes, hideTypes, cancelTypes); + .setControl(control, showTypes, hideTypes, cancelTypes, transientTypes); } } @@ -1020,10 +1021,16 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation handlePendingControlRequest(statsToken); } else { if (showTypes[0] != 0) { - applyAnimation(showTypes[0], true /* show */, false /* fromIme */, statsToken); + applyAnimation(showTypes[0], true /* show */, false /* fromIme */, + false /* skipsCallbacks */, statsToken); } if (hideTypes[0] != 0) { - applyAnimation(hideTypes[0], false /* show */, false /* fromIme */, statsToken); + applyAnimation(hideTypes[0], false /* show */, false /* fromIme */, + // The animation of hiding transient types shouldn't be detected by the + // app. Otherwise, it might be able to react to the callbacks and cause + // flickering. + (hideTypes[0] & ~transientTypes[0]) == 0 /* skipsCallbacks */, + statsToken); } } } else { @@ -1033,7 +1040,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation ImeTracker.TYPE_SHOW, ImeTracker.ORIGIN_CLIENT, SoftInputShowHideReason.CONTROLS_CHANGED, mHost.isHandlingPointerEvent() /* fromUser */); - applyAnimation(showTypes[0], true /* show */, false /* fromIme */, newStatsToken); + applyAnimation(showTypes[0], true /* show */, false /* fromIme */, + false /* skipsCallbacks */, newStatsToken); } if (hideTypes[0] != 0) { final var newStatsToken = @@ -1041,7 +1049,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_CLIENT, SoftInputShowHideReason.CONTROLS_CHANGED, mHost.isHandlingPointerEvent() /* fromUser */); - applyAnimation(hideTypes[0], false /* show */, false /* fromIme */, newStatsToken); + applyAnimation(hideTypes[0], false /* show */, false /* fromIme */, + // The animation of hiding transient types shouldn't be detected by the app. + // Otherwise, it might be able to react to the callbacks and cause + // flickering. + (hideTypes[0] & ~transientTypes[0]) == 0 /* skipsCallbacks */, + newStatsToken); } } @@ -1174,7 +1187,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation // TODO(b/353463205) check if this is needed here ImeTracker.forLatency().onShown(statsToken, ActivityThread::currentApplication); } - applyAnimation(typesReady, true /* show */, fromIme, statsToken); + applyAnimation(typesReady, true /* show */, fromIme, false /* skipsCallbacks */, + statsToken); } /** @@ -1287,7 +1301,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation handlePendingControlRequest(statsToken); getImeSourceConsumer().removeSurface(); } - applyAnimation(typesReady, false /* show */, fromIme, statsToken); + applyAnimation(typesReady, false /* show */, fromIme, false /* skipsCallbacks */, + statsToken); } @Override @@ -2007,24 +2022,24 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @VisibleForTesting public void applyAnimation(@InsetsType final int types, boolean show, boolean fromIme, - @Nullable ImeTracker.Token statsToken) { + boolean skipsCallbacks, @Nullable ImeTracker.Token statsToken) { // TODO(b/166736352): We should only skip the animation of specific types, not all types. - boolean skipAnim = false; + boolean skipsAnim = false; if ((types & ime()) != 0) { final InsetsSourceControl imeControl = mImeSourceConsumer.getControl(); // Skip showing animation once that made by system for some reason. // (e.g. starting window with IME snapshot) if (imeControl != null) { - skipAnim = imeControl.getAndClearSkipAnimationOnce() && show + skipsAnim = imeControl.getAndClearSkipAnimationOnce() && show && mImeSourceConsumer.hasViewFocusWhenWindowFocusGain(); } } - applyAnimation(types, show, fromIme, skipAnim, statsToken); + applyAnimation(types, show, fromIme, skipsAnim, skipsCallbacks, statsToken); } @VisibleForTesting public void applyAnimation(@InsetsType final int types, boolean show, boolean fromIme, - boolean skipAnim, @Nullable ImeTracker.Token statsToken) { + boolean skipsAnim, boolean skipsCallbacks, @Nullable ImeTracker.Token statsToken) { if (types == 0) { // nothing to animate. if (DEBUG) Log.d(TAG, "applyAnimation, nothing to animate. Stopping here"); @@ -2040,7 +2055,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation boolean hasAnimationCallbacks = mHost.hasAnimationCallbacks(); final InternalAnimationControlListener listener = new InternalAnimationControlListener( show, hasAnimationCallbacks, types, mHost.getSystemBarsBehavior(), - skipAnim || mAnimationsDisabled, mHost.dipToPx(FLOATING_IME_BOTTOM_INSET_DP), + skipsAnim || mAnimationsDisabled, mHost.dipToPx(FLOATING_IME_BOTTOM_INSET_DP), mLoggingListener, mJankContext); // We are about to playing the default animation (show/hide). Passing a null frame indicates @@ -2050,7 +2065,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation listener /* insetsAnimationSpec */, show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, show ? LAYOUT_INSETS_DURING_ANIMATION_SHOWN : LAYOUT_INSETS_DURING_ANIMATION_HIDDEN, - !hasAnimationCallbacks /* useInsetsAnimationThread */, statsToken, + !hasAnimationCallbacks || skipsCallbacks /* useInsetsAnimationThread */, statsToken, false /* fromPredictiveBack */); } @@ -2173,12 +2188,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation new InsetsSourceControl(ID_IME_CAPTION_BAR, captionBar(), null /* leash */, false /* initialVisible */, new Point(), Insets.NONE), - new int[1], new int[1], new int[1]); + new int[1], new int[1], new int[1], new int[1]); } else { mState.removeSource(ID_IME_CAPTION_BAR); InsetsSourceConsumer sourceConsumer = mSourceConsumers.get(ID_IME_CAPTION_BAR); if (sourceConsumer != null) { - sourceConsumer.setControl(null, new int[1], new int[1], new int[1]); + sourceConsumer.setControl(null, new int[1], new int[1], new int[1], new int[1]); } } mHost.notifyInsetsChanged(); diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java index 17f33c1af4ed..e8e66210bca6 100644 --- a/core/java/android/view/InsetsSourceConsumer.java +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -130,7 +130,10 @@ public class InsetsSourceConsumer { * @return Whether the control has changed from the server */ public boolean setControl(@Nullable InsetsSourceControl control, - @InsetsType int[] showTypes, @InsetsType int[] hideTypes, int[] cancelTypes) { + @InsetsType int[] showTypes, + @InsetsType int[] hideTypes, + @InsetsType int[] cancelTypes, + @InsetsType int[] transientTypes) { if (Objects.equals(mSourceControl, control)) { if (mSourceControl != null && mSourceControl != control) { mSourceControl.release(SurfaceControl::release); @@ -185,6 +188,9 @@ public class InsetsSourceConsumer { } else { hideTypes[0] |= mType; } + if (lastControl != null && lastControl.isFake()) { + transientTypes[0] |= mType; + } } else { // We are gaining control, but don't need to run an animation. // However make sure that the leash visibility is still up to date. diff --git a/core/java/android/view/InsetsSourceControl.java b/core/java/android/view/InsetsSourceControl.java index acbd95bf6810..7f2f0e8863df 100644 --- a/core/java/android/view/InsetsSourceControl.java +++ b/core/java/android/view/InsetsSourceControl.java @@ -142,6 +142,10 @@ public class InsetsSourceControl implements Parcelable { return mInsetsHint; } + public boolean isFake() { + return mLeash == null && Insets.NONE.equals(mInsetsHint); + } + public void setSkipAnimationOnce(boolean skipAnimation) { mSkipAnimationOnce = skipAnimation; } diff --git a/core/java/android/view/autofill/AutofillFeatureFlags.java b/core/java/android/view/autofill/AutofillFeatureFlags.java index d527007e586e..206e47f13890 100644 --- a/core/java/android/view/autofill/AutofillFeatureFlags.java +++ b/core/java/android/view/autofill/AutofillFeatureFlags.java @@ -16,6 +16,8 @@ package android.view.autofill; +import static android.service.autofill.Flags.improveFillDialogAconfig; + import android.annotation.SuppressLint; import android.annotation.TestApi; import android.provider.DeviceConfig; @@ -662,7 +664,7 @@ public class AutofillFeatureFlags { public static boolean isImproveFillDialogEnabled() { // TODO(b/266379948): Add condition for checking whether device has PCC first - return DeviceConfig.getBoolean( + return improveFillDialogAconfig() && DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_AUTOFILL, DEVICE_CONFIG_IMPROVE_FILL_DIALOG_ENABLED, DEFAULT_IMPROVE_FILL_DIALOG_ENABLED); diff --git a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java index 3a008aad59bf..eca798d6eb4f 100644 --- a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java +++ b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java @@ -490,6 +490,20 @@ final class IInputMethodManagerGlobalInvoker { } @AnyThread + @RequiresPermission(Manifest.permission.TEST_INPUT_METHOD) + static boolean shouldShowImeSwitcherButtonForTest() { + final IInputMethodManager service = getService(); + if (service == null) { + return false; + } + try { + return service.shouldShowImeSwitcherButtonForTest(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + @AnyThread @Nullable @RequiresPermission(value = Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true) static InputMethodSubtype getCurrentInputMethodSubtype(@UserIdInt int userId) { diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index d5f471edfdd2..e904345fb03e 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -992,23 +992,7 @@ public final class InputMethodManager { private void setCurrentRootViewLocked(ViewRootImpl rootView) { final boolean wasEmpty = mCurRootView == null; if (Flags.refactorInsetsController() && !wasEmpty && mCurRootView != rootView) { - final int softInputMode = mCurRootView.mWindowAttributes.softInputMode; - final int state = - softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE; - if (state == WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) { - // when losing input focus (e.g., by going to another window), we reset the - // requestedVisibleTypes of WindowInsetsController by hiding the IME - final var statsToken = ImeTracker.forLogging().onStart( - ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_CLIENT, - SoftInputShowHideReason.HIDE_WINDOW_LOST_FOCUS, - false /* fromUser */); - if (DEBUG) { - Log.d(TAG, "setCurrentRootViewLocked, hiding IME because " - + "of STATE_ALWAYS_HIDDEN"); - } - mCurRootView.getInsetsController().hide(WindowInsets.Type.ime(), - false /* fromIme */, statsToken); - } + onImeFocusLost(mCurRootView); } mImeDispatcher.switchRootView(mCurRootView, rootView); @@ -1019,6 +1003,26 @@ public final class InputMethodManager { } } + private void onImeFocusLost(@NonNull ViewRootImpl previousRootView) { + final int softInputMode = previousRootView.mWindowAttributes.softInputMode; + final int state = + softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE; + if (state == WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) { + // when losing input focus (e.g., by going to another window), we reset the + // requestedVisibleTypes of WindowInsetsController by hiding the IME + final var statsToken = ImeTracker.forLogging().onStart( + ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_CLIENT, + SoftInputShowHideReason.HIDE_WINDOW_LOST_FOCUS, + false /* fromUser */); + if (DEBUG) { + Log.d(TAG, "onImeFocusLost, hiding IME because " + + "of STATE_ALWAYS_HIDDEN"); + } + previousRootView.getInsetsController().hide(WindowInsets.Type.ime(), + false /* fromIme */, statsToken); + } + } + /** @hide */ public DelegateImpl getDelegate() { return mDelegate; @@ -4536,6 +4540,19 @@ public final class InputMethodManager { } /** + * A test API for CTS to check whether the IME Switcher button should be shown when the IME + * is shown. + * + * @hide + */ + @SuppressLint("UnflaggedApi") // @TestApi without associated feature. + @TestApi + @RequiresPermission(Manifest.permission.TEST_INPUT_METHOD) + public boolean shouldShowImeSwitcherButtonForTest() { + return IInputMethodManagerGlobalInvoker.shouldShowImeSwitcherButtonForTest(); + } + + /** * A test API for CTS to check whether there are any pending IME visibility requests. * * @return {@code true} iff there are pending IME visibility requests. diff --git a/core/java/android/view/inputmethod/flags.aconfig b/core/java/android/view/inputmethod/flags.aconfig index 41567fbf8b51..4258ca4fde01 100644 --- a/core/java/android/view/inputmethod/flags.aconfig +++ b/core/java/android/view/inputmethod/flags.aconfig @@ -194,3 +194,14 @@ flag { is_fixed_read_only: true is_exported: true } + +flag { + name: "fallback_display_for_secondary_user_on_secondary_display" + namespace: "input_method" + description: "Feature flag to fix the fallback display bug for visible background users" + bug: "383228193" + is_fixed_read_only: true + metadata { + purpose: PURPOSE_BUGFIX + } +} diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 9fe3fd6ddc1a..7c75d7b30037 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -5820,8 +5820,13 @@ public class RemoteViews implements Parcelable, Filter { mActions.forEach(action -> { if (viewId == action.mViewId && action instanceof SetOnClickResponse setOnClickResponse) { - setOnClickResponse.mResponse.handleViewInteraction( - player, params.handler); + final RemoteResponse response = setOnClickResponse.mResponse; + if (response.mFillIntent == null) { + response.mFillIntent = new Intent(); + } + response.mFillIntent.putExtra( + "remotecompose_metadata", metadata); + response.handleViewInteraction(player, params.handler); } }); }); diff --git a/core/java/android/window/flags/responsible_apis.aconfig b/core/java/android/window/flags/responsible_apis.aconfig index d5ba32cafebd..4b5adfcc2c9b 100644 --- a/core/java/android/window/flags/responsible_apis.aconfig +++ b/core/java/android/window/flags/responsible_apis.aconfig @@ -75,4 +75,9 @@ flag { bug: "362575865" } - +flag { + name: "bal_strict_mode_grace_period" + namespace: "responsible_apis" + description: "Strict mode violation triggered by grace period usage" + bug: "384807495" +} diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig index f346544780b3..7eabd1733c5b 100644 --- a/core/java/android/window/flags/windowing_frontend.aconfig +++ b/core/java/android/window/flags/windowing_frontend.aconfig @@ -441,4 +441,12 @@ flag { metadata { purpose: PURPOSE_BUGFIX } -}
\ No newline at end of file +} + +flag { + name: "port_window_size_animation" + namespace: "systemui" + description: "Port window-resize animation from legacy to shell" + bug: "384976265" +} + diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java index b8f7a3d0231a..5d55418b185d 100644 --- a/core/java/com/android/internal/app/PlatLogoActivity.java +++ b/core/java/com/android/internal/app/PlatLogoActivity.java @@ -18,6 +18,9 @@ package com.android.internal.app; import static android.os.VibrationEffect.Composition.PRIMITIVE_SPIN; +import static java.lang.Math.hypot; +import static java.lang.Math.max; + import android.animation.ObjectAnimator; import android.animation.TimeAnimator; import android.annotation.SuppressLint; @@ -26,9 +29,11 @@ import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; +import android.graphics.ColorSpace; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; @@ -72,7 +77,7 @@ public class PlatLogoActivity extends Activity { private static final String EGG_UNLOCK_SETTING = "egg_mode_v"; private static final float MIN_WARP = 1f; - private static final float MAX_WARP = 10f; // after all these years + private static final float MAX_WARP = 16f; // must go faster private static final boolean FINISH_AFTER_NEXT_STAGE_LAUNCH = false; private ImageView mLogo; @@ -201,6 +206,9 @@ public class PlatLogoActivity extends Activity { getWindow().setStatusBarColor(0); getWindow().getDecorView().getWindowInsetsController().hide(WindowInsets.Type.systemBars()); + // This will be silently ignored on displays that don't support HDR color, which is fine + getWindow().setColorMode(ActivityInfo.COLOR_MODE_HDR); + final ActionBar ab = getActionBar(); if (ab != null) ab.hide(); @@ -364,7 +372,7 @@ public class PlatLogoActivity extends Activity { mPressureMin = Math.min(mPressureMin, touchData.getDouble("min")); } if (touchData.has("max")) { - mPressureMax = Math.max(mPressureMax, touchData.getDouble("max")); + mPressureMax = max(mPressureMax, touchData.getDouble("max")); } if (mPressureMax >= 0) { touchData.put("min", mPressureMin); @@ -392,9 +400,11 @@ public class PlatLogoActivity extends Activity { } private static class Starfield extends Drawable { - private static final int NUM_STARS = 34; // Build.VERSION_CODES.UPSIDE_DOWN_CAKE + private static final int NUM_STARS = 128; + + private static final int NUM_PLANES = 4; - private static final int NUM_PLANES = 2; + private static final float ROTATION = 45; private final float[] mStars = new float[NUM_STARS * 4]; private float mVx, mVy; private long mDt = 0; @@ -403,7 +413,7 @@ public class PlatLogoActivity extends Activity { private final Random mRng; private final float mSize; - private final Rect mSpace = new Rect(); + private float mRadius = 0f; private float mWarp = 1f; private float mBuffer; @@ -426,14 +436,15 @@ public class PlatLogoActivity extends Activity { @Override public void onBoundsChange(Rect bounds) { - mSpace.set(bounds); mBuffer = mSize * NUM_PLANES * 2 * MAX_WARP; - mSpace.inset(-(int) mBuffer, -(int) mBuffer); - final float w = mSpace.width(); - final float h = mSpace.height(); + mRadius = ((float) hypot(bounds.width(), bounds.height()) / 2f) + mBuffer; + // I didn't clarify this the last time, but we store both the beginning and + // end of each star's trail in this data structure. When we're not in warp that means + // that we've got each star in there twice. It's fine, we're gonna move it off-screen for (int i = 0; i < NUM_STARS; i++) { - mStars[4 * i] = mRng.nextFloat() * w; - mStars[4 * i + 1] = mRng.nextFloat() * h; + mStars[4 * i] = mRng.nextFloat() * 2 * mRadius - mRadius; + mStars[4 * i + 1] = mRng.nextFloat() * 2 * mRadius - mRadius; + // duplicate copy (for now) mStars[4 * i + 2] = mStars[4 * i]; mStars[4 * i + 3] = mStars[4 * i + 1]; } @@ -452,31 +463,47 @@ public class PlatLogoActivity extends Activity { final boolean inWarp = mWarp > 1f; - canvas.drawColor(Color.BLACK); // 0xFF16161D); + final float diameter = mRadius * 2f; + final float triameter = mRadius * 3f; + + canvas.drawColor(Color.BLACK); + + final float cx = getBounds().width() / 2f; + final float cy = getBounds().height() / 2f; + canvas.translate(cx, cy); + + canvas.rotate(ROTATION); if (mDt > 0 && mDt < 1000) { canvas.translate( - -(mBuffer) + mRng.nextFloat() * (mWarp - 1f), - -(mBuffer) + mRng.nextFloat() * (mWarp - 1f) + mRng.nextFloat() * (mWarp - 1f), + mRng.nextFloat() * (mWarp - 1f) ); - final float w = mSpace.width(); - final float h = mSpace.height(); for (int i = 0; i < NUM_STARS; i++) { final int plane = (int) ((((float) i) / NUM_STARS) * NUM_PLANES) + 1; - mStars[4 * i + 2] = (mStars[4 * i + 2] + dx * plane + w) % w; - mStars[4 * i + 3] = (mStars[4 * i + 3] + dy * plane + h) % h; - mStars[4 * i + 0] = inWarp ? mStars[4 * i + 2] - dx * mWarp * 2 * plane : -100; - mStars[4 * i + 1] = inWarp ? mStars[4 * i + 3] - dy * mWarp * 2 * plane : -100; + mStars[4 * i + 2] = (mStars[4 * i + 2] + dx * plane + triameter) % diameter + - mRadius; + mStars[4 * i + 3] = (mStars[4 * i + 3] + dy * plane + triameter) % diameter + - mRadius; + mStars[4 * i + 0] = inWarp ? mStars[4 * i + 2] - dx * mWarp * plane : -10000; + mStars[4 * i + 1] = inWarp ? mStars[4 * i + 3] - dy * mWarp * plane : -10000; } } final int slice = (mStars.length / NUM_PLANES / 4) * 4; for (int p = 0; p < NUM_PLANES; p++) { + final float value = (p + 1f) / (NUM_PLANES - 1); + mStarPaint.setColor(packHdrColor(value, 1.0f)); mStarPaint.setStrokeWidth(mSize * (p + 1)); if (inWarp) { canvas.drawLines(mStars, p * slice, slice, mStarPaint); } canvas.drawPoints(mStars, p * slice, slice, mStarPaint); } + + if (inWarp) { + final float frac = (mWarp - MIN_WARP) / (MAX_WARP - MIN_WARP); + canvas.drawColor(packHdrColor(2.0f, frac * frac)); + } } @Override @@ -497,5 +524,10 @@ public class PlatLogoActivity extends Activity { public void update(long dt) { mDt = dt; } + + private static final ColorSpace sSrgbExt = ColorSpace.get(ColorSpace.Named.EXTENDED_SRGB); + public static long packHdrColor(float value, float alpha) { + return Color.valueOf(value, value, value, alpha, sSrgbExt).pack(); + } } } diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index efbf88714453..9380d99b7de3 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -149,6 +149,15 @@ interface IInputMethodManager { + "permission.WRITE_SECURE_SETTINGS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL})") oneway void onImeSwitchButtonClickFromSystem(int displayId); + /** + * A test API for CTS to check whether the IME Switcher button should be shown when the IME + * is shown. + */ + @EnforcePermission("TEST_INPUT_METHOD") + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + + "android.Manifest.permission.TEST_INPUT_METHOD)") + boolean shouldShowImeSwitcherButtonForTest(); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true)") @nullable InputMethodSubtype getCurrentInputMethodSubtype(int userId); diff --git a/core/java/com/android/internal/widget/NotificationExpandButton.java b/core/java/com/android/internal/widget/NotificationExpandButton.java index 751cfde70164..b7537ed3f54b 100644 --- a/core/java/com/android/internal/widget/NotificationExpandButton.java +++ b/core/java/com/android/internal/widget/NotificationExpandButton.java @@ -149,8 +149,10 @@ public class NotificationExpandButton extends FrameLayout { setContentDescription(mContext.getText(contentDescriptionId)); mIconView.setImageDrawable(getContext().getDrawable(drawableId)); - // changing the expanded state can affect the number display - updateNumber(); + if (!notificationsRedesignTemplates()) { + // changing the expanded state can affect the number display + updateNumber(); + } } private void updateNumber() { @@ -189,6 +191,9 @@ public class NotificationExpandButton extends FrameLayout { } private boolean shouldShowNumber() { + if (notificationsRedesignTemplates()) { + return mNumber > 1; + } return !mExpanded && mNumber > 1; } @@ -230,7 +235,7 @@ public class NotificationExpandButton extends FrameLayout { /** * Sets the number shown inside the expand button. - * This only appears when the expand button is collapsed, and when greater than 1. + * This only appears when {@link this#shouldShowNumber()} is true. */ @RemotableViewMethod public void setNumber(int number) { diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto index c901ee1e3f8f..cf81ba157bf9 100644 --- a/core/proto/android/providers/settings/secure.proto +++ b/core/proto/android/providers/settings/secure.proto @@ -106,6 +106,7 @@ message SecureSettingsProto { optional SettingProto display_daltonizer_saturation_level = 58 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto accessibility_key_gesture_targets = 59 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto hct_rect_prompt_status = 60 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto em_value = 61 [ (android.privacy).dest = DEST_AUTOMATIC ]; } optional Accessibility accessibility = 2; diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto index dd9bfa51c634..0d99200f4e6f 100644 --- a/core/proto/android/providers/settings/system.proto +++ b/core/proto/android/providers/settings/system.proto @@ -228,6 +228,7 @@ message SystemSettingsProto { optional SettingProto reverse_vertical_scrolling = 1 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto swap_primary_button = 2 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto scrolling_acceleration = 3 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pointer_acceleration_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; } optional Mouse mouse = 38; diff --git a/core/res/res/drawable-nodpi/platlogo.xml b/core/res/res/drawable-nodpi/platlogo.xml index 822aa22746ca..74327964329c 100644 --- a/core/res/res/drawable-nodpi/platlogo.xml +++ b/core/res/res/drawable-nodpi/platlogo.xml @@ -1,5 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> <!-- -Copyright (C) 2021 The Android Open Source Project +Copyright (C) 2024 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,97 +19,129 @@ Copyright (C) 2021 The Android Open Source Project android:height="512dp" android:viewportWidth="512" android:viewportHeight="512"> - <!-- space --> - <path - android:pathData="M256,446.36C229.63,446.36 212.19,428.06 194.8,397.94C177.41,367.82 91.54,219.08 74.14,188.96C56.75,158.84 49.63,134.59 62.81,111.75C76,88.91 100.56,82.95 135.35,82.95C170.13,82.95 341.87,82.95 376.65,82.95C411.44,82.95 436,88.91 449.19,111.75C462.37,134.59 455.25,158.84 437.86,188.96C420.46,219.08 334.59,367.82 317.2,397.94C299.81,428.06 282.37,446.36 256,446.36H256Z" - android:fillColor="#202124"/> - <group> - <clip-path - android:pathData="M256,446.36C229.63,446.36 212.19,428.06 194.8,397.94C177.41,367.82 91.54,219.08 74.14,188.96C56.75,158.84 49.63,134.59 62.81,111.75C76,88.91 100.56,82.95 135.35,82.95C170.13,82.95 341.87,82.95 376.65,82.95C411.44,82.95 436,88.91 449.19,111.75C462.37,134.59 455.25,158.84 437.86,188.96C420.46,219.08 334.59,367.82 317.2,397.94C299.81,428.06 282.37,446.36 256,446.36H256Z"/> - <!-- thrust plume --> - <path - android:pathData="M253,153C249.82,187.48 225.67,262.17 167.98,285.04C110.3,307.92 73.96,318.12 63,320.36L256,399L449,320.36C438.04,318.12 401.7,307.92 344.02,285.04C286.33,262.17 262.18,187.48 259,153H256H253Z" - android:fillColor="#C6FF00" - android:fillType="evenOdd"/> - <path - android:pathData="M253,153C251.5,187.42 241.7,261.98 214.5,284.82C187.3,307.65 170.17,317.84 165,320.08L256,398.58L347,320.08C341.83,317.84 324.7,307.65 297.5,284.82C270.3,261.98 260.5,187.42 259,153H256H253Z" - android:fillColor="#ffffff" - android:fillType="evenOdd"/> - <path - android:pathData="M256,153m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" - android:fillColor="#ffffff"/> - <!-- android head and body --> - <path - android:pathData="M151,350h199v104h-199z" - android:fillColor="#5F6368"/> - <path - android:pathData="M358.42,350.44C358.36,350.02 358.29,349.6 358.22,349.18C357.8,346.6 357.27,344.04 356.65,341.52C355.57,337.12 354.21,332.82 352.59,328.66C351.22,325.13 349.66,321.7 347.93,318.38C345.7,314.11 343.18,310.01 340.41,306.11C337.01,301.34 333.21,296.86 329.06,292.74C327.32,291.01 325.52,289.34 323.65,287.73C319.62,284.26 315.32,281.09 310.78,278.26C310.82,278.19 310.85,278.12 310.89,278.05C312.97,274.46 315.05,270.88 317.13,267.29C319.17,263.78 321.2,260.28 323.23,256.77C324.69,254.26 326.15,251.74 327.61,249.22C327.95,248.62 328.22,248.01 328.43,247.37C329,245.61 329.02,243.76 328.57,242.03C328.45,241.61 328.31,241.19 328.14,240.78C327.97,240.38 327.77,239.98 327.54,239.6C326.76,238.29 325.65,237.16 324.26,236.33C323.02,235.6 321.64,235.16 320.23,235.03C319.64,234.98 319.04,234.99 318.45,235.05C317.96,235.1 317.47,235.19 316.99,235.32C315.26,235.77 313.67,236.72 312.42,238.08C311.98,238.57 311.58,239.12 311.23,239.71C309.77,242.23 308.31,244.75 306.85,247.27L300.76,257.78C298.68,261.37 296.6,264.96 294.52,268.55C294.29,268.94 294.06,269.33 293.83,269.73C293.52,269.6 293.21,269.48 292.89,269.36C281.43,264.99 269,262.6 256.01,262.6C255.65,262.6 255.3,262.6 254.94,262.6C243.39,262.72 232.29,264.73 221.93,268.33C220.73,268.75 219.55,269.19 218.38,269.65C218.16,269.29 217.95,268.92 217.74,268.55C215.66,264.96 213.58,261.38 211.5,257.79C209.47,254.28 207.43,250.78 205.4,247.27C203.94,244.76 202.48,242.23 201.02,239.72C200.68,239.12 200.28,238.58 199.83,238.09C198.59,236.72 196.99,235.78 195.27,235.32C194.79,235.2 194.3,235.1 193.81,235.05C193.22,234.99 192.62,234.99 192.03,235.04C190.61,235.16 189.23,235.6 188,236.34C186.6,237.16 185.5,238.3 184.71,239.6C184.49,239.99 184.29,240.38 184.12,240.79C183.95,241.2 183.8,241.61 183.69,242.04C183.23,243.76 183.26,245.62 183.82,247.38C184.03,248.01 184.3,248.63 184.65,249.23C186.11,251.74 187.57,254.26 189.02,256.78C191.06,260.28 193.09,263.79 195.12,267.29C197.2,270.88 199.28,274.47 201.36,278.06C201.38,278.09 201.4,278.12 201.41,278.15C197.22,280.76 193.23,283.64 189.47,286.8C187.21,288.69 185.04,290.68 182.96,292.75C178.81,296.87 175.01,301.35 171.6,306.12C168.82,310.02 166.31,314.11 164.09,318.39C162.35,321.71 160.79,325.14 159.42,328.67C157.8,332.83 156.44,337.13 155.36,341.53C154.75,344.05 154.22,346.6 153.79,349.19C153.72,349.61 153.66,350.03 153.59,350.45C153.36,351.95 153.16,353.46 153,354.98L359,354.98C358.84,353.46 358.64,351.95 358.41,350.45L358.42,350.44Z" - android:fillColor="#5F6368"/> - </group> - <!-- stars --> - <group> - <path - android:pathData="M131.04,134.34H127V138.38H131.04V134.34Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M167.04,256H163V260.04H167.04V256Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M373.49,127H369.45V131.04H373.49V127Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M292.04,226H288V230.04H292.04V226Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M319.04,186.91H315V190.95H319.04V186.91Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M355.04,222H351V226.04H355.04V222Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M192.04,136H188V140.04H192.04V136Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M336.08,196H328V204.08H336.08V196Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M222.04,212H218V216.04H222.04V212Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M163.08,175H155V183.08H163.08V175Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M211.08,143H203V151.08H211.08V143Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M369.08,204H361V212.08H369.08V204Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M169.21,204.34H161.13V212.42H169.21V204.34Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M383.04,160.07H374.95V168.15H383.04V160.07Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M192.08,183H184V191.08H192.08V183Z" - android:fillColor="#ffffff"/> - </group> - <!-- patch frame --> - <path - android:pathData="M256,446.36C229.63,446.36 212.19,428.06 194.8,397.94C177.41,367.82 91.54,219.08 74.14,188.96C56.75,158.84 49.63,134.59 62.81,111.75C76,88.91 100.56,82.95 135.35,82.95C170.13,82.95 341.87,82.95 376.65,82.95C411.44,82.95 436,88.91 449.19,111.75C462.37,134.59 455.25,158.84 437.86,188.96C420.46,219.08 334.59,367.82 317.2,397.94C299.81,428.06 282.37,446.36 256,446.36H256Z" + <path + android:pathData="M127,58.5L385,58.5A68.5,68.5 0,0 1,453.5 127L453.5,385A68.5,68.5 0,0 1,385 453.5L127,453.5A68.5,68.5 0,0 1,58.5 385L58.5,127A68.5,68.5 0,0 1,127 58.5z" android:strokeWidth="55" + android:fillColor="#1D2126" + android:strokeColor="#4285F4"/> + <path + android:pathData="M152.157,72C149.469,72 148.125,72 148.125,72C148.125,72 148.581,70.818 149.493,68.454L157.269,48.222C157.773,46.89 158.025,46.224 158.025,46.224C158.025,46.224 158.913,46.224 160.689,46.224C162.405,46.224 163.263,46.224 163.263,46.224C163.263,46.224 163.521,46.884 164.037,48.204L171.759,68.418C172.683,70.806 173.145,72 173.145,72C173.145,72 171.831,72 169.203,72C167.643,72 166.863,72 166.863,72C166.863,72 166.683,71.448 166.323,70.344L161.481,56.376L160.617,53.496H160.509L159.645,56.358L154.767,70.308C154.419,71.436 154.245,72 154.245,72C154.245,72 153.549,72 152.157,72ZM152.949,66.996L154.479,62.874H166.287L167.871,66.996H152.949ZM186.631,72C184.759,72 183.823,72 183.823,72C183.823,72 183.823,71.148 183.823,69.444V49.59C183.823,47.346 183.823,46.224 183.823,46.224C183.823,46.224 185.065,46.224 187.549,46.224C189.001,46.224 189.727,46.224 189.727,46.224C189.727,46.224 190.021,46.686 190.609,47.61L199.807,62.046H199.915L199.807,58.05V48.708C199.807,47.052 199.807,46.224 199.807,46.224C199.807,46.224 200.737,46.224 202.597,46.224C204.469,46.224 205.405,46.224 205.405,46.224C205.405,46.224 205.405,47.052 205.405,48.708V69.012C205.405,71.004 205.405,72 205.405,72C205.405,72 204.307,72 202.111,72C200.839,72 200.203,72 200.203,72C200.203,72 199.945,71.604 199.429,70.812L189.421,55.53H189.295L189.421,59.508V69.444C189.421,71.148 189.421,72 189.421,72C189.421,72 188.491,72 186.631,72ZM221.683,72C219.559,72 218.497,72 218.497,72C218.497,72 218.497,70.932 218.497,68.796V49.41C218.497,47.286 218.497,46.224 218.497,46.224C218.497,46.224 219.559,46.224 221.683,46.224H227.677C231.613,46.224 234.787,47.406 237.199,49.77C239.611,52.122 240.817,55.23 240.817,59.094C240.817,62.982 239.611,66.108 237.199,68.472C234.787,70.824 231.613,72 227.677,72H221.683ZM224.293,66.852H227.353C229.681,66.876 231.523,66.21 232.879,64.854C234.247,63.486 234.931,61.584 234.931,59.148C234.931,56.736 234.253,54.864 232.897,53.532C231.541,52.2 229.693,51.534 227.353,51.534H224.293V66.852ZM255.401,72C253.469,72 252.503,72 252.503,72C252.503,72 252.503,71.13 252.503,69.39V49.41C252.503,47.286 252.503,46.224 252.503,46.224C252.503,46.224 253.565,46.224 255.689,46.224H262.763C265.319,46.224 267.467,46.98 269.207,48.492C270.959,50.004 271.835,52.02 271.835,54.54C271.835,56.904 271.001,58.848 269.333,60.372C267.677,61.884 265.517,62.64 262.853,62.64H254.915V58.482H262.205C263.285,58.482 264.191,58.146 264.923,57.474C265.667,56.79 266.039,55.896 266.039,54.792C266.039,53.796 265.679,52.962 264.959,52.29C264.251,51.606 263.381,51.264 262.349,51.264H258.299V69.39C258.299,71.13 258.299,72 258.299,72C258.299,72 257.333,72 255.401,72ZM268.703,72C267.551,72 266.975,72 266.975,72C266.975,72 266.759,71.664 266.327,70.992L259.487,60.444L265.607,60.228L270.917,68.004C272.765,70.668 273.689,72 273.689,72C273.689,72 272.027,72 268.703,72ZM295.491,72.594C291.771,72.594 288.603,71.346 285.987,68.85C283.383,66.342 282.081,63.09 282.081,59.094C282.081,55.086 283.389,51.84 286.005,49.356C288.633,46.872 291.789,45.63 295.473,45.63C299.157,45.63 302.313,46.89 304.941,49.41C307.569,51.918 308.883,55.146 308.883,59.094C308.883,63.018 307.575,66.252 304.959,68.796C302.355,71.328 299.199,72.594 295.491,72.594ZM295.473,66.996C297.645,66.996 299.451,66.252 300.891,64.764C302.343,63.264 303.069,61.374 303.069,59.094C303.069,56.79 302.343,54.906 300.891,53.442C299.439,51.966 297.633,51.228 295.473,51.228C293.337,51.228 291.537,51.966 290.073,53.442C288.621,54.918 287.895,56.802 287.895,59.094C287.895,61.386 288.615,63.276 290.055,64.764C291.507,66.252 293.313,66.996 295.473,66.996ZM323.519,72C321.563,72 320.585,72 320.585,72C320.585,72 320.585,71.118 320.585,69.354V48.87C320.585,47.106 320.585,46.224 320.585,46.224C320.585,46.224 321.563,46.224 323.519,46.224C325.475,46.224 326.453,46.224 326.453,46.224C326.453,46.224 326.453,47.106 326.453,48.87V69.354C326.453,71.118 326.453,72 326.453,72C326.453,72 325.475,72 323.519,72ZM342.73,72C340.606,72 339.544,72 339.544,72C339.544,72 339.544,70.932 339.544,68.796V49.41C339.544,47.286 339.544,46.224 339.544,46.224C339.544,46.224 340.606,46.224 342.73,46.224H348.724C352.66,46.224 355.834,47.406 358.246,49.77C360.658,52.122 361.864,55.23 361.864,59.094C361.864,62.982 360.658,66.108 358.246,68.472C355.834,70.824 352.66,72 348.724,72H342.73ZM345.34,66.852H348.4C350.728,66.876 352.57,66.21 353.926,64.854C355.294,63.486 355.978,61.584 355.978,59.148C355.978,56.736 355.3,54.864 353.944,53.532C352.588,52.2 350.74,51.534 348.4,51.534H345.34V66.852Z" + android:fillColor="#ffffff"/> + <path + android:pathData="M196.971,198.17H257.84L196.971,259.04V198.17Z" + android:fillColor="#1F8E3D"/> + <path + android:pathData="M318.709,319.909L257.84,319.909L318.709,259.04L318.709,319.909Z" + android:fillColor="#1F8E3D"/> + <path + android:pathData="M318.709,198.17L318.709,259.04L257.84,198.17L318.709,198.17Z" + android:fillColor="#34A853"/> + <path + android:pathData="M196.971,319.909L196.971,259.04L257.84,319.909L196.971,319.909Z" + android:fillColor="#34A853"/> + <path + android:pathData="M257.84,259.04L196.971,259.04L257.84,198.171L257.84,259.04Z" + android:fillColor="#34A853"/> + <path + android:pathData="M257.84,198.17L196.971,198.17L257.84,137.301L257.84,198.17Z" + android:fillColor="#34A853"/> + <path + android:pathData="M257.84,319.909L318.709,319.909L257.84,380.778L257.84,319.909Z" + android:fillColor="#34A853"/> + <path + android:pathData="M257.84,259.04L318.709,259.04L257.84,319.91L257.84,259.04Z" + android:fillColor="#34A853"/> + <path + android:pathData="M318.709,259.04L379.579,259.04L318.709,319.91L318.709,259.04Z" + android:fillColor="#34A853"/> + <path + android:pathData="M196.971,259.04L136.101,259.04L196.971,198.171L196.971,259.04Z" + android:fillColor="#34A853"/> + <path + android:pathData="M257.84,259.04L257.84,198.171L318.709,259.04L257.84,259.04Z" + android:fillColor="#1F8E3D"/> + <path + android:pathData="M257.84,198.17L257.84,137.301L318.709,198.17L257.84,198.17Z" + android:fillColor="#1F8E3D"/> + <path + android:pathData="M257.84,319.909L257.84,380.778L196.971,319.909L257.84,319.909Z" + android:fillColor="#1F8E3D"/> + <path + android:pathData="M318.709,259.04L318.709,198.171L379.579,259.04L318.709,259.04Z" + android:fillColor="#1F8E3D"/> + <path + android:pathData="M196.971,259.04L196.971,319.91L136.101,259.04L196.971,259.04Z" + android:fillColor="#1F8E3D"/> + <path + android:pathData="M257.84,259.04L257.84,319.91L196.971,259.04L257.84,259.04Z" + android:fillColor="#1F8E3D"/> + <path + android:pathData="M342.409,405.074C340.766,405.074 339.348,404.477 338.153,403.282C336.989,402.088 336.406,400.654 336.406,398.982V355.485L328.567,361.129C327.462,361.935 326.222,362.219 324.849,361.98C323.475,361.741 322.385,361.054 321.579,359.919C320.772,358.785 320.488,357.53 320.727,356.157C320.996,354.753 321.683,353.633 322.788,352.797L339.497,340.881C339.915,340.582 340.363,340.314 340.841,340.075C341.319,339.806 341.961,339.671 342.767,339.671C344.35,339.671 345.679,340.239 346.754,341.374C347.859,342.479 348.412,343.852 348.412,345.495V398.982C348.412,400.654 347.814,402.088 346.62,403.282C345.455,404.477 344.051,405.074 342.409,405.074ZM382.377,405.522C375.449,405.522 369.804,403.447 365.444,399.296C361.114,395.144 358.949,389.873 358.949,383.482C358.949,379.122 359.919,375.046 361.86,371.253C363.831,367.46 366.534,363.339 369.969,358.889L382.646,342.538C383.572,341.344 384.766,340.627 386.23,340.388C387.723,340.149 389.082,340.448 390.306,341.284C391.68,342.27 392.486,343.554 392.725,345.137C392.964,346.719 392.546,348.153 391.471,349.437L383.452,359.651C382.228,361.174 379.719,363.309 375.926,366.057C372.164,368.804 369.595,374.553 368.221,383.303L361.726,383.258C362.652,376.21 365.504,371.029 370.282,367.714C375.09,364.399 380.272,362.742 385.826,362.742C391.322,362.742 396.01,364.653 399.893,368.476C403.775,372.268 405.716,377.211 405.716,383.303C405.716,389.724 403.521,395.04 399.131,399.251C394.771,403.432 389.186,405.522 382.377,405.522ZM382.332,395.04C385.826,395.04 388.693,393.965 390.933,391.815C393.203,389.664 394.338,386.902 394.338,383.527C394.338,380.212 393.203,377.48 390.933,375.329C388.693,373.149 385.856,372.059 382.422,372.059C378.958,372.059 376.076,373.149 373.776,375.329C371.507,377.48 370.372,380.227 370.372,383.572C370.372,386.887 371.492,389.634 373.731,391.815C376.001,393.965 378.868,395.04 382.332,395.04Z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M265.087,135.953L380.927,251.793A10.249,10.249 90,0 1,380.927 266.287L265.087,382.126A10.249,10.249 90,0 1,250.593 382.126L134.753,266.287A10.249,10.249 0,0 1,134.753 251.793L250.593,135.953A10.249,10.249 90,0 1,265.087 135.953z" + android:strokeWidth="14.3349" android:fillColor="#00000000" - android:strokeColor="#34A853"/> - <!-- text: ANDROID --> + android:strokeColor="#5F6368"/> + <path + android:pathData="M172.353,318.422C172.818,317.837 172.778,316.987 172.249,316.459V316.459C171.631,315.841 170.606,315.905 170.06,316.587C133.391,362.417 114.184,398.637 123.921,408.374C138.509,422.962 212.535,372.586 289.264,295.857C296.618,288.503 303.729,281.175 310.565,273.921C311.305,273.135 311.286,271.903 310.522,271.139L306.337,266.954C305.538,266.156 304.238,266.176 303.463,266.998C296.672,274.202 289.587,281.503 282.248,288.842C212.272,358.818 145.748,405.747 133.662,393.66C126.026,386.024 141.946,356.659 172.353,318.422Z" + android:fillColor="#C6FF00" + android:fillType="evenOdd"/> + <path + android:pathData="M347.267,248.089C348.867,247.66 350.512,248.61 350.941,250.21C351.37,251.81 350.42,253.455 348.82,253.884L347.267,248.089ZM348.82,253.884L321.452,261.217L319.899,255.422L347.267,248.089L348.82,253.884Z" + android:fillColor="#000000"/> + <path + android:pathData="M325.111,230.175C325.54,228.575 327.185,227.625 328.785,228.054C330.386,228.483 331.335,230.128 330.907,231.728L325.111,230.175ZM330.907,231.728L323.573,259.096L317.778,257.543L325.111,230.175L330.907,231.728Z" + android:fillColor="#000000"/> + <path + android:pathData="M335.665,242.984C327.494,234.813 314.434,234.623 306.498,242.559L288.774,260.283C287.243,261.814 287.243,264.3 288.774,265.831C290.306,267.363 292.791,267.363 294.323,265.831L299.1,261.054C302.165,257.989 307.132,257.989 310.197,261.054L317.595,268.452C320.66,271.517 320.66,276.484 317.595,279.549L312.818,284.326C311.286,285.858 311.286,288.344 312.818,289.875C314.349,291.406 316.835,291.406 318.366,289.875L336.09,272.151C344.026,264.215 343.836,251.155 335.665,242.984Z" + android:fillColor="#000000"/> + <path + android:pathData="M123.071,117.004l7.071,7.071l-7.071,7.071l-7.071,-7.071z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M108.071,332l7.071,7.071l-7.071,7.071l-7.071,-7.071z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M120.607,299l10.607,10.607l-10.607,10.607l-10.607,-10.607z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M123.071,183.435l7.071,7.071l-7.071,7.071l-7.071,-7.071z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M174.606,137l10.607,10.607l-10.607,10.607l-10.607,-10.607z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M145.214,139.149l7.071,7.071l-7.071,7.071l-7.071,-7.071z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M215.607,385l10.607,10.607l-10.607,10.607l-10.607,-10.607z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M227.071,110l7.071,7.071l-7.071,7.071l-7.071,-7.071z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M400.569,124.075l-7.071,7.071l-7.071,-7.071l7.071,-7.071z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M388.213,149.606l-10.607,10.607l-10.607,-10.607l10.607,-10.607z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M331.142,121.071l-7.071,7.071l-7.071,-7.071l7.071,-7.071z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M338.142,153.071l-7.071,7.071l-7.071,-7.071l7.071,-7.071z" + android:fillColor="#E8F5E9"/> + <path + android:pathData="M374.142,320.071l-7.071,7.071l-7.071,-7.071l7.071,-7.071z" + android:fillColor="#E8F5E9"/> <path - android:pathData="M170.11,92.71C170.97,94.9 171.41,96 171.41,96C171.41,96 170.37,96 168.29,96C166.22,96 165.18,96 165.18,96C165.18,96 164.93,95.27 164.42,93.82L159.71,80.63L158.82,77.75H158.61L157.82,80.63L153.28,93.82C152.82,95.27 152.6,96 152.6,96C152.6,96 151.54,96 149.43,96C147.33,96 146.28,96 146.28,96C146.28,96 146.7,94.89 147.56,92.67L155.21,72.87C155.89,71.07 156.23,70.17 156.23,70.17C156.23,70.17 157.06,70.17 158.72,70.17C160.52,70.17 161.42,70.17 161.42,70.17C161.42,70.17 161.76,71.07 162.46,72.87L170.11,92.71ZM166.04,91.12H158.64V86.91H164.42L166.04,91.12ZM158.64,91.12H151.08L152.63,86.91H158.64V91.12ZM203.85,93.46C203.85,95.15 203.85,96 203.85,96C203.85,96 202.95,96 201.15,96C199.38,96 198.5,96 198.5,96C198.5,96 198.03,95.26 197.08,93.79L188.08,79.75H187.88L188.01,83.45V93.25C188.01,95.08 188.01,96 188.01,96C188.01,96 187.03,96 185.09,96C183.15,96 182.17,96 182.17,96C182.17,96 182.17,95.08 182.17,93.25L182.16,73.9C182.16,71.45 182.16,70.22 182.16,70.22C182.16,70.22 183.19,70.22 185.25,70.22C187.24,70.22 188.24,70.22 188.24,70.22C188.24,70.22 188.7,70.96 189.63,72.42L198.16,85.85H198.36L198.21,82.09V72.89C198.21,71.11 198.21,70.22 198.21,70.22C198.21,70.22 199.15,70.22 201.04,70.22C202.91,70.22 203.85,70.22 203.85,70.22C203.85,70.22 203.85,71.11 203.85,72.89V93.46ZM226.52,96H220.17C218.24,96 217.27,96 217.27,96C217.27,96 217.27,95.02 217.27,93.05V73.19C217.27,71.21 217.27,70.22 217.27,70.22C217.27,70.22 218.24,70.22 220.17,70.22H226.52C230.46,70.22 233.63,71.41 236.03,73.77C238.43,76.12 239.63,79.23 239.63,83.09C239.63,86.98 238.43,90.11 236.03,92.47C233.63,94.82 230.46,96 226.52,96ZM223.17,75.64V90.74H226.18C228.46,90.77 230.27,90.11 231.62,88.78C232.96,87.44 233.63,85.57 233.63,83.17C233.63,80.78 232.96,78.93 231.62,77.62C230.28,76.3 228.47,75.64 226.18,75.64H223.17ZM257.51,93.23C257.51,95.08 257.51,96 257.51,96C257.51,96 256.54,96 254.6,96C252.66,96 251.7,96 251.7,96C251.7,96 251.7,95.09 251.7,93.26V73.19C251.7,71.21 251.7,70.22 251.7,70.22C251.7,70.22 252.66,70.22 254.6,70.22H261.89C264.44,70.22 266.6,70.98 268.35,72.49C270.1,74 270.98,76.03 270.98,78.56C270.98,80.9 270.14,82.83 268.47,84.35C266.81,85.87 264.65,86.62 262.01,86.62H254.02V82.41H261.33C262.4,82.41 263.29,82.08 264.01,81.42C264.73,80.75 265.09,79.88 265.09,78.81C265.09,77.84 264.74,77.03 264.05,76.38C263.35,75.72 262.49,75.39 261.47,75.39H257.51V93.23ZM264.77,93.82L258.66,84.46L264.8,84.25L271.23,93.62C272.37,95.21 272.94,96 272.94,96C272.94,96 271.82,96 269.57,96C267.3,96 266.17,96 266.17,96C266.17,96 265.7,95.27 264.77,93.82ZM296.04,96.58C292.33,96.58 289.16,95.33 286.52,92.85C283.89,90.37 282.58,87.11 282.58,83.09C282.58,79.07 283.9,75.83 286.54,73.36C289.19,70.88 292.36,69.65 296.04,69.65C299.71,69.65 302.87,70.9 305.51,73.41C308.16,75.91 309.49,79.13 309.49,83.09C309.49,87.03 308.17,90.26 305.53,92.8C302.9,95.32 299.74,96.58 296.04,96.58ZM296.04,90.83C298.19,90.83 299.98,90.1 301.41,88.64C302.85,87.17 303.57,85.33 303.57,83.09C303.57,80.84 302.84,78.99 301.39,77.55C299.95,76.11 298.17,75.39 296.04,75.39C293.92,75.39 292.13,76.12 290.68,77.57C289.24,79.01 288.52,80.85 288.52,83.09C288.52,85.35 289.23,87.2 290.66,88.66C292.1,90.11 293.89,90.83 296.04,90.83ZM327.64,93.05C327.64,95.02 327.64,96 327.64,96C327.64,96 326.63,96 324.61,96C322.59,96 321.57,96 321.57,96C321.57,96 321.57,95.02 321.57,93.05V73.18C321.57,71.21 321.57,70.22 321.57,70.22C321.57,70.22 322.58,70.22 324.6,70.22C326.63,70.22 327.64,70.22 327.64,70.22C327.64,70.22 327.64,71.21 327.64,73.18V93.05ZM350.31,96H343.96C342.03,96 341.06,96 341.06,96C341.06,96 341.06,95.02 341.06,93.05V73.19C341.06,71.21 341.06,70.22 341.06,70.22C341.06,70.22 342.03,70.22 343.96,70.22H350.31C354.25,70.22 357.42,71.41 359.82,73.77C362.22,76.12 363.42,79.23 363.42,83.09C363.42,86.98 362.22,90.11 359.82,92.47C357.42,94.82 354.25,96 350.31,96ZM346.96,75.64V90.74H349.97C352.25,90.77 354.06,90.11 355.41,88.78C356.75,87.44 357.42,85.57 357.42,83.17C357.42,80.78 356.75,78.93 355.41,77.62C354.07,76.3 352.26,75.64 349.97,75.64H346.96Z" - android:fillColor="#E9F3EB"/> - <!-- text: 15 --> + android:pathData="M307.213,109.607l-10.607,10.607l-10.607,-10.607l10.607,-10.607z" + android:fillColor="#E8F5E9"/> <path - android:pathData="M236.59,363.25C236.59,365.75 236.59,367 236.59,367C236.59,367 235.32,367 232.79,367C230.32,367 229.09,367 229.09,367C229.09,367 229.09,365.75 229.09,363.25V305.85L216.64,314.75C215,315.92 214.19,316.5 214.19,316.5C214.19,316.5 213.54,315.5 212.24,313.5C210.97,311.6 210.34,310.65 210.34,310.65C210.34,310.62 211.2,309.98 212.94,308.75L227.64,298.2C230.3,296.23 231.64,295.25 231.64,295.25C231.64,295.25 232.1,295.25 233.04,295.25C235.4,295.25 236.59,295.25 236.59,295.25C236.59,295.25 236.59,296.47 236.59,298.9V363.25ZM247.09,330L251.19,299C251.52,296.6 251.69,295.4 251.69,295.4C251.69,295.4 252.77,295.4 254.94,295.4H284.54C286.97,295.4 288.19,295.4 288.19,295.4C288.19,295.4 288.19,296.58 288.19,298.95C288.19,301.48 288.19,302.75 288.19,302.75C288.19,302.75 286.97,302.75 284.54,302.75H257.49L254.19,327.45L254.39,327.5C256.09,325.77 258.27,324.38 260.94,323.35C263.61,322.28 266.65,321.75 270.09,321.75C276.55,321.75 281.99,323.97 286.39,328.4C290.79,332.8 292.99,338.32 292.99,344.95C292.99,351.75 290.8,357.4 286.44,361.9C282.11,366.37 276.42,368.6 269.39,368.6C263.09,368.6 257.77,367 253.44,363.8C249.1,360.6 246.26,356.85 244.89,352.55C244.26,350.32 243.94,349.2 243.94,349.2C243.94,349.2 245.09,348.77 247.39,347.9C249.79,347 250.99,346.55 250.99,346.55C250.99,346.55 251.3,347.73 251.94,350.1C252.8,352.73 254.71,355.27 257.64,357.7C260.61,360.13 264.44,361.35 269.14,361.35C274.27,361.35 278.24,359.88 281.04,356.95C283.84,353.98 285.24,350.03 285.24,345.1C285.24,340.37 283.67,336.52 280.54,333.55C277.44,330.58 273.4,329.1 268.44,329.1C265.47,329.1 262.95,329.52 260.89,330.35C258.82,331.15 257.09,332.28 255.69,333.75C254.39,335.25 253.74,336 253.74,336C253.74,336 252.55,335.52 250.19,334.55C247.85,333.62 246.69,333.15 246.69,333.15C246.69,333.15 246.82,332.1 247.09,330Z" - android:fillColor="#E9F3EB"/> - <!-- spacecraft --> + android:pathData="M181.142,353.071l-7.071,7.071l-7.071,-7.071l7.071,-7.071z" + android:fillColor="#E8F5E9"/> <path - android:pathData="M256.12,121C249.43,121 244,126.27 244,132.77V147.29C244,148.54 245.02,149.56 246.27,149.56C247.53,149.56 248.55,148.55 248.55,147.29V143.38C248.55,140.87 250.58,138.83 253.09,138.83H259.15C261.66,138.83 263.7,140.87 263.7,143.38V147.29C263.7,148.54 264.71,149.56 265.97,149.56C267.23,149.56 268.24,148.55 268.24,147.29V132.77C268.24,126.27 262.82,121 256.12,121H256.12Z" - android:fillColor="#E9F3EB"/> + android:pathData="M400.573,190.501l-10.607,10.607l-10.607,-10.607l10.607,-10.607z" + android:fillColor="#E8F5E9"/> </vector> diff --git a/core/res/res/drawable-nodpi/stat_sys_adb.xml b/core/res/res/drawable-nodpi/stat_sys_adb.xml index 6ce4b9d13123..973010ec41ef 100644 --- a/core/res/res/drawable-nodpi/stat_sys_adb.xml +++ b/core/res/res/drawable-nodpi/stat_sys_adb.xml @@ -1,3 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2024 The Android Open Source Project @@ -13,7 +14,6 @@ Copyright (C) 2024 The Android Open Source Project See the License for the specific language governing permissions and limitations under the License. --> - <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" @@ -21,104 +21,35 @@ Copyright (C) 2024 The Android Open Source Project android:viewportHeight="24"> <group> <clip-path - android:pathData=" - M12.6495 17.375 - C12.3608 17.875 11.6392 17.875 11.3505 17.375 - L3.98927 4.625 - C3.70059 4.125 4.06143 3.5 4.63878 3.5 - L19.3612 3.5 - C19.9386 3.5 20.2994 4.125 20.0107 4.625 - L12.6495 17.375 - Z - "/> + android:pathData="M0,0h24v24h-24z"/> + <path + android:pathData="M12,8V12H8L12,8Z" + android:fillColor="#D9D9D9"/> + <path + android:pathData="M12,4V8H8L12,4Z" + android:fillColor="#D9D9D9"/> + <path + android:pathData="M8,8V12H4L8,8Z" + android:fillColor="#D9D9D9"/> + <path + android:pathData="M12,16L12,12L16,12L12,16Z" + android:fillColor="#D9D9D9"/> <path - android:pathData="M5,12 h14v9.8h-14z" - android:fillColor="#ffffff"/> + android:pathData="M12,20L12,16L16,16L12,20Z" + android:fillColor="#D9D9D9"/> <path - android:pathData=" - M15.97 10.48 - C15.97 10.46 15.97 10.45 15.96 10.43 - C15.95 10.33 15.93 10.23 15.90 10.13 - C15.86 9.96 15.81 9.79 15.75 9.63 - C15.69 9.50 15.63 9.36 15.57 9.23 - C15.48 9.07 15.38 8.91 15.27 8.76 - C15.14 8.57 14.99 8.40 14.83 8.24 - C14.76 8.17 14.69 8.11 14.62 8.04 - C14.47 7.91 14.30 7.78 14.12 7.67 - C14.12 7.67 14.13 7.67 14.13 7.67 - C14.21 7.53 14.29 7.39 14.37 7.25 - C14.45 7.11 14.53 6.98 14.61 6.84 - C14.66 6.74 14.72 6.64 14.78 6.55 - C14.79 6.52 14.80 6.50 14.81 6.48 - C14.83 6.41 14.83 6.33 14.81 6.27 - C14.81 6.25 14.80 6.24 14.80 6.22 - C14.79 6.20 14.78 6.19 14.77 6.17 - C14.74 6.12 14.70 6.08 14.65 6.05 - C14.60 6.02 14.54 6 14.49 6 - C14.47 5.99 14.44 5.99 14.42 6 - C14.40 6 14.38 6 14.36 6.01 - C14.30 6.02 14.23 6.06 14.19 6.11 - C14.17 6.13 14.15 6.15 14.14 6.18 - C14.08 6.28 14.03 6.37 13.97 6.47 - L13.73 6.88 - C13.65 7.02 13.57 7.16 13.49 7.30 - C13.48 7.31 13.47 7.33 13.46 7.34 - C13.45 7.34 13.44 7.33 13.43 7.33 - C12.98 7.16 12.50 7.07 12 7.07 - C11.98 7.07 11.97 7.07 11.95 7.07 - C11.51 7.07 11.07 7.15 10.67 7.29 - C10.63 7.31 10.58 7.32 10.53 7.34 - C10.53 7.33 10.52 7.31 10.51 7.30 - C10.43 7.16 10.35 7.02 10.27 6.88 - C10.19 6.74 10.11 6.61 10.03 6.47 - C9.97 6.37 9.92 6.28 9.86 6.18 - C9.85 6.15 9.83 6.13 9.81 6.11 - C9.77 6.06 9.70 6.03 9.64 6.01 - C9.62 6 9.60 6 9.58 6 - C9.56 5.99 9.53 5.99 9.51 6 - C9.46 6 9.40 6.02 9.35 6.05 - C9.30 6.08 9.26 6.12 9.23 6.17 - C9.22 6.19 9.21 6.20 9.20 6.22 - C9.20 6.24 9.19 6.25 9.19 6.27 - C9.17 6.34 9.17 6.41 9.19 6.48 - C9.20 6.50 9.21 6.52 9.22 6.55 - C9.28 6.65 9.34 6.74 9.39 6.84 - C9.47 6.98 9.55 7.11 9.63 7.25 - C9.71 7.39 9.79 7.53 9.87 7.67 - C9.87 7.67 9.87 7.67 9.88 7.67 - C9.71 7.77 9.56 7.88 9.41 8.01 - C9.32 8.08 9.24 8.16 9.16 8.24 - C9 8.40 8.85 8.57 8.72 8.76 - C8.61 8.91 8.51 9.07 8.43 9.23 - C8.36 9.36 8.30 9.50 8.24 9.63 - C8.18 9.79 8.13 9.96 8.09 10.13 - C8.06 10.23 8.04 10.33 8.03 10.43 - C8.02 10.45 8.02 10.46 8.02 10.48 - C8.01 10.54 8 10.60 8 10.65 - L16 10.65 - C15.99 10.60 15.98 10.54 15.97 10.48 - L15.97 10.48 - Z - " - android:fillColor="#ffffff"/> + android:pathData="M16,16L16,12L20,12L16,16Z" + android:fillColor="#D9D9D9"/> + <path + android:pathData="M12,8L16,8L16,12L12,8Z" + android:fillColor="#D9D9D9"/> + <path + android:pathData="M12,16L8,16L8,12L12,16Z" + android:fillColor="#D9D9D9"/> + <path + android:pathData="M13.096,2.0354L21.9646,10.904A1.55,1.55 90,0 1,21.9646 13.096L13.096,21.9646A1.55,1.55 90,0 1,10.904 21.9646L2.0354,13.096A1.55,1.55 0,0 1,2.0354 10.904L10.904,2.0354A1.55,1.55 0,0 1,13.096 2.0354z" + android:strokeWidth="1.5" + android:fillColor="#00000000" + android:strokeColor="#FF00FF"/> </group> - <path - android:pathData=" - M12,20.923 - C10.764,20.923 9.946,20.065 9.131,18.653 - C8.316,17.241 4.291,10.269 3.476,8.857 - C2.66,7.445 2.326,6.309 2.944,5.238 - C3.563,4.167 4.714,3.888 6.344,3.888 - C7.975,3.888 16.025,3.888 17.656,3.888 - C19.286,3.888 20.437,4.167 21.056,5.238 - C21.674,6.309 21.34,7.445 20.524,8.857 - C19.709,10.269 15.684,17.241 14.869,18.653 - C14.054,20.065 13.236,20.923 12,20.923 - H12 - Z - " - android:strokeWidth="2" - android:fillColor="#00000000" - android:strokeColor="#ffffff"/> </vector> - diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index ca542ba8722b..66bc41fbb82b 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1160,20 +1160,20 @@ <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> J"</string> <string name="duration_minutes_shortest_past" msgid="1740022450020492407">"vor <xliff:g id="COUNT">%d</xliff:g> Min."</string> <string name="duration_hours_shortest_past" msgid="2098397414186628489">"vor <xliff:g id="COUNT">%d</xliff:g> Std."</string> - <string name="duration_days_shortest_past" msgid="1832006037955897625">"vor <xliff:g id="COUNT">%d</xliff:g> Tg."</string> - <string name="duration_years_shortest_past" msgid="6168256514200469291">"vor <xliff:g id="COUNT">%d</xliff:g> J."</string> + <string name="duration_days_shortest_past" msgid="1832006037955897625">"vor <xliff:g id="COUNT">%d</xliff:g> T"</string> + <string name="duration_years_shortest_past" msgid="6168256514200469291">"vor <xliff:g id="COUNT">%d</xliff:g> J"</string> <string name="duration_minutes_medium" msgid="5891933490342643944">"<xliff:g id="COUNT">%d</xliff:g> Min."</string> <string name="duration_hours_medium" msgid="1465359726485910115">"<xliff:g id="COUNT">%d</xliff:g> Std."</string> - <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> Tg."</string> - <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> J."</string> + <string name="duration_days_medium" msgid="5994225628248661388">"<xliff:g id="COUNT">%d</xliff:g> T"</string> + <string name="duration_years_medium" msgid="734023884353592526">"<xliff:g id="COUNT">%d</xliff:g> J"</string> <string name="duration_minutes_medium_future" msgid="2750894988731934402">"in <xliff:g id="COUNT">%d</xliff:g> Min."</string> <string name="duration_hours_medium_future" msgid="6050833881463849764">"in <xliff:g id="COUNT">%d</xliff:g> Std."</string> - <string name="duration_days_medium_future" msgid="1700821545602729963">"in <xliff:g id="COUNT">%d</xliff:g> Tg."</string> - <string name="duration_years_medium_future" msgid="3281018940397120166">"in <xliff:g id="COUNT">%d</xliff:g> J."</string> + <string name="duration_days_medium_future" msgid="1700821545602729963">"in <xliff:g id="COUNT">%d</xliff:g> T"</string> + <string name="duration_years_medium_future" msgid="3281018940397120166">"in <xliff:g id="COUNT">%d</xliff:g> J"</string> <string name="duration_minutes_medium_past" msgid="7400424340181947714">"vor <xliff:g id="COUNT">%d</xliff:g> Min."</string> <string name="duration_hours_medium_past" msgid="6709441336035202617">"vor <xliff:g id="COUNT">%d</xliff:g> Std."</string> - <string name="duration_days_medium_past" msgid="5748156261134344532">"vor <xliff:g id="COUNT">%d</xliff:g> Tg."</string> - <string name="duration_years_medium_past" msgid="893797065424596243">"vor <xliff:g id="COUNT">%d</xliff:g> J."</string> + <string name="duration_days_medium_past" msgid="5748156261134344532">"vor <xliff:g id="COUNT">%d</xliff:g> T"</string> + <string name="duration_years_medium_past" msgid="893797065424596243">"vor <xliff:g id="COUNT">%d</xliff:g> J"</string> <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Vor # Minute}other{Vor # Minuten}}"</string> <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Vor # Stunde}other{Vor # Stunden}}"</string> <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Vor # Tag}other{Vor # Tagen}}"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 0ddbc41a8cec..0c7d868e02f3 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1404,7 +1404,7 @@ <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"Last ned <xliff:g id="APP_NAME">%1$s</xliff:g>-appen for å aktivere det nye SIM-kortet ditt"</string> <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"Last ned appen"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"Et nytt SIM-kort er satt inn"</string> - <string name="carrier_app_notification_text" msgid="6567057546341958637">"Trykk for å konfigurere"</string> + <string name="carrier_app_notification_text" msgid="6567057546341958637">"Konfigurer"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"Angi tidspunkt"</string> <string name="date_picker_dialog_title" msgid="5030520449243071926">"Angi dato"</string> <string name="date_time_set" msgid="4603445265164486816">"Lagre"</string> @@ -1469,7 +1469,7 @@ <string name="ext_media_checking_notification_message" product="tv" msgid="7986154434946021415">"Analyserer medielagring"</string> <string name="ext_media_new_notification_title" msgid="3517407571407687677">"Ny <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_new_notification_title" product="automotive" msgid="9085349544984742727">"<xliff:g id="NAME">%s</xliff:g> fungerer ikke"</string> - <string name="ext_media_new_notification_message" msgid="6095403121990786986">"Trykk for å konfigurere"</string> + <string name="ext_media_new_notification_message" msgid="6095403121990786986">"Konfigurer"</string> <string name="ext_media_new_notification_message" product="tv" msgid="216863352100263668">"Velg for å konfigurere"</string> <string name="ext_media_new_notification_message" product="automotive" msgid="5140127881613227162">"Du må muligens reformatere enheten. Trykk for å løse ut."</string> <string name="ext_media_ready_notification_message" msgid="7509496364380197369">"For lagring av bilder, videoer, musikk med mer"</string> @@ -1481,7 +1481,7 @@ <string name="ext_media_unmountable_notification_message" product="automotive" msgid="2274596120715020680">"Du må muligens reformatere enheten. Trykk for å løse ut."</string> <string name="ext_media_unsupported_notification_title" msgid="3487534182861251401">"<xliff:g id="NAME">%s</xliff:g> er oppdaget"</string> <string name="ext_media_unsupported_notification_title" product="automotive" msgid="6004193172658722381">"<xliff:g id="NAME">%s</xliff:g> fungerer ikke"</string> - <string name="ext_media_unsupported_notification_message" msgid="8463636521459807981">"Trykk for å konfigurere."</string> + <string name="ext_media_unsupported_notification_message" msgid="8463636521459807981">"Konfigurer."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="1595482802187036532">"Velg for å konfigurere <xliff:g id="NAME">%s</xliff:g> i et format som støttes."</string> <string name="ext_media_unsupported_notification_message" product="automotive" msgid="3412494732736336330">"Du må muligens reformatere enheten"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> ble uventet fjernet"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index c9a922eae470..3414644ed80e 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1019,7 +1019,7 @@ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="6902979937802238429">"तपाईंको SIM कार्ड सदाका लागि डिएक्टिभेट गरिएको छ।\n आफ्नो वायरलेस सेवा प्रदायकलाई सम्पर्क गरी अर्को SIM कार्ड प्राप्त गर्नुहोस्।"</string> <string name="lockscreen_transport_prev_description" msgid="2879469521751181478">"अघिल्लो ट्रयाक"</string> <string name="lockscreen_transport_next_description" msgid="2931509904881099919">"अर्को ट्रयाक"</string> - <string name="lockscreen_transport_pause_description" msgid="6705284702135372494">"रोक्नुहोस्"</string> + <string name="lockscreen_transport_pause_description" msgid="6705284702135372494">"पज गर्नुहोस्"</string> <string name="lockscreen_transport_play_description" msgid="106868788691652733">"चलाउनुहोस्"</string> <string name="lockscreen_transport_stop_description" msgid="1449552232598355348">"रोक्नुहोस्"</string> <string name="lockscreen_transport_rew_description" msgid="7680106856221622779">"दोहोर्याउनुहोस्"</string> diff --git a/core/res/res/values/config_display.xml b/core/res/res/values/config_display.xml index c458d0e9a3c0..b6500b71e8a9 100644 --- a/core/res/res/values/config_display.xml +++ b/core/res/res/values/config_display.xml @@ -31,5 +31,8 @@ <bool name="config_evenDimmerEnabled">false</bool> <!-- Jar file path to look for PluginProvider --> <string name="config_pluginsProviderJarPath"/> - + <!-- Indicate available EM_VALUE options --> + <integer-array name="config_availableEMValueOptions"> + <item>0</item> <!-- DEFAULT --> + </integer-array> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6ee2839788af..4789624685c2 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1309,6 +1309,7 @@ <java-symbol type="array" name="config_securityStatePackages" /> <java-symbol type="array" name="stoppable_fgs_system_apps" /> <java-symbol type="array" name="vendor_stoppable_fgs_system_apps" /> + <java-symbol type="array" name="config_availableEMValueOptions" /> <java-symbol type="drawable" name="default_wallpaper" /> <java-symbol type="drawable" name="default_lock_wallpaper" /> diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp index 3ef3dfdc0183..d7c4212dda07 100644 --- a/core/tests/coretests/Android.bp +++ b/core/tests/coretests/Android.bp @@ -73,6 +73,7 @@ android_test { "frameworks-core-util-lib", "mockwebserver", "guava", + "guava-android-testlib", "android.app.usage.flags-aconfig-java", "android.view.accessibility.flags-aconfig-java", "androidx.core_core", diff --git a/core/tests/coretests/src/android/app/BackgroundStartPrivilegesTest.java b/core/tests/coretests/src/android/app/BackgroundStartPrivilegesTest.java index 931d64640ea2..f1925bb74981 100644 --- a/core/tests/coretests/src/android/app/BackgroundStartPrivilegesTest.java +++ b/core/tests/coretests/src/android/app/BackgroundStartPrivilegesTest.java @@ -29,6 +29,8 @@ import android.os.IBinder; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.google.common.testing.EqualsTester; + import org.junit.Test; import org.junit.runner.RunWith; @@ -122,12 +124,16 @@ public class BackgroundStartPrivilegesTest { @Test public void backgroundStartPrivilege_equals_works() { - assertThat(NONE).isEqualTo(NONE); - assertThat(ALLOW_BAL).isEqualTo(ALLOW_BAL); - assertThat(ALLOW_FGS).isEqualTo(ALLOW_FGS); - assertThat(BSP_ALLOW_A).isEqualTo(BSP_ALLOW_A); - assertThat(NONE).isNotEqualTo(ALLOW_BAL); - assertThat(ALLOW_FGS).isNotEqualTo(ALLOW_BAL); - assertThat(BSP_ALLOW_A).isNotEqualTo(BSP_ALLOW_B); + Binder token = new Binder(); + Binder anotherToken = new Binder(); + new EqualsTester() + .addEqualityGroup(NONE) + .addEqualityGroup(ALLOW_BAL) + .addEqualityGroup(ALLOW_FGS) + .addEqualityGroup(BackgroundStartPrivileges.allowBackgroundActivityStarts(token), + BackgroundStartPrivileges.allowBackgroundActivityStarts(token)) + .addEqualityGroup( + BackgroundStartPrivileges.allowBackgroundActivityStarts(anotherToken)) + .testEquals(); } } diff --git a/core/tests/coretests/src/android/app/NotificationManagerTest.java b/core/tests/coretests/src/android/app/NotificationManagerTest.java index a47fc9436226..6538ce85457c 100644 --- a/core/tests/coretests/src/android/app/NotificationManagerTest.java +++ b/core/tests/coretests/src/android/app/NotificationManagerTest.java @@ -18,9 +18,11 @@ package android.app; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -104,6 +106,22 @@ public class NotificationManagerTest { @Test @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) + public void notifyAsPackage_rapidUpdate_isThrottled() throws Exception { + Notification n = exampleNotification(); + + for (int i = 0; i < 100; i++) { + mNotificationManager.notifyAsPackage("some.package.name", "tag", 1, n); + mClock.advanceByMillis(5); + } + + verify(mNotificationManager.mBackendService, atLeast(20)).enqueueNotificationWithTag( + eq("some.package.name"), any(), any(), anyInt(), any(), anyInt()); + verify(mNotificationManager.mBackendService, atMost(30)).enqueueNotificationWithTag( + eq("some.package.name"), any(), any(), anyInt(), any(), anyInt()); + } + + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) public void cancel_unnecessaryAndRapid_isThrottled() throws Exception { for (int i = 0; i < 100; i++) { @@ -165,6 +183,66 @@ public class NotificationManagerTest { any(), any(), anyInt(), anyInt()); } + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) + public void enqueue_afterCancel_isNotUpdateAndIsNotThrottled() throws Exception { + // First, hit the enqueue threshold. + Notification n = exampleNotification(); + for (int i = 0; i < 100; i++) { + mNotificationManager.notify(1, n); + mClock.advanceByMillis(1); + } + verify(mNotificationManager.mBackendService, atMost(30)).enqueueNotificationWithTag(any(), + any(), any(), anyInt(), any(), anyInt()); + reset(mNotificationManager.mBackendService); + + // Now cancel that notification and then post it again. That should work. + mNotificationManager.cancel(1); + mNotificationManager.notify(1, n); + verify(mNotificationManager.mBackendService).enqueueNotificationWithTag(any(), any(), any(), + anyInt(), any(), anyInt()); + } + + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) + public void enqueue_afterCancelAsPackage_isNotUpdateAndIsNotThrottled() throws Exception { + // First, hit the enqueue threshold. + Notification n = exampleNotification(); + for (int i = 0; i < 100; i++) { + mNotificationManager.notify(1, n); + mClock.advanceByMillis(1); + } + verify(mNotificationManager.mBackendService, atMost(30)).enqueueNotificationWithTag(any(), + any(), any(), anyInt(), any(), anyInt()); + reset(mNotificationManager.mBackendService); + + // Now cancel that notification and then post it again. That should work. + mNotificationManager.cancelAsPackage(mContext.getPackageName(), /* tag= */ null, 1); + mNotificationManager.notify(1, n); + verify(mNotificationManager.mBackendService).enqueueNotificationWithTag(any(), any(), any(), + anyInt(), any(), anyInt()); + } + + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_THROTTLE_NOTIFY) + public void enqueue_afterCancelAll_isNotUpdateAndIsNotThrottled() throws Exception { + // First, hit the enqueue threshold. + Notification n = exampleNotification(); + for (int i = 0; i < 100; i++) { + mNotificationManager.notify(1, n); + mClock.advanceByMillis(1); + } + verify(mNotificationManager.mBackendService, atMost(30)).enqueueNotificationWithTag(any(), + any(), any(), anyInt(), any(), anyInt()); + reset(mNotificationManager.mBackendService); + + // Now cancel all notifications and then post it again. That should work. + mNotificationManager.cancelAll(); + mNotificationManager.notify(1, n); + verify(mNotificationManager.mBackendService).enqueueNotificationWithTag(any(), any(), any(), + anyInt(), any(), anyInt()); + } + private Notification exampleNotification() { return new Notification.Builder(mContext, "channel") .setSmallIcon(android.R.drawable.star_big_on) diff --git a/core/tests/coretests/src/android/hardware/display/DisplayTopologyTest.kt b/core/tests/coretests/src/android/hardware/display/DisplayTopologyTest.kt index 255d09b854bd..008db5ef114e 100644 --- a/core/tests/coretests/src/android/hardware/display/DisplayTopologyTest.kt +++ b/core/tests/coretests/src/android/hardware/display/DisplayTopologyTest.kt @@ -22,6 +22,7 @@ import android.hardware.display.DisplayTopology.TreeNode.POSITION_BOTTOM import android.hardware.display.DisplayTopology.TreeNode.POSITION_LEFT import android.hardware.display.DisplayTopology.TreeNode.POSITION_TOP import android.hardware.display.DisplayTopology.TreeNode.POSITION_RIGHT +import android.util.SparseArray import android.view.Display import com.google.common.truth.Truth.assertThat import org.junit.Test @@ -642,13 +643,65 @@ class DisplayTopologyTest { verifyDisplay( root.children[0], id = 1, width = 30f, height = 30f, POSITION_RIGHT, offset = 10f, noOfChildren = 1) - // In the case of corner adjacency, we prefer a left/right attachment. verifyDisplay( root.children[0].children[0], id = 2, width = 29.5f, height = 30f, POSITION_BOTTOM, offset = 30f, noOfChildren = 0) } @Test + fun rearrange_preferLessShiftInOverlapDimension() { + val root = rearrangeRects( + // '*' represents overlap + // Clamping requires moving display 2 and 1 slightly to avoid overlap with 0. We should + // shift the minimal amount to avoid overlap - e.g. display 2 shifts left (10 pixels) + // rather than up (20 pixels). + // 222 + // 22*00 + // 22*00 + // 0**1 + // 111 + // 111 + RectF(20f, 10f, 50f, 40f), + RectF(30f, 30f, 60f, 60f), + RectF(0f, 0f, 30f, 30f), + ) + + verifyDisplay(root, id = 0, width = 30f, height = 30f, noOfChildren = 2) + verifyDisplay( + root.children[0], id = 1, width = 30f, height = 30f, POSITION_BOTTOM, offset = 10f, + noOfChildren = 0) + verifyDisplay( + root.children[1], id = 2, width = 30f, height = 30f, POSITION_LEFT, offset = -10f, + noOfChildren = 0) + } + + @Test + fun rearrange_doNotAttachCornerForShortOverlapOnLongEdgeBottom() { + val root = rearrangeRects( + RectF(0f, 0f, 1920f, 1080f), + RectF(1850f, 1070f, 3770f, 2150f), + ) + + verifyDisplay(root, id = 0, width = 1920f, height = 1080f, noOfChildren = 1) + verifyDisplay( + root.children[0], id = 1, width = 1920f, height = 1080f, POSITION_BOTTOM, + offset = 1850f, noOfChildren = 0) + } + + @Test + fun rearrange_doNotAttachCornerForShortOverlapOnLongEdgeLeft() { + val root = rearrangeRects( + RectF(0f, 0f, 1080f, 1920f), + RectF(-1070f, -1880f, 10f, 40f), + ) + + verifyDisplay(root, id = 0, width = 1080f, height = 1920f, noOfChildren = 1) + verifyDisplay( + root.children[0], id = 1, width = 1080f, height = 1920f, POSITION_LEFT, + offset = -1880f, noOfChildren = 0) + } + + @Test fun copy() { val display1 = DisplayTopology.TreeNode(/* displayId= */ 1, /* width= */ 200f, /* height= */ 600f, /* position= */ 0, /* offset= */ 0f) @@ -687,6 +740,34 @@ class DisplayTopologyTest { offset = 0f, noOfChildren = 0) } + @Test + fun coordinates() { + val display1 = DisplayTopology.TreeNode(/* displayId= */ 1, /* width= */ 200f, + /* height= */ 600f, /* position= */ 0, /* offset= */ 0f) + + val display2 = DisplayTopology.TreeNode(/* displayId= */ 2, /* width= */ 600f, + /* height= */ 200f, POSITION_RIGHT, /* offset= */ 0f) + display1.addChild(display2) + + val display3 = DisplayTopology.TreeNode(/* displayId= */ 3, /* width= */ 600f, + /* height= */ 200f, POSITION_RIGHT, /* offset= */ 400f) + display1.addChild(display3) + + val display4 = DisplayTopology.TreeNode(/* displayId= */ 4, /* width= */ 200f, + /* height= */ 600f, POSITION_RIGHT, /* offset= */ 0f) + display2.addChild(display4) + + topology = DisplayTopology(display1, /* primaryDisplayId= */ 1) + val coords = topology.absoluteBounds + + val expectedCoords = SparseArray<RectF>() + expectedCoords.append(1, RectF(0f, 0f, 200f, 600f)) + expectedCoords.append(2, RectF(200f, 0f, 800f, 200f)) + expectedCoords.append(3, RectF(200f, 400f, 800f, 600f)) + expectedCoords.append(4, RectF(800f, 0f, 1000f, 600f)) + assertThat(coords.contentEquals(expectedCoords)).isTrue() + } + /** * Runs the rearrange algorithm and returns the resulting tree as a list of nodes, with the * root at index 0. The number of nodes is inferred from the number of positions passed. diff --git a/core/tests/coretests/src/android/security/advancedprotection/AdvancedProtectionManagerTest.java b/core/tests/coretests/src/android/security/advancedprotection/AdvancedProtectionManagerTest.java deleted file mode 100644 index 45864b01c795..000000000000 --- a/core/tests/coretests/src/android/security/advancedprotection/AdvancedProtectionManagerTest.java +++ /dev/null @@ -1,97 +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 android.security.advancedprotection; - -import static android.security.advancedprotection.AdvancedProtectionManager.ACTION_SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG; -import static android.security.advancedprotection.AdvancedProtectionManager.EXTRA_SUPPORT_DIALOG_FEATURE; -import static android.security.advancedprotection.AdvancedProtectionManager.EXTRA_SUPPORT_DIALOG_TYPE; -import static android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_DISALLOW_CELLULAR_2G; -import static android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION; -import static android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_DISABLED_SETTING; -import static android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_UNKNOWN; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; - -import android.content.Intent; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class AdvancedProtectionManagerTest { - private static final int FEATURE_ID_INVALID = -1; - private static final int SUPPORT_DIALOG_TYPE_INVALID = -1; - - @Test - public void testCreateSupportIntent_validFeature_validTypeUnknown_createsIntent() { - Intent intent = AdvancedProtectionManager.createSupportIntent( - FEATURE_ID_DISALLOW_CELLULAR_2G, SUPPORT_DIALOG_TYPE_UNKNOWN); - - assertEquals(ACTION_SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG, intent.getAction()); - assertEquals(FEATURE_ID_DISALLOW_CELLULAR_2G, intent.getIntExtra( - EXTRA_SUPPORT_DIALOG_FEATURE, FEATURE_ID_INVALID)); - assertEquals(SUPPORT_DIALOG_TYPE_UNKNOWN, intent.getIntExtra(EXTRA_SUPPORT_DIALOG_TYPE, - SUPPORT_DIALOG_TYPE_INVALID)); - } - - @Test - public void testCreateSupportIntent_validFeature_validTypeBlockedInteraction_createsIntent() { - Intent intent = AdvancedProtectionManager.createSupportIntent( - FEATURE_ID_DISALLOW_CELLULAR_2G, SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION); - - assertEquals(ACTION_SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG, intent.getAction()); - assertEquals(FEATURE_ID_DISALLOW_CELLULAR_2G, intent.getIntExtra( - EXTRA_SUPPORT_DIALOG_FEATURE, FEATURE_ID_INVALID)); - assertEquals(SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION, intent.getIntExtra( - EXTRA_SUPPORT_DIALOG_TYPE, SUPPORT_DIALOG_TYPE_INVALID)); - } - - @Test - public void testCreateSupportIntent_validFeature_validTypeDisabledSetting_createsIntent() { - Intent intent = AdvancedProtectionManager.createSupportIntent( - FEATURE_ID_DISALLOW_CELLULAR_2G, SUPPORT_DIALOG_TYPE_DISABLED_SETTING); - - assertEquals(ACTION_SHOW_ADVANCED_PROTECTION_SUPPORT_DIALOG, intent.getAction()); - assertEquals(FEATURE_ID_DISALLOW_CELLULAR_2G, intent.getIntExtra( - EXTRA_SUPPORT_DIALOG_FEATURE, FEATURE_ID_INVALID)); - assertEquals(SUPPORT_DIALOG_TYPE_DISABLED_SETTING, intent.getIntExtra( - EXTRA_SUPPORT_DIALOG_TYPE, SUPPORT_DIALOG_TYPE_INVALID)); - } - - @Test - public void testCreateSupportIntent_validFeature_invalidType_throwsIllegalArgument() { - assertThrows(IllegalArgumentException.class, () -> - AdvancedProtectionManager.createSupportIntent(FEATURE_ID_DISALLOW_CELLULAR_2G, - SUPPORT_DIALOG_TYPE_INVALID)); - } - - @Test - public void testCreateSupportIntent_invalidFeature_validType_throwsIllegalArgument() { - assertThrows(IllegalArgumentException.class, () -> - AdvancedProtectionManager.createSupportIntent(FEATURE_ID_INVALID, - SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION)); - } - - @Test - public void testCreateSupportIntent_invalidFeature_invalidType_throwsIllegalArgument() { - assertThrows(IllegalArgumentException.class, () -> - AdvancedProtectionManager.createSupportIntent(FEATURE_ID_INVALID, - SUPPORT_DIALOG_TYPE_INVALID)); - } -} diff --git a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java index 248db65d7435..4a54f6b12c9d 100644 --- a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java @@ -133,7 +133,7 @@ public class ImeInsetsSourceConsumerTest { // Called once through the show flow. verify(mController).applyAnimation( eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(true) /* fromIme */, - eq(statsToken)); + eq(false) /* skipsCallbacks */, eq(statsToken)); // set control and verify visibility is applied. InsetsSourceControl control = new InsetsSourceControl(ID_IME, @@ -142,10 +142,10 @@ public class ImeInsetsSourceConsumerTest { // IME show animation should be triggered when control becomes available. verify(mController).applyAnimation( eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(false) /* fromIme */, - and(not(eq(statsToken)), notNull())); + eq(false) /* skipsCallbacks */, and(not(eq(statsToken)), notNull())); verify(mController, never()).applyAnimation( eq(WindowInsets.Type.ime()), eq(false) /* show */, eq(false) /* fromIme */, - and(not(eq(statsToken)), notNull())); + eq(false) /* skipsCallbacks */, and(not(eq(statsToken)), notNull())); }); } @@ -163,7 +163,7 @@ public class ImeInsetsSourceConsumerTest { // Called once through the show flow. verify(mController).applyAnimation( eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(true) /* fromIme */, - eq(statsToken)); + eq(false) /* skipsCallbacks */, eq(statsToken)); // Clear previous invocations to verify this is never called with control without leash. clearInvocations(mController); @@ -175,10 +175,10 @@ public class ImeInsetsSourceConsumerTest { // as we have no leash. verify(mController, never()).applyAnimation( eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(false) /* fromIme */, - and(not(eq(statsToken)), notNull())); + eq(false) /* skipsCallbacks */, and(not(eq(statsToken)), notNull())); verify(mController, never()).applyAnimation( eq(WindowInsets.Type.ime()), eq(false) /* show */, eq(false) /* fromIme */, - and(not(eq(statsToken)), notNull())); + eq(false) /* skipsCallbacks */, and(not(eq(statsToken)), notNull())); // set control with leash and verify visibility is applied. InsetsSourceControl controlWithLeash = new InsetsSourceControl(ID_IME, @@ -187,10 +187,10 @@ public class ImeInsetsSourceConsumerTest { // IME show animation should be triggered when control with leash becomes available. verify(mController).applyAnimation( eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(false) /* fromIme */, - and(not(eq(statsToken)), notNull())); + eq(false) /* skipsCallbacks */, and(not(eq(statsToken)), notNull())); verify(mController, never()).applyAnimation( eq(WindowInsets.Type.ime()), eq(false) /* show */, eq(false) /* fromIme */, - and(not(eq(statsToken)), notNull())); + eq(false) /* skipsCallbacks */, and(not(eq(statsToken)), notNull())); }); } @@ -223,7 +223,8 @@ public class ImeInsetsSourceConsumerTest { // Called once through the show flow. verify(mController).applyAnimation(eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(true) /* fromIme */, - eq(false) /* skipAnim */, eq(statsToken)); + eq(false) /* skipsAnim */, eq(false) /* skipsCallbacks */, + eq(statsToken)); } // set control and verify visibility is applied. @@ -241,7 +242,8 @@ public class ImeInsetsSourceConsumerTest { // so the statsToken won't match. verify(mController).applyAnimation(eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(false) /* fromIme */, - eq(expectSkipAnim) /* skipAnim */, and(not(eq(statsToken)), notNull())); + eq(expectSkipAnim) /* skipsAnim */, eq(false) /* skipsCallbacks */, + and(not(eq(statsToken)), notNull())); } // If previously hasViewFocus is false, verify when requesting the IME visible next @@ -252,14 +254,16 @@ public class ImeInsetsSourceConsumerTest { // Called once through the show flow. verify(mController).applyAnimation(eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(true) /* fromIme */, - eq(false) /* skipAnim */, eq(statsTokenNext)); + eq(false) /* skipsAnim */, eq(false) /* skipsCallbacks */, + eq(statsTokenNext)); mController.onControlsChanged(new InsetsSourceControl[]{ control }); // Verify IME show animation should be triggered when control becomes available and // the animation will be skipped by getAndClearSkipAnimationOnce invoked. verify(control).getAndClearSkipAnimationOnce(); verify(mController).applyAnimation(eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(false) /* fromIme */, - eq(true) /* skipAnim */, and(not(eq(statsToken)), notNull())); + eq(true) /* skipsAnim */, eq(false) /* skipsCallbacks */, + and(not(eq(statsToken)), notNull())); } }); } diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java index d7f6a29d7c86..905d897e9ab0 100644 --- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java @@ -100,14 +100,14 @@ public class InsetsAnimationControlImplTest { topConsumer.setControl( new InsetsSourceControl(ID_STATUS_BAR, WindowInsets.Type.statusBars(), mStatusLeash, true, new Point(0, 0), Insets.of(0, 100, 0, 0)), - new int[1], new int[1], new int[1]); + new int[1], new int[1], new int[1], new int[1]); InsetsSourceConsumer navConsumer = new InsetsSourceConsumer(ID_NAVIGATION_BAR, WindowInsets.Type.navigationBars(), mInsetsState, mMockController); navConsumer.setControl( new InsetsSourceControl(ID_NAVIGATION_BAR, WindowInsets.Type.navigationBars(), mNavLeash, true, new Point(400, 0), Insets.of(0, 0, 100, 0)), - new int[1], new int[1], new int[1]); + new int[1], new int[1], new int[1], new int[1]); mMockController.setRequestedVisibleTypes(0, WindowInsets.Type.navigationBars()); navConsumer.applyLocalVisibilityOverride(); diff --git a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java index 3a8f7ee3d7c8..45d66e8ee3a9 100644 --- a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java @@ -117,7 +117,7 @@ public class InsetsSourceConsumerTest { mConsumer.setControl( new InsetsSourceControl(ID_STATUS_BAR, statusBars(), mLeash, true /* initialVisible */, new Point(), Insets.NONE), - new int[1], new int[1], new int[1]); + new int[1], new int[1], new int[1], new int[1]); } @Test @@ -129,7 +129,7 @@ public class InsetsSourceConsumerTest { newControl.setInsetsHint(Insets.of(0, 0, 0, 100)); int[] cancelTypes = {0}; - mConsumer.setControl(newControl, new int[1], new int[1], cancelTypes); + mConsumer.setControl(newControl, new int[1], new int[1], cancelTypes, new int[1]); assertEquals(statusBars(), cancelTypes[0]); }); @@ -196,7 +196,7 @@ public class InsetsSourceConsumerTest { @Test public void testRestore() { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { - mConsumer.setControl(null, new int[1], new int[1], new int[1]); + mConsumer.setControl(null, new int[1], new int[1], new int[1], new int[1]); mSurfaceParamsApplied = false; mController.setRequestedVisibleTypes(0 /* visibleTypes */, statusBars()); assertFalse(mSurfaceParamsApplied); @@ -204,7 +204,7 @@ public class InsetsSourceConsumerTest { mConsumer.setControl( new InsetsSourceControl(ID_STATUS_BAR, statusBars(), mLeash, true /* initialVisible */, new Point(), Insets.NONE), - new int[1], hideTypes, new int[1]); + new int[1], hideTypes, new int[1], new int[1]); assertEquals(statusBars(), hideTypes[0]); assertFalse(mRemoveSurfaceCalled); }); @@ -214,7 +214,7 @@ public class InsetsSourceConsumerTest { public void testRestore_noAnimation() { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { mController.setRequestedVisibleTypes(0 /* visibleTypes */, statusBars()); - mConsumer.setControl(null, new int[1], new int[1], new int[1]); + mConsumer.setControl(null, new int[1], new int[1], new int[1], new int[1]); mLeash = new SurfaceControl.Builder(mSession) .setName("testSurface") .build(); @@ -223,7 +223,7 @@ public class InsetsSourceConsumerTest { mConsumer.setControl( new InsetsSourceControl(ID_STATUS_BAR, statusBars(), mLeash, false /* initialVisible */, new Point(), Insets.NONE), - new int[1], hideTypes, new int[1]); + new int[1], hideTypes, new int[1], new int[1]); assertTrue(mRemoveSurfaceCalled); assertEquals(0, hideTypes[0]); }); @@ -252,7 +252,7 @@ public class InsetsSourceConsumerTest { // Initial IME insets source control with its leash. imeConsumer.setControl(new InsetsSourceControl(ID_IME, ime(), mLeash, false /* initialVisible */, new Point(), Insets.NONE), new int[1], new int[1], - new int[1]); + new int[1], new int[1]); mSurfaceParamsApplied = false; // Verify when the app requests controlling show IME animation, the IME leash @@ -262,7 +262,7 @@ public class InsetsSourceConsumerTest { assertEquals(ANIMATION_TYPE_USER, insetsController.getAnimationType(ime())); imeConsumer.setControl(new InsetsSourceControl(ID_IME, ime(), mLeash, true /* initialVisible */, new Point(), Insets.NONE), new int[1], new int[1], - new int[1]); + new int[1], new int[1]); assertFalse(mSurfaceParamsApplied); }); } diff --git a/graphics/java/android/graphics/BlendModeColorFilter.java b/graphics/java/android/graphics/BlendModeColorFilter.java index 7caeb4267ad2..d4e23732bdc3 100644 --- a/graphics/java/android/graphics/BlendModeColorFilter.java +++ b/graphics/java/android/graphics/BlendModeColorFilter.java @@ -71,7 +71,7 @@ public final class BlendModeColorFilter extends ColorFilter { return false; } final BlendModeColorFilter other = (BlendModeColorFilter) object; - return other.mMode == mMode; + return (other.mMode == mMode && other.mColor == mColor); } @Override diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml index 07cc0e769a59..a975682b065e 100644 --- a/libs/WindowManager/Shell/res/values-af/strings.xml +++ b/libs/WindowManager/Shell/res/values-af/strings.xml @@ -34,8 +34,8 @@ <string name="dock_forced_resizable" msgid="7429086980048964687">"App sal dalk nie met verdeelde skerm werk nie"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"App steun nie verdeelde skerm nie"</string> <string name="dock_multi_instances_not_supported_text" msgid="5011042177901502928">"Hierdie app kan net in 1 venster oopgemaak word"</string> - <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Program sal dalk nie op \'n sekondêre skerm werk nie."</string> - <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Program steun nie begin op sekondêre skerms nie."</string> + <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App sal dalk nie op \'n sekondêre skerm werk nie."</string> + <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App steun nie begin op sekondêre skerms nie."</string> <string name="accessibility_divider" msgid="6407584574218956849">"Skermverdeler"</string> <string name="divider_title" msgid="1963391955593749442">"Skermverdeler"</string> <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Volskerm links"</string> @@ -78,7 +78,7 @@ <string name="bubbles_user_education_title" msgid="2112319053732691899">"Klets met borrels"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nuwe gesprekke verskyn as swerwende ikone, of borrels Tik op borrel om dit oop te maak. Sleep om dit te skuif."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Beheer borrels enige tyd"</string> - <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tik op Bestuur om borrels vanaf hierdie program af te skakel"</string> + <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tik op Bestuur om borrels vanaf hierdie app af te skakel"</string> <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Het dit"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Geen onlangse borrels nie"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Onlangse borrels en borrels wat toegemaak is, sal hier verskyn"</string> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 348f13a493b1..8efeecb56dbf 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -1449,6 +1449,15 @@ public class BubbleController implements ConfigurationChangeListener, } /** + * Expands and selects a bubble created from a running task in a different mode. + * + * @param taskInfo the task. + */ + public void expandStackAndSelectBubble(ActivityManager.RunningTaskInfo taskInfo) { + // TODO(384976265): Not implemented yet + } + + /** * Expands and selects a bubble based on the provided {@link BubbleEntry}. If no bubble * exists for this entry, and it is able to bubble, a new bubble will be created. * diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java index eab7f6c055bd..1408b6efc7f9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java @@ -124,6 +124,7 @@ import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.sysui.ShellInterface; import com.android.wm.shell.taskview.TaskViewFactory; import com.android.wm.shell.taskview.TaskViewFactoryController; +import com.android.wm.shell.taskview.TaskViewRepository; import com.android.wm.shell.taskview.TaskViewTransitions; import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.HomeTransitionObserver; @@ -772,8 +773,15 @@ public abstract class WMShellBaseModule { @WMSingleton @Provides - static TaskViewTransitions provideTaskViewTransitions(Transitions transitions) { - return new TaskViewTransitions(transitions); + static TaskViewTransitions provideTaskViewTransitions(Transitions transitions, + TaskViewRepository repository) { + return new TaskViewTransitions(transitions, repository); + } + + @WMSingleton + @Provides + static TaskViewRepository provideTaskViewRepository() { + return new TaskViewRepository(); } // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index d8c7f4cbb698..48b0a6cb364b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -736,7 +736,8 @@ public abstract class WMShellModule { DesktopModeEventLogger desktopModeEventLogger, DesktopModeUiEventLogger desktopModeUiEventLogger, DesktopTilingDecorViewModel desktopTilingDecorViewModel, - DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider) { + DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider, + Optional<BubbleController> bubbleController) { return new DesktopTasksController( context, shellInit, @@ -768,7 +769,8 @@ public abstract class WMShellModule { desktopModeEventLogger, desktopModeUiEventLogger, desktopTilingDecorViewModel, - desktopWallpaperActivityTokenProvider); + desktopWallpaperActivityTokenProvider, + bubbleController); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 4e7cba23116c..d180ea7b79ff 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -73,6 +73,7 @@ import com.android.wm.shell.Flags.enableFlexibleSplit import com.android.wm.shell.R import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.ShellTaskOrganizer +import com.android.wm.shell.bubbles.BubbleController import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.common.ExternalInterfaceBinder @@ -172,6 +173,7 @@ class DesktopTasksController( private val desktopModeUiEventLogger: DesktopModeUiEventLogger, private val desktopTilingDecorViewModel: DesktopTilingDecorViewModel, private val desktopWallpaperActivityTokenProvider: DesktopWallpaperActivityTokenProvider, + private val bubbleController: Optional<BubbleController>, ) : RemoteCallable<DesktopTasksController>, Transitions.TransitionHandler, @@ -2190,6 +2192,19 @@ class DesktopTasksController( } } + /** Requests a task be transitioned from whatever mode it's in to a bubble. */ + fun requestFloat(taskInfo: RunningTaskInfo) { + val isDragging = dragToDesktopTransitionHandler.inProgress + val shouldRequestFloat = + taskInfo.isFullscreen || taskInfo.isFreeform || isDragging || taskInfo.isMultiWindow + if (!shouldRequestFloat) return + if (isDragging) { + releaseVisualIndicator() + } else { + bubbleController.ifPresent { it.expandStackAndSelectBubble(taskInfo) } + } + } + private fun getDefaultDensityDpi(): Int { return context.resources.displayMetrics.densityDpi } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/common/ToggleTaskSizeUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/common/ToggleTaskSizeUtils.kt index f6ebf7221e82..6e12bf4d1dda 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/common/ToggleTaskSizeUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/common/ToggleTaskSizeUtils.kt @@ -90,10 +90,10 @@ constructor( Source.HEADER_BUTTON_TO_RESTORE -> Cuj.CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW Source.KEYBOARD_SHORTCUT -> null Source.HEADER_DRAG_TO_TOP -> null - Source.MAXIMIZE_MENU_TO_MAXIMIZE -> null - Source.MAXIMIZE_MENU_TO_RESTORE -> null - Source.DOUBLE_TAP_TO_MAXIMIZE -> null - Source.DOUBLE_TAP_TO_RESTORE -> null + Source.MAXIMIZE_MENU_TO_MAXIMIZE -> Cuj.CUJ_DESKTOP_MODE_MAXIMIZE_WINDOW + Source.MAXIMIZE_MENU_TO_RESTORE -> Cuj.CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW + Source.DOUBLE_TAP_TO_MAXIMIZE -> Cuj.CUJ_DESKTOP_MODE_MAXIMIZE_WINDOW + Source.DOUBLE_TAP_TO_RESTORE -> Cuj.CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW } /** The direction to which the task is being resized. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewRepository.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewRepository.java new file mode 100644 index 000000000000..8cb39a0b84de --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewRepository.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.taskview; + +import android.annotation.Nullable; +import android.graphics.Rect; +import android.window.WindowContainerToken; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; + +/** + * Keeps track of all TaskViews known by Shell. This is separated into its own object so that + * different TaskView managers can share state. + */ +public class TaskViewRepository { + /** + * The latest visibility and bounds state that has been requested for + * a {@link TaskViewTaskController}. + */ + public static class TaskViewState { + final WeakReference<TaskViewTaskController> mTaskView; + public boolean mVisible; + public Rect mBounds = new Rect(); + + TaskViewState(TaskViewTaskController taskView) { + mTaskView = new WeakReference<>(taskView); + } + + @Nullable public TaskViewTaskController getTaskView() { + return mTaskView.get(); + } + } + + /** + * List of tracked TaskViews + */ + private final ArrayList<TaskViewState> mTaskViews = new ArrayList<>(); + + private int findAndPrune(TaskViewTaskController tv) { + for (int i = mTaskViews.size() - 1; i >= 0; --i) { + final TaskViewTaskController key = mTaskViews.get(i).mTaskView.get(); + if (key == null) { + mTaskViews.remove(i); + continue; + } + if (key != tv) continue; + return i; + } + return -1; + } + + /** @return if the repository is tracking {@param tv}. */ + public boolean contains(TaskViewTaskController tv) { + return findAndPrune(tv) >= 0; + } + + /** Start tracking {@param tv}. */ + public void add(TaskViewTaskController tv) { + if (contains(tv)) return; + mTaskViews.add(new TaskViewState(tv)); + } + + /** Remove {@param tv} from tracking. */ + public void remove(TaskViewTaskController tv) { + int idx = findAndPrune(tv); + if (idx < 0) return; + mTaskViews.remove(idx); + } + + /** @return whether there are any TaskViews */ + public boolean isEmpty() { + if (mTaskViews.isEmpty()) return true; + for (int i = mTaskViews.size() - 1; i >= 0; --i) { + if (mTaskViews.get(i).mTaskView.get() != null) continue; + mTaskViews.remove(i); + } + return mTaskViews.isEmpty(); + } + + /** @return the state of {@param tv} if tracked, {@code null} otherwise. */ + @Nullable + public TaskViewState byTaskView(TaskViewTaskController tv) { + int idx = findAndPrune(tv); + if (idx < 0) return null; + return mTaskViews.get(idx); + } + + /** + * @return the state of the taskview containing {@param token} if tracked, + * {@code null} otherwise. + */ + @Nullable + public TaskViewState byToken(WindowContainerToken token) { + for (int i = mTaskViews.size() - 1; i >= 0; --i) { + final TaskViewTaskController key = mTaskViews.get(i).mTaskView.get(); + if (key == null) { + mTaskViews.remove(i); + continue; + } + if (key.getTaskInfo() == null) continue; + if (key.getTaskInfo().token.equals(token)) { + return mTaskViews.get(i); + } + } + return null; + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java index eaeedba8ef9c..8dd14983e122 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java @@ -40,6 +40,7 @@ import android.view.WindowInsets; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; +import com.android.internal.annotations.VisibleForTesting; import com.android.wm.shell.Flags; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.SyncTransactionQueue; @@ -619,6 +620,11 @@ public class TaskViewTaskController implements ShellTaskOrganizer.TaskListener { return mTaskInfo; } + @VisibleForTesting + ActivityManager.RunningTaskInfo getPendingInfo() { + return mPendingInfo; + } + /** * Indicates that the task was not found in the start animation for the transition. * In this case we should clean up the task if we have the pending info. If we don't @@ -681,6 +687,10 @@ public class TaskViewTaskController implements ShellTaskOrganizer.TaskListener { wct); } + private TaskViewRepository.TaskViewState getState() { + return mTaskViewTransitions.getRepository().byTaskView(this); + } + private void prepareOpenAnimationInternal(final boolean newTask, SurfaceControl.Transaction startTransaction, SurfaceControl.Transaction finishTransaction, @@ -703,8 +713,16 @@ public class TaskViewTaskController implements ShellTaskOrganizer.TaskListener { // TODO: maybe once b/280900002 is fixed this will be unnecessary .setWindowCrop(mTaskLeash, boundsOnScreen.width(), boundsOnScreen.height()); } - mTaskViewTransitions.updateBoundsState(this, boundsOnScreen); - mTaskViewTransitions.updateVisibilityState(this, true /* visible */); + if (TaskViewTransitions.useRepo()) { + final TaskViewRepository.TaskViewState state = getState(); + if (state != null) { + state.mBounds.set(boundsOnScreen); + state.mVisible = true; + } + } else { + mTaskViewTransitions.updateBoundsState(this, boundsOnScreen); + mTaskViewTransitions.updateVisibilityState(this, true /* visible */); + } wct.setBounds(mTaskToken, boundsOnScreen); applyCaptionInsetsIfNeeded(); } else { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java index ae75cb589de0..0cbb7bd14e6f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java @@ -60,7 +60,8 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { * Only keep a weak reference to the controller instance here to allow for it to be cleaned * up when its TaskView is no longer used. */ - private final Map<TaskViewTaskController, TaskViewRequestedState> mTaskViews; + private final Map<TaskViewTaskController, TaskViewRepository.TaskViewState> mTaskViews; + private final TaskViewRepository mTaskViewRepo; private final ArrayList<PendingTransition> mPending = new ArrayList<>(); private final Transitions mTransitions; private final boolean[] mRegistered = new boolean[]{false}; @@ -95,26 +96,29 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { } } - /** - * Visibility and bounds state that has been requested for a {@link TaskViewTaskController}. - */ - private static class TaskViewRequestedState { - boolean mVisible; - Rect mBounds = new Rect(); - } - - public TaskViewTransitions(Transitions transitions) { + public TaskViewTransitions(Transitions transitions, TaskViewRepository repository) { mTransitions = transitions; - if (Flags.enableTaskViewControllerCleanup()) { + if (useRepo()) { + mTaskViews = null; + } else if (Flags.enableTaskViewControllerCleanup()) { mTaskViews = new WeakHashMap<>(); } else { mTaskViews = new ArrayMap<>(); } + mTaskViewRepo = repository; // Defer registration until the first TaskView because we want this to be the "first" in // priority when handling requests. // TODO(210041388): register here once we have an explicit ordering mechanism. } + static boolean useRepo() { + return Flags.taskViewRepository() || Flags.enableBubbleAnything(); + } + + public TaskViewRepository getRepository() { + return mTaskViewRepo; + } + void addTaskView(TaskViewTaskController tv) { synchronized (mRegistered) { if (!mRegistered[0]) { @@ -122,11 +126,19 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { mTransitions.addHandler(this); } } - mTaskViews.put(tv, new TaskViewRequestedState()); + if (useRepo()) { + mTaskViewRepo.add(tv); + } else { + mTaskViews.put(tv, new TaskViewRepository.TaskViewState(null)); + } } void removeTaskView(TaskViewTaskController tv) { - mTaskViews.remove(tv); + if (useRepo()) { + mTaskViewRepo.remove(tv); + } else { + mTaskViews.remove(tv); + } // Note: Don't unregister handler since this is a singleton with lifetime bound to Shell } @@ -223,6 +235,10 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { } private TaskViewTaskController findTaskView(ActivityManager.RunningTaskInfo taskInfo) { + if (useRepo()) { + final TaskViewRepository.TaskViewState state = mTaskViewRepo.byToken(taskInfo.token); + return state != null ? state.getTaskView() : null; + } if (Flags.enableTaskViewControllerCleanup()) { for (TaskViewTaskController controller : mTaskViews.keySet()) { if (controller.getTaskInfo() == null) continue; @@ -231,8 +247,8 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { } } } else { - ArrayMap<TaskViewTaskController, TaskViewRequestedState> taskViews = - (ArrayMap<TaskViewTaskController, TaskViewRequestedState>) mTaskViews; + ArrayMap<TaskViewTaskController, TaskViewRepository.TaskViewState> taskViews = + (ArrayMap<TaskViewTaskController, TaskViewRepository.TaskViewState>) mTaskViews; for (int i = 0; i < taskViews.size(); ++i) { if (taskViews.keyAt(i).getTaskInfo() == null) continue; if (taskInfo.token.equals(taskViews.keyAt(i).getTaskInfo().token)) { @@ -279,23 +295,26 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { * * @param taskView the task view which the visibility is being changed for * @param visible the new visibility of the task view - * @param reorder whether to reorder the task or not. If this is {@code true}, the task will be - * reordered as per the given {@code visible}. For {@code visible = true}, task - * will be reordered to top. For {@code visible = false}, task will be reordered - * to the bottom + * @param reorder whether to reorder the task or not. If this is {@code true}, the task will + * be reordered as per the given {@code visible}. For {@code visible = true}, + * task will be reordered to top. For {@code visible = false}, task will be + * reordered to the bottom */ public void setTaskViewVisible(TaskViewTaskController taskView, boolean visible, boolean reorder) { - if (mTaskViews.get(taskView) == null) return; - if (mTaskViews.get(taskView).mVisible == visible) return; + final TaskViewRepository.TaskViewState state = useRepo() + ? mTaskViewRepo.byTaskView(taskView) + : mTaskViews.get(taskView); + if (state == null) return; + if (state.mVisible == visible) return; if (taskView.getTaskInfo() == null) { // Nothing to update, task is not yet available return; } - mTaskViews.get(taskView).mVisible = visible; + state.mVisible = visible; final WindowContainerTransaction wct = new WindowContainerTransaction(); wct.setHidden(taskView.getTaskInfo().token, !visible /* hidden */); - wct.setBounds(taskView.getTaskInfo().token, mTaskViews.get(taskView).mBounds); + wct.setBounds(taskView.getTaskInfo().token, state.mBounds); if (reorder) { wct.reorder(taskView.getTaskInfo().token, visible /* onTop */); } @@ -308,7 +327,10 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { /** Starts a new transition to reorder the given {@code taskView}'s task. */ public void reorderTaskViewTask(TaskViewTaskController taskView, boolean onTop) { - if (mTaskViews.get(taskView) == null) return; + final TaskViewRepository.TaskViewState state = useRepo() + ? mTaskViewRepo.byTaskView(taskView) + : mTaskViews.get(taskView); + if (state == null) return; if (taskView.getTaskInfo() == null) { // Nothing to update, task is not yet available return; @@ -323,19 +345,24 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { } void updateBoundsState(TaskViewTaskController taskView, Rect boundsOnScreen) { - TaskViewRequestedState state = mTaskViews.get(taskView); + if (useRepo()) return; + final TaskViewRepository.TaskViewState state = mTaskViews.get(taskView); if (state == null) return; state.mBounds.set(boundsOnScreen); } void updateVisibilityState(TaskViewTaskController taskView, boolean visible) { - TaskViewRequestedState state = mTaskViews.get(taskView); + final TaskViewRepository.TaskViewState state = useRepo() + ? mTaskViewRepo.byTaskView(taskView) + : mTaskViews.get(taskView); if (state == null) return; state.mVisible = visible; } void setTaskBounds(TaskViewTaskController taskView, Rect boundsOnScreen) { - TaskViewRequestedState state = mTaskViews.get(taskView); + final TaskViewRepository.TaskViewState state = useRepo() + ? mTaskViewRepo.byTaskView(taskView) + : mTaskViews.get(taskView); if (state == null || Objects.equals(boundsOnScreen, state.mBounds)) { return; } @@ -385,7 +412,7 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { if (pending != null) { mPending.remove(pending); } - if (mTaskViews.isEmpty()) { + if (useRepo() ? mTaskViewRepo.isEmpty() : mTaskViews.isEmpty()) { if (pending != null) { Slog.e(TAG, "Pending taskview transition but no task-views"); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java index e80016d07f15..1689bb5778ae 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java @@ -329,7 +329,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { @ColorInt int backgroundColorForTransition = 0; final int wallpaperTransit = getWallpaperTransitType(info); - boolean isDisplayRotationAnimationStarted = false; + int animatingDisplayId = Integer.MIN_VALUE; final boolean isDreamTransition = isDreamTransition(info); final boolean isOnlyTranslucent = isOnlyTranslucent(info); final boolean isActivityLevel = isActivityLevelOnly(info); @@ -361,7 +361,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { ? ScreenRotationAnimation.FLAG_HAS_WALLPAPER : 0; startRotationAnimation(startTransaction, change, info, anim, flags, animations, onAnimFinish); - isDisplayRotationAnimationStarted = true; + animatingDisplayId = change.getEndDisplayId(); continue; } } else { @@ -426,8 +426,11 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { // Hide the invisible surface directly without animating it if there is a display // rotation animation playing. - if (isDisplayRotationAnimationStarted && TransitionUtil.isClosingType(mode)) { - startTransaction.hide(change.getLeash()); + if (animatingDisplayId == change.getEndDisplayId()) { + if (TransitionUtil.isClosingType(mode)) { + startTransaction.hide(change.getLeash()); + } + // Only need to play display level animation. continue; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index df81821ff13f..edb2e1cbcca6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -546,8 +546,13 @@ public class Transitions implements RemoteCallable<Transitions>, // When the window is moved to front, make sure the crop is updated to prevent it // from using the old crop. t.setPosition(leash, change.getEndRelOffset().x, change.getEndRelOffset().y); - t.setWindowCrop(leash, change.getEndAbsBounds().width(), - change.getEndAbsBounds().height()); + if (change.getContainer() != null) { + // We don't want to crop on non-remotable (activity), because it can have + // letterbox child surface that is position at a negative position related to + // the activity's surface. + t.setWindowCrop(leash, change.getEndAbsBounds().width(), + change.getEndAbsBounds().height()); + } } // Don't move anything that isn't independent within its parents @@ -557,8 +562,13 @@ public class Transitions implements RemoteCallable<Transitions>, t.setMatrix(leash, 1, 0, 0, 1); t.setAlpha(leash, 1.f); t.setPosition(leash, change.getEndRelOffset().x, change.getEndRelOffset().y); - t.setWindowCrop(leash, change.getEndAbsBounds().width(), - change.getEndAbsBounds().height()); + if (change.getContainer() != null) { + // We don't want to crop on non-remotable (activity), because it can have + // letterbox child surface that is position at a negative position related + // to the activity's surface. + t.setWindowCrop(leash, change.getEndAbsBounds().width(), + change.getEndAbsBounds().height()); + } } continue; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index a7a5f09c88f8..046cb202fb11 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -776,6 +776,18 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, DesktopUiEventEnum.DESKTOP_WINDOW_APP_HANDLE_MENU_TAP_TO_SPLIT_SCREEN); } + private void onToFloat(int taskId) { + final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); + if (decoration == null) { + return; + } + decoration.closeHandleMenu(); + // When the app enters float, the handle will no longer be visible, meaning + // we shouldn't receive input for it any longer. + decoration.disposeStatusBarInputLayer(); + mDesktopTasksController.requestFloat(decoration.mTaskInfo); + } + private void onNewWindow(int taskId) { final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); if (decoration == null) { @@ -1731,6 +1743,10 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, onToSplitScreen(taskInfo.taskId); return Unit.INSTANCE; }); + windowDecoration.setOnToFloatClickListener(() -> { + onToFloat(taskInfo.taskId); + return Unit.INSTANCE; + }); windowDecoration.setOpenInBrowserClickListener((intent) -> { onOpenInBrowser(taskInfo.taskId, intent); }); 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 0d1960ad6e29..4ac89546c9c7 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 @@ -155,6 +155,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private Consumer<DesktopModeTransitionSource> mOnToDesktopClickListener; private Function0<Unit> mOnToFullscreenClickListener; private Function0<Unit> mOnToSplitscreenClickListener; + private Function0<Unit> mOnToFloatClickListener; private Function0<Unit> mOnNewWindowClickListener; private Function0<Unit> mOnManageWindowsClickListener; private Function0<Unit> mOnChangeAspectRatioClickListener; @@ -351,6 +352,11 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mOnToSplitscreenClickListener = listener; } + /** Registers a listener to be called when the decoration's to-split action is triggered. */ + void setOnToFloatClickListener(Function0<Unit> listener) { + mOnToFloatClickListener = listener; + } + /** * Adds a drag resize observer that gets notified on the task being drag resized. * @@ -1372,6 +1378,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin }, /* onToFullscreenClickListener= */ mOnToFullscreenClickListener, /* onToSplitScreenClickListener= */ mOnToSplitscreenClickListener, + /* onToFloatClickListener= */ mOnToFloatClickListener, /* onNewWindowClickListener= */ mOnNewWindowClickListener, /* onManageWindowsClickListener= */ mOnManageWindowsClickListener, /* onAspectRatioSettingsClickListener= */ mOnChangeAspectRatioClickListener, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt index bb19a2cc2ad4..9d73950abcf0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt @@ -144,6 +144,7 @@ class HandleMenu( onToDesktopClickListener: () -> Unit, onToFullscreenClickListener: () -> Unit, onToSplitScreenClickListener: () -> Unit, + onToFloatClickListener: () -> Unit, onNewWindowClickListener: () -> Unit, onManageWindowsClickListener: () -> Unit, onChangeAspectRatioClickListener: () -> Unit, @@ -162,6 +163,7 @@ class HandleMenu( onToDesktopClickListener = onToDesktopClickListener, onToFullscreenClickListener = onToFullscreenClickListener, onToSplitScreenClickListener = onToSplitScreenClickListener, + onToFloatClickListener = onToFloatClickListener, onNewWindowClickListener = onNewWindowClickListener, onManageWindowsClickListener = onManageWindowsClickListener, onChangeAspectRatioClickListener = onChangeAspectRatioClickListener, @@ -183,6 +185,7 @@ class HandleMenu( onToDesktopClickListener: () -> Unit, onToFullscreenClickListener: () -> Unit, onToSplitScreenClickListener: () -> Unit, + onToFloatClickListener: () -> Unit, onNewWindowClickListener: () -> Unit, onManageWindowsClickListener: () -> Unit, onChangeAspectRatioClickListener: () -> Unit, @@ -208,6 +211,7 @@ class HandleMenu( this.onToDesktopClickListener = onToDesktopClickListener this.onToFullscreenClickListener = onToFullscreenClickListener this.onToSplitScreenClickListener = onToSplitScreenClickListener + this.onToFloatClickListener = onToFloatClickListener this.onNewWindowClickListener = onNewWindowClickListener this.onManageWindowsClickListener = onManageWindowsClickListener this.onChangeAspectRatioClickListener = onChangeAspectRatioClickListener @@ -502,6 +506,7 @@ class HandleMenu( var onToDesktopClickListener: (() -> Unit)? = null var onToFullscreenClickListener: (() -> Unit)? = null var onToSplitScreenClickListener: (() -> Unit)? = null + var onToFloatClickListener: (() -> Unit)? = null var onNewWindowClickListener: (() -> Unit)? = null var onManageWindowsClickListener: (() -> Unit)? = null var onChangeAspectRatioClickListener: (() -> Unit)? = null @@ -515,6 +520,7 @@ class HandleMenu( splitscreenBtn.setOnClickListener { onToSplitScreenClickListener?.invoke() } desktopBtn.setOnClickListener { onToDesktopClickListener?.invoke() } openInAppOrBrowserBtn.setOnClickListener { onOpenInAppOrBrowserClickListener?.invoke() } + floatingBtn.setOnClickListener { onToFloatClickListener?.invoke() } openByDefaultBtn.setOnClickListener { onOpenByDefaultClickListener?.invoke() } @@ -640,8 +646,9 @@ class HandleMenu( private fun bindWindowingPill(style: MenuStyle) { windowingPill.background.setTint(style.backgroundColor) - // TODO: Remove once implemented. - floatingBtn.visibility = View.GONE + if (!com.android.wm.shell.Flags.enableBubbleAnything()) { + floatingBtn.visibility = View.GONE + } fullscreenBtn.isSelected = taskInfo.isFullscreen fullscreenBtn.isEnabled = !taskInfo.isFullscreen diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.kt index 96839ce47725..88cc94ca8728 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.kt @@ -25,6 +25,7 @@ import android.graphics.PixelFormat import android.graphics.PointF import android.graphics.Rect import android.os.Trace +import android.view.Choreographer import android.view.Display import android.view.LayoutInflater import android.view.SurfaceControl @@ -331,6 +332,7 @@ public class ResizeVeil @JvmOverloads constructor( .setPosition(icon, iconPosition.x, iconPosition.y) .setPosition(parentSurface, newBounds.left.toFloat(), newBounds.top.toFloat()) .setWindowCrop(parentSurface, newBounds.width(), newBounds.height()) + .setFrameTimeline(Choreographer.getInstance().vsyncId) } /** diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index fe0852689ee9..e032616e7d43 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -93,6 +93,7 @@ import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase import com.android.wm.shell.TestRunningTaskInfoBuilder import com.android.wm.shell.TestShellExecutor +import com.android.wm.shell.bubbles.BubbleController import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.common.MultiInstanceHelper @@ -232,6 +233,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Mock private lateinit var mockToast: Toast private lateinit var mockitoSession: StaticMockitoSession @Mock private lateinit var desktopTilingDecorViewModel: DesktopTilingDecorViewModel + @Mock private lateinit var bubbleController: BubbleController @Mock private lateinit var desktopWindowDecoration: DesktopModeWindowDecoration @Mock private lateinit var resources: Resources @Mock @@ -383,6 +385,7 @@ class DesktopTasksControllerTest : ShellTestCase() { desktopModeUiEventLogger, desktopTilingDecorViewModel, desktopWallpaperActivityTokenProvider, + Optional.of(bubbleController), ) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTest.java index 17fd95b69dba..66636c56bb64 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTest.java @@ -20,6 +20,11 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; @@ -45,7 +50,8 @@ import android.graphics.Insets; import android.graphics.Rect; import android.graphics.Region; import android.os.Looper; -import android.testing.AndroidTestingRunner; +import android.platform.test.flag.junit.FlagsParameterization; +import android.platform.test.flag.junit.SetFlagsRule; import android.testing.TestableLooper; import android.view.SurfaceControl; import android.view.SurfaceHolder; @@ -55,6 +61,7 @@ import android.window.WindowContainerTransaction; import androidx.test.filters.SmallTest; +import com.android.wm.shell.Flags; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestHandler; @@ -65,17 +72,33 @@ import com.android.wm.shell.transition.Transitions; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; +import java.util.List; + +import platform.test.runner.parameterized.ParameterizedAndroidJunit4; +import platform.test.runner.parameterized.Parameters; + @SmallTest -@RunWith(AndroidTestingRunner.class) +@RunWith(ParameterizedAndroidJunit4.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) public class TaskViewTest extends ShellTestCase { + @Parameters(name = "{0}") + public static List<FlagsParameterization> getParams() { + return FlagsParameterization.allCombinationsOf(Flags.FLAG_TASK_VIEW_REPOSITORY); + } + + @Rule + public final SetFlagsRule mSetFlagsRule; + @Mock TaskView.Listener mViewListener; @Mock @@ -84,6 +107,8 @@ public class TaskViewTest extends ShellTestCase { WindowContainerToken mToken; @Mock ShellTaskOrganizer mOrganizer; + @Captor + ArgumentCaptor<WindowContainerTransaction> mWctCaptor; @Mock HandlerExecutor mExecutor; @Mock @@ -98,9 +123,14 @@ public class TaskViewTest extends ShellTestCase { Context mContext; TaskView mTaskView; + TaskViewRepository mTaskViewRepository; TaskViewTransitions mTaskViewTransitions; TaskViewTaskController mTaskViewTaskController; + public TaskViewTest(FlagsParameterization flags) { + mSetFlagsRule = new SetFlagsRule(flags); + } + @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -134,9 +164,10 @@ public class TaskViewTest extends ShellTestCase { if (Transitions.ENABLE_SHELL_TRANSITIONS) { doReturn(true).when(mTransitions).isRegistered(); } - mTaskViewTransitions = spy(new TaskViewTransitions(mTransitions)); - mTaskViewTaskController = spy(new TaskViewTaskController(mContext, mOrganizer, - mTaskViewTransitions, mSyncQueue)); + mTaskViewRepository = new TaskViewRepository(); + mTaskViewTransitions = spy(new TaskViewTransitions(mTransitions, mTaskViewRepository)); + mTaskViewTaskController = new TaskViewTaskController(mContext, mOrganizer, + mTaskViewTransitions, mSyncQueue); mTaskView = new TaskView(mContext, mTaskViewTaskController); mTaskView.setHandler(mViewHandler); mTaskView.setListener(mExecutor, mViewListener); @@ -482,8 +513,14 @@ public class TaskViewTest extends ShellTestCase { // Surface created, but task not available so bounds / visibility isn't set mTaskView.surfaceCreated(mock(SurfaceHolder.class)); - verify(mTaskViewTransitions, never()).updateVisibilityState( - eq(mTaskViewTaskController), eq(true)); + if (TaskViewTransitions.useRepo()) { + assertNotNull(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController)); + assertFalse(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController) + .mVisible); + } else { + verify(mTaskViewTransitions, never()).updateVisibilityState( + eq(mTaskViewTaskController), eq(true)); + } // Make the task available WindowContainerTransaction wct = mock(WindowContainerTransaction.class); @@ -492,8 +529,16 @@ public class TaskViewTest extends ShellTestCase { // Bounds got set verify(wct).setBounds(any(WindowContainerToken.class), eq(bounds)); // Visibility & bounds state got set - verify(mTaskViewTransitions).updateVisibilityState(eq(mTaskViewTaskController), eq(true)); - verify(mTaskViewTransitions).updateBoundsState(eq(mTaskViewTaskController), eq(bounds)); + if (TaskViewTransitions.useRepo()) { + assertTrue(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController) + .mVisible); + assertEquals(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController) + .mBounds, bounds); + } else { + verify(mTaskViewTransitions).updateVisibilityState(eq(mTaskViewTaskController), + eq(true)); + verify(mTaskViewTransitions).updateBoundsState(eq(mTaskViewTaskController), eq(bounds)); + } } @Test @@ -507,8 +552,15 @@ public class TaskViewTest extends ShellTestCase { // Surface created, but task not available so bounds / visibility isn't set mTaskView.surfaceCreated(mock(SurfaceHolder.class)); - verify(mTaskViewTransitions, never()).updateVisibilityState( - eq(mTaskViewTaskController), eq(true)); + if (TaskViewTransitions.useRepo()) { + assertNotNull(mTaskViewTransitions.getRepository().byTaskView( + mTaskViewTaskController)); + assertFalse(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController) + .mVisible); + } else { + verify(mTaskViewTransitions, never()).updateVisibilityState( + eq(mTaskViewTaskController), eq(true)); + } // Make the task available / start prepareOpen WindowContainerTransaction wct = mock(WindowContainerTransaction.class); @@ -519,8 +571,16 @@ public class TaskViewTest extends ShellTestCase { // Bounds got set verify(wct).setBounds(any(WindowContainerToken.class), eq(bounds)); // Visibility & bounds state got set - verify(mTaskViewTransitions).updateVisibilityState(eq(mTaskViewTaskController), eq(true)); - verify(mTaskViewTransitions).updateBoundsState(eq(mTaskViewTaskController), eq(bounds)); + if (TaskViewTransitions.useRepo()) { + assertTrue(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController) + .mVisible); + assertEquals(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController) + .mBounds, bounds); + } else { + verify(mTaskViewTransitions).updateVisibilityState(eq(mTaskViewTaskController), + eq(true)); + verify(mTaskViewTransitions).updateBoundsState(eq(mTaskViewTaskController), eq(bounds)); + } } @Test @@ -541,8 +601,17 @@ public class TaskViewTest extends ShellTestCase { // Bounds do not get set as there is no surface verify(wct, never()).setBounds(any(WindowContainerToken.class), any()); // Visibility is set to false, bounds aren't set - verify(mTaskViewTransitions).updateVisibilityState(eq(mTaskViewTaskController), eq(false)); - verify(mTaskViewTransitions, never()).updateBoundsState(eq(mTaskViewTaskController), any()); + if (TaskViewTransitions.useRepo()) { + assertFalse(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController) + .mVisible); + assertTrue(mTaskViewTransitions.getRepository().byTaskView(mTaskViewTaskController) + .mBounds.isEmpty()); + } else { + verify(mTaskViewTransitions).updateVisibilityState(eq(mTaskViewTaskController), + eq(false)); + verify(mTaskViewTransitions, never()).updateBoundsState(eq(mTaskViewTaskController), + any()); + } } @Test @@ -576,7 +645,7 @@ public class TaskViewTest extends ShellTestCase { mTaskViewTaskController.setTaskNotFound(); mTaskViewTaskController.onTaskAppeared(mTaskInfo, mLeash); - verify(mTaskViewTaskController).cleanUpPendingTask(); + assertNull(mTaskViewTaskController.getTaskInfo()); verify(mTaskViewTransitions).closeTaskView(any(), eq(mTaskViewTaskController)); } @@ -585,7 +654,8 @@ public class TaskViewTest extends ShellTestCase { assumeTrue(Transitions.ENABLE_SHELL_TRANSITIONS); mTaskViewTaskController.onTaskAppeared(mTaskInfo, mLeash); - verify(mTaskViewTaskController, never()).cleanUpPendingTask(); + assertEquals(mTaskInfo, mTaskViewTaskController.getPendingInfo()); + verify(mTaskViewTransitions, never()).closeTaskView(any(), any()); } @Test @@ -596,20 +666,20 @@ public class TaskViewTest extends ShellTestCase { mTaskView.setCaptionInsets(Insets.of(insets)); mTaskView.onComputeInternalInsets(new ViewTreeObserver.InternalInsetsInfo()); - verify(mTaskViewTaskController).applyCaptionInsetsIfNeeded(); verify(mOrganizer, never()).applyTransaction(any()); mTaskView.surfaceCreated(mock(SurfaceHolder.class)); reset(mOrganizer); - reset(mTaskViewTaskController); WindowContainerTransaction wct = new WindowContainerTransaction(); mTaskViewTaskController.prepareOpenAnimation(true /* newTask */, new SurfaceControl.Transaction(), new SurfaceControl.Transaction(), mTaskInfo, mLeash, wct); mTaskView.onComputeInternalInsets(new ViewTreeObserver.InternalInsetsInfo()); - verify(mTaskViewTaskController).applyCaptionInsetsIfNeeded(); - verify(mOrganizer).applyTransaction(any()); + verify(mOrganizer).applyTransaction(mWctCaptor.capture()); + assertTrue(mWctCaptor.getValue().getHierarchyOps().stream().anyMatch(hop -> + hop.getType() == WindowContainerTransaction.HierarchyOp + .HIERARCHY_OP_TYPE_ADD_INSETS_FRAME_PROVIDER)); } @Test @@ -621,14 +691,15 @@ public class TaskViewTest extends ShellTestCase { mTaskViewTaskController.prepareOpenAnimation(true /* newTask */, new SurfaceControl.Transaction(), new SurfaceControl.Transaction(), mTaskInfo, mLeash, wct); - reset(mTaskViewTaskController); reset(mOrganizer); Rect insets = new Rect(0, 400, 0, 0); mTaskView.setCaptionInsets(Insets.of(insets)); mTaskView.onComputeInternalInsets(new ViewTreeObserver.InternalInsetsInfo()); - verify(mTaskViewTaskController).applyCaptionInsetsIfNeeded(); - verify(mOrganizer).applyTransaction(any()); + verify(mOrganizer).applyTransaction(mWctCaptor.capture()); + assertTrue(mWctCaptor.getValue().getHierarchyOps().stream().anyMatch(hop -> + hop.getType() == WindowContainerTransaction.HierarchyOp + .HIERARCHY_OP_TYPE_ADD_INSETS_FRAME_PROVIDER)); } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTransitionsTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTransitionsTest.java index 60e203009e8c..5f6f18f82fb4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTransitionsTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTransitionsTest.java @@ -83,6 +83,7 @@ public class TaskViewTransitionsTest extends ShellTestCase { @Mock WindowContainerToken mToken; + TaskViewRepository mTaskViewRepository; TaskViewTransitions mTaskViewTransitions; public TaskViewTransitionsTest(FlagsParameterization flags) { @@ -102,7 +103,8 @@ public class TaskViewTransitionsTest extends ShellTestCase { mTaskInfo.taskId = 314; mTaskInfo.taskDescription = mock(ActivityManager.TaskDescription.class); - mTaskViewTransitions = spy(new TaskViewTransitions(mTransitions)); + mTaskViewRepository = new TaskViewRepository(); + mTaskViewTransitions = spy(new TaskViewTransitions(mTransitions, mTaskViewRepository)); mTaskViewTransitions.addTaskView(mTaskViewTaskController); when(mTaskViewTaskController.getTaskInfo()).thenReturn(mTaskInfo); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java index e99e5cce8b27..7dac0859b7e9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java @@ -1091,6 +1091,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), openInBrowserCaptor.capture(), any(), any(), @@ -1127,6 +1128,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), openInBrowserCaptor.capture(), any(), any(), @@ -1158,6 +1160,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), openInBrowserCaptor.capture(), any(), any(), @@ -1226,6 +1229,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), closeClickListener.capture(), any(), anyBoolean() @@ -1258,6 +1262,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), /* forceShowSystemBars= */ eq(true) ); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt index cbfb57edc72d..f90988e90b22 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt @@ -307,6 +307,7 @@ class HandleMenuTest : ShellTestCase() { onToDesktopClickListener = mock(), onToFullscreenClickListener = mock(), onToSplitScreenClickListener = mock(), + onToFloatClickListener = mock(), onNewWindowClickListener = mock(), onManageWindowsClickListener = mock(), onChangeAspectRatioClickListener = mock(), diff --git a/media/java/android/media/quality/MediaQualityManager.java b/media/java/android/media/quality/MediaQualityManager.java index 7e87462b64de..166b388d9b7b 100644 --- a/media/java/android/media/quality/MediaQualityManager.java +++ b/media/java/android/media/quality/MediaQualityManager.java @@ -276,16 +276,19 @@ public final class MediaQualityManager { /** * Sets preferred default picture profile. * - * @param id the ID of the default profile. {@code null} to unset the default profile. + * @param pictureProfileId the ID of the default profile. {@code null} to unset the default + * profile. * @return {@code true} if it's set successfully; {@code false} otherwise. * + * @see PictureProfile#getProfileId() + * * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.MANAGE_GLOBAL_PICTURE_QUALITY_SERVICE) - public boolean setDefaultPictureProfile(@Nullable String id) { + public boolean setDefaultPictureProfile(@Nullable String pictureProfileId) { try { - return mService.setDefaultPictureProfile(id, mUserHandle); + return mService.setDefaultPictureProfile(pictureProfileId, mUserHandle); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -467,16 +470,19 @@ public final class MediaQualityManager { /** * Sets preferred default sound profile. * - * @param id the ID of the default profile. {@code null} to unset the default profile. + * @param soundProfileId the ID of the default profile. {@code null} to unset the default + * profile. * @return {@code true} if it's set successfully; {@code false} otherwise. * + * @see SoundProfile#getProfileId() + * * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.MANAGE_GLOBAL_SOUND_QUALITY_SERVICE) - public boolean setDefaultSoundProfile(@Nullable String id) { + public boolean setDefaultSoundProfile(@Nullable String soundProfileId) { try { - return mService.setDefaultSoundProfile(id, mUserHandle); + return mService.setDefaultSoundProfile(soundProfileId, mUserHandle); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml index db0704fdb19a..5c07f3a16337 100644 --- a/packages/CompanionDeviceManager/res/values-ar/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml @@ -36,12 +36,9 @@ <string name="title_nearby_device_streaming" msgid="2727103756701741359">"هل تريد السماح لـ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ببث التطبيقات من <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> إلى <xliff:g id="DEVICE_NAME">%3$s</xliff:g>؟"</string> <string name="summary_nearby_device_streaming" msgid="70434958004946884">"سيتمكّن \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" من الوصول إلى كل المحتوى المعروض أو الذي يتم تشغيله على <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>، بما في ذلك الملفات الصوتية والصور ومعلومات الدفع وكلمات المرور والرسائل.<br/><br/>سيتمكّن \"<xliff:g id="APP_NAME_2">%1$s</xliff:g>\" من بثّ التطبيقات إلى <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> إلى أن توقِف إمكانية استخدام هذا الإذن."</string> <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن <xliff:g id="DEVICE_NAME">%2$s</xliff:g> لبثّ التطبيقات من <xliff:g id="DEVICE_TYPE">%3$s</xliff:g>"</string> - <!-- no translation found for title_sensor_device_streaming (2395553261097861497) --> - <skip /> - <!-- no translation found for summary_sensor_device_streaming (3413105061195145547) --> - <skip /> - <!-- no translation found for helper_summary_sensor_device_streaming (8860174545653786353) --> - <skip /> + <string name="title_sensor_device_streaming" msgid="2395553261097861497">"يُرجى تأكيد سماحك لتطبيق <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ببثّ المحتوى الصوتي وميزات النظام بين <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> و<strong><xliff:g id="DEVICE_NAME">%3$s</xliff:g></strong>"</string> + <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"سيتمكّن \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" من الوصول إلى كل المحتوى الذي يتم تشغيله على \"<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>\".<br/><br/>سيتمكّن \"<xliff:g id="APP_NAME_2">%1$s</xliff:g>\" من بثّ المحتوى الصوتي إلى \"<xliff:g id="DEVICE_NAME_3">%3$s</xliff:g>\" إلى أن يتم إيقاف استخدام هذا الإذن."</string> + <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" لبثّ المحتوى الصوتي وميزات النظام بين أجهزتك."</string> <string name="profile_name_generic" msgid="6851028682723034988">"جهاز"</string> <string name="summary_generic" msgid="1761976003668044801">"سيتمكّن هذا التطبيق من مزامنة المعلومات، مثل اسم المتصل، بين هاتفك والجهاز المحدّد."</string> <string name="consent_yes" msgid="8344487259618762872">"السماح"</string> diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml index f4a95a462861..7224896392e4 100644 --- a/packages/CompanionDeviceManager/res/values-hi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml @@ -36,12 +36,9 @@ <string name="title_nearby_device_streaming" msgid="2727103756701741359">"क्या <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> को आपके <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> में मौजूद ऐप्लिकेशन को <strong><xliff:g id="DEVICE_NAME">%3$s</xliff:g></strong> पर स्ट्रीम करने की अनुमति देनी है?"</string> <string name="summary_nearby_device_streaming" msgid="70434958004946884">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> के पास ऐसे किसी भी कॉन्टेंट का ऐक्सेस होगा जो आपके <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g> पर दिखता है या चलाया जाता है. इसमें ऑडियो, फ़ोटो, पेमेंट संबंधी जानकारी, पासवर्ड, और मैसेज शामिल हैं.<br/><br/><xliff:g id="APP_NAME_2">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> पर तब ऐप्लिकेशन को स्ट्रीम कर सकेगा, जब तक आप यह अनुमति हटा न दें."</string> <string name="helper_summary_nearby_device_streaming" msgid="4712712177819370967">"<xliff:g id="APP_NAME">%1$s</xliff:g> को <xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से, आपके <xliff:g id="DEVICE_TYPE">%3$s</xliff:g> में मौजूद ऐप्लिकेशन को स्ट्रीम करने की अनुमति चाहिए"</string> - <!-- no translation found for title_sensor_device_streaming (2395553261097861497) --> - <skip /> - <!-- no translation found for summary_sensor_device_streaming (3413105061195145547) --> - <skip /> - <!-- no translation found for helper_summary_sensor_device_streaming (8860174545653786353) --> - <skip /> + <string name="title_sensor_device_streaming" msgid="2395553261097861497">"क्या <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> को आपके <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> और <strong><xliff:g id="DEVICE_NAME">%3$s</xliff:g></strong> पर ऑडियो और सिस्टम की सुविधाएं स्ट्रीम करने की अनुमति देनी है?"</string> + <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> के पास, आपके <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g> पर चलाए जाने वाले हर तरह के कॉन्टेंट का ऐक्सेस होगा.<br/><br/><xliff:g id="APP_NAME_2">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> पर तब तक ऑडियो स्ट्रीम कर पाएगा, जब तक आप इस अनुमति को हटा न दें."</string> + <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से <xliff:g id="APP_NAME">%1$s</xliff:g>, आपके डिवाइस की ऑडियो और सिस्टम की सुविधाओं को आपके दूसरे डिवाइसों पर स्ट्रीम करने की अनुमति मांग रहा है."</string> <string name="profile_name_generic" msgid="6851028682723034988">"डिवाइस"</string> <string name="summary_generic" msgid="1761976003668044801">"यह ऐप्लिकेशन, आपके फ़ोन और चुने हुए डिवाइस के बीच जानकारी सिंक करेगा. जैसे, कॉल करने वाले व्यक्ति का नाम"</string> <string name="consent_yes" msgid="8344487259618762872">"अनुमति दें"</string> diff --git a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml index 5661868c8426..0afec99e603d 100644 --- a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml +++ b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml @@ -42,7 +42,7 @@ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Želite da napravite pristupni ključ da biste se prijavili u <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="choose_create_option_password_title" msgid="4481366993598649224">"Želite da sačuvate lozinku da biste se prijavili u <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Želite da sačuvate podatke za prijavljivanje za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> - <string name="passkey" msgid="632353688396759522">"pristupni kôd"</string> + <string name="passkey" msgid="632353688396759522">"pristupni ključ"</string> <string name="password" msgid="6738570945182936667">"lozinka"</string> <string name="passkeys" msgid="5733880786866559847">"pristupni kodovi"</string> <string name="passwords" msgid="5419394230391253816">"lozinke"</string> @@ -61,7 +61,7 @@ <string name="more_options_usage_passwords" msgid="1632047277723187813">"Lozinki: <xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g>"</string> <string name="more_options_usage_passkeys" msgid="5390320437243042237">"Pristupnih kodova: <xliff:g id="PASSKEYSNUMBER">%1$s</xliff:g>"</string> <string name="more_options_usage_credentials" msgid="1785697001787193984">"<xliff:g id="TOTALCREDENTIALSNUMBER">%1$s</xliff:g> akreditiva"</string> - <string name="passkey_before_subtitle" msgid="2448119456208647444">"Pristupni kôd"</string> + <string name="passkey_before_subtitle" msgid="2448119456208647444">"Pristupni ključ"</string> <string name="another_device" msgid="5147276802037801217">"Drugi uređaj"</string> <string name="other_password_manager" msgid="565790221427004141">"Drugi menadžeri lozinki"</string> <string name="close_sheet" msgid="1393792015338908262">"Zatvorite tabelu"</string> diff --git a/packages/CredentialManager/res/values-sr/strings.xml b/packages/CredentialManager/res/values-sr/strings.xml index d28cefe93345..8e823c46a1d7 100644 --- a/packages/CredentialManager/res/values-sr/strings.xml +++ b/packages/CredentialManager/res/values-sr/strings.xml @@ -42,7 +42,7 @@ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Желите да направите приступни кључ да бисте се пријавили у <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="choose_create_option_password_title" msgid="4481366993598649224">"Желите да сачувате лозинку да бисте се пријавили у <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Желите да сачувате податке за пријављивање за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> - <string name="passkey" msgid="632353688396759522">"приступни кôд"</string> + <string name="passkey" msgid="632353688396759522">"приступни кључ"</string> <string name="password" msgid="6738570945182936667">"лозинка"</string> <string name="passkeys" msgid="5733880786866559847">"приступни кодови"</string> <string name="passwords" msgid="5419394230391253816">"лозинке"</string> @@ -61,7 +61,7 @@ <string name="more_options_usage_passwords" msgid="1632047277723187813">"Лозинки: <xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g>"</string> <string name="more_options_usage_passkeys" msgid="5390320437243042237">"Приступних кодова: <xliff:g id="PASSKEYSNUMBER">%1$s</xliff:g>"</string> <string name="more_options_usage_credentials" msgid="1785697001787193984">"<xliff:g id="TOTALCREDENTIALSNUMBER">%1$s</xliff:g> акредитива"</string> - <string name="passkey_before_subtitle" msgid="2448119456208647444">"Приступни кôд"</string> + <string name="passkey_before_subtitle" msgid="2448119456208647444">"Приступни кључ"</string> <string name="another_device" msgid="5147276802037801217">"Други уређај"</string> <string name="other_password_manager" msgid="565790221427004141">"Други менаџери лозинки"</string> <string name="close_sheet" msgid="1393792015338908262">"Затворите табелу"</string> diff --git a/packages/CredentialManager/wear/res/values-fa/strings.xml b/packages/CredentialManager/wear/res/values-fa/strings.xml index 80537695c95c..a38509453ba8 100644 --- a/packages/CredentialManager/wear/res/values-fa/strings.xml +++ b/packages/CredentialManager/wear/res/values-fa/strings.xml @@ -25,7 +25,7 @@ <string name="dialog_sign_in_options_button" msgid="448002958902615054">"گزینههای ورود به سیستم"</string> <string name="sign_in_options_title" msgid="6720572645638986680">"گزینههای ورود به سیستم"</string> <string name="provider_list_title" msgid="6803918216129492212">"مدیریت ورود به سیستم"</string> - <string name="choose_sign_in_title" msgid="3616025924746872202">"ورود به سیستم را انتخاب کنید"</string> + <string name="choose_sign_in_title" msgid="3616025924746872202">"انتخاب روش ورود به سیستم"</string> <string name="choose_passkey_title" msgid="8459270617632817465">"گذرکلید را انتخاب کنید"</string> <string name="choose_password_title" msgid="7610721820858017214">"گذرواژه را انتخاب کنید"</string> <string name="sign_in_on_phone_button" msgid="7618621977586522403">"ورود به سیستم در تلفن"</string> diff --git a/packages/CredentialManager/wear/res/values-pt/strings.xml b/packages/CredentialManager/wear/res/values-pt/strings.xml index c451b256b078..1a1c16aaa7b2 100644 --- a/packages/CredentialManager/wear/res/values-pt/strings.xml +++ b/packages/CredentialManager/wear/res/values-pt/strings.xml @@ -25,7 +25,7 @@ <string name="dialog_sign_in_options_button" msgid="448002958902615054">"Opções de login"</string> <string name="sign_in_options_title" msgid="6720572645638986680">"Opções de login"</string> <string name="provider_list_title" msgid="6803918216129492212">"Gerenciar logins"</string> - <string name="choose_sign_in_title" msgid="3616025924746872202">"Escolher opção de login"</string> + <string name="choose_sign_in_title" msgid="3616025924746872202">"Escolha um login"</string> <string name="choose_passkey_title" msgid="8459270617632817465">"Escolher chave de acesso"</string> <string name="choose_password_title" msgid="7610721820858017214">"Escolher senha"</string> <string name="sign_in_on_phone_button" msgid="7618621977586522403">"Fazer login no smartphone"</string> diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java index 170cb4546d0c..44990f751991 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java @@ -47,19 +47,19 @@ import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; + import androidx.annotation.NonNull; import androidx.annotation.StringRes; + +import com.android.packageinstaller.common.EventResultPersister; +import com.android.packageinstaller.common.UninstallEventReceiver; import com.android.packageinstaller.handheld.ErrorDialogFragment; import com.android.packageinstaller.handheld.UninstallAlertDialogFragment; import com.android.packageinstaller.television.ErrorFragment; import com.android.packageinstaller.television.UninstallAlertFragment; import com.android.packageinstaller.television.UninstallAppProgress; -import com.android.packageinstaller.common.EventResultPersister; -import com.android.packageinstaller.common.UninstallEventReceiver; import com.android.packageinstaller.v2.ui.UninstallLaunch; -import java.util.List; - /* * This activity presents UI to uninstall an application. Usually launched with intent * Intent.ACTION_UNINSTALL_PKG_COMMAND and attribute @@ -181,12 +181,15 @@ public class UninstallerActivity extends Activity { if (mDialogInfo.user == null) { mDialogInfo.user = Process.myUserHandle(); } else { - List<UserHandle> profiles = userManager.getUserProfiles(); - if (!profiles.contains(mDialogInfo.user)) { - Log.e(TAG, "User " + Process.myUserHandle() + " can't request uninstall " - + "for user " + mDialogInfo.user); - showUserIsNotAllowed(); - return; + if (!mDialogInfo.user.equals(Process.myUserHandle())) { + final boolean isCurrentUserProfileOwner = Process.myUserHandle().equals( + userManager.getProfileParent(mDialogInfo.user)); + if (!isCurrentUserProfileOwner) { + Log.e(TAG, "User " + Process.myUserHandle() + " can't request uninstall " + + "for user " + mDialogInfo.user); + showUserIsNotAllowed(); + return; + } } } diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index d739aafea929..933c512313ce 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -10,19 +10,19 @@ package { android_library { name: "SettingsLib", defaults: [ - "SettingsLintDefaults", "SettingsLibAvatarPickerDefaults", + "SettingsLintDefaults", ], static_libs: [ "androidx.localbroadcastmanager_localbroadcastmanager", "androidx.room_room-runtime", "androidx.sqlite_sqlite", - "zxing-core", "guava", + "zxing-core", - "WifiTrackerLibRes", "//frameworks/libs/systemui:iconloader", + "WifiTrackerLibRes", "setupdesign", "SettingsLibActionBarShadow", @@ -31,8 +31,8 @@ android_library { "SettingsLibAppPreference", "SettingsLibBannerMessagePreference", "SettingsLibBarChartPreference", - "SettingsLibButtonPreference", "SettingsLibBulletPreference", + "SettingsLibButtonPreference", "SettingsLibCardPreference", "SettingsLibCollapsingToolbarBaseActivity", "SettingsLibDeviceStateRotationLock", @@ -50,6 +50,7 @@ android_library { "SettingsLibProgressBar", "SettingsLibRestrictedLockUtils", "SettingsLibSearchWidget", + "SettingsLibSegmentedButtonPreference", "SettingsLibSelectorWithWidgetPreference", "SettingsLibSettingsSpinner", "SettingsLibSettingsTransition", @@ -62,7 +63,7 @@ android_library { "SettingsLibZeroStatePreference", "settingslib_media_flags_lib", ], - libs:[ + libs: [ // This flag library has been added in frameworks jar "aconfig_settingslib_flags_java_lib", "wifi_framework_aconfig_flags_lib", @@ -118,8 +119,8 @@ soong_config_module_type { "legacy_avatar_picker_app_enabled", ], properties: [ - "static_libs", "manifest", + "static_libs", ], } 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 3c8d6ed0bf55..19fa5078fd5b 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt @@ -44,8 +44,8 @@ abstract class GetPreferenceGraphApiHandler( ): PreferenceGraphProto { val builder = PreferenceGraphBuilder.of(application, callingPid, callingUid, request) if (request.screenKeys.isEmpty()) { - for (key in PreferenceScreenRegistry.preferenceScreens.keys) { - builder.addPreferenceScreenFromRegistry(key) + PreferenceScreenRegistry.preferenceScreenMetadataCreators.forEachKeyAsync { + builder.addPreferenceScreenFromRegistry(it) } for (provider in preferenceScreenProviders) { builder.addPreferenceScreenProvider(provider) 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 de5731eacfd7..2fac54557bef 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGetterApi.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGetterApi.kt @@ -98,7 +98,7 @@ class PreferenceGetterApiHandler( val preferences = mutableMapOf<PreferenceCoordinate, PreferenceProto>() val flags = request.flags for ((screenKey, coordinates) in request.preferences.groupBy { it.screenKey }) { - val screenMetadata = PreferenceScreenRegistry[screenKey] + val screenMetadata = PreferenceScreenRegistry.create(application, screenKey) if (screenMetadata == null) { for (coordinate in coordinates) { errors[coordinate] = PreferenceGetterErrorCode.NOT_FOUND diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt index 2cf32decd5e2..f001fad69dc6 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt @@ -141,7 +141,7 @@ private constructor( } suspend fun addPreferenceScreenFromRegistry(key: String): Boolean { - val metadata = PreferenceScreenRegistry[key] ?: return false + val metadata = PreferenceScreenRegistry.create(context, key) ?: return false return addPreferenceScreenMetadata(metadata) } 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 bef4bb297654..3c870acf2291 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceSetterApi.kt @@ -112,7 +112,8 @@ class PreferenceSetterApiHandler( request: PreferenceSetterRequest, ): Int { val screenMetadata = - PreferenceScreenRegistry[request.screenKey] ?: return PreferenceSetterResult.UNSUPPORTED + PreferenceScreenRegistry.create(application, request.screenKey) + ?: return PreferenceSetterResult.UNSUPPORTED val key = request.key val metadata = screenMetadata.getPreferenceHierarchy(application).find(key) diff --git a/packages/SettingsLib/Metadata/Android.bp b/packages/SettingsLib/Metadata/Android.bp index 207637f86372..564c3985264d 100644 --- a/packages/SettingsLib/Metadata/Android.bp +++ b/packages/SettingsLib/Metadata/Android.bp @@ -14,10 +14,9 @@ android_library { ], srcs: [":SettingsLibMetadata-srcs"], static_libs: [ + "SettingsLibDataStore", "androidx.annotation_annotation", "androidx.fragment_fragment", - "guava", - "SettingsLibDataStore", ], kotlincflags: ["-Xjvm-default=all"], } diff --git a/packages/SettingsLib/Metadata/processor/src/com/android/settingslib/metadata/PreferenceScreenAnnotationProcessor.kt b/packages/SettingsLib/Metadata/processor/src/com/android/settingslib/metadata/PreferenceScreenAnnotationProcessor.kt index 620d717faf69..1049cceb4f76 100644 --- a/packages/SettingsLib/Metadata/processor/src/com/android/settingslib/metadata/PreferenceScreenAnnotationProcessor.kt +++ b/packages/SettingsLib/Metadata/processor/src/com/android/settingslib/metadata/PreferenceScreenAnnotationProcessor.kt @@ -16,7 +16,6 @@ package com.android.settingslib.metadata -import java.util.TreeMap import javax.annotation.processing.AbstractProcessor import javax.annotation.processing.ProcessingEnvironment import javax.annotation.processing.RoundEnvironment @@ -33,8 +32,7 @@ import javax.tools.Diagnostic /** Processor to gather preference screens annotated with `@ProvidePreferenceScreen`. */ class PreferenceScreenAnnotationProcessor : AbstractProcessor() { - private val screens = TreeMap<String, ConstructorType>() - private val overlays = mutableMapOf<String, String>() + private val screens = mutableListOf<Screen>() private val contextType: TypeMirror by lazy { processingEnv.elementUtils.getTypeElement("android.content.Context").asType() } @@ -94,15 +92,10 @@ class PreferenceScreenAnnotationProcessor : AbstractProcessor() { ) return } - val screenQualifiedName = qualifiedName.toString() - screens[screenQualifiedName] = constructorType val annotation = annotationMirrors.single { it.isElement(annotationElement) } - val overlay = annotation.getOverlay() - if (overlay != null) { - overlays.put(overlay, screenQualifiedName)?.let { - error("$overlay has been overlaid by $it", this) - } - } + val key = annotation.fieldValue<String>("value")!! + val overlay = annotation.fieldValue<Boolean>("overlay") == true + screens.add(Screen(key, overlay, qualifiedName.toString(), constructorType)) } private fun codegen() { @@ -119,68 +112,76 @@ class PreferenceScreenAnnotationProcessor : AbstractProcessor() { } private fun generateCode(outputPkg: String, outputClass: String, outputFun: String) { - for ((overlay, screen) in overlays) { - if (screens.remove(overlay) == null) { - warn("$overlay is overlaid by $screen but not annotated with @$ANNOTATION_NAME") - } else { - processingEnv.messager.printMessage( - Diagnostic.Kind.NOTE, - "$overlay is overlaid by $screen", - ) + // sort by screen keys to make the output deterministic and naturally fit to FixedArrayMap + screens.sort() + val javaFileObject = + try { + processingEnv.filer.createSourceFile("$outputPkg.$outputClass") + } catch (e: Exception) { + // quick fix: gradle runs this processor twice unexpectedly + warn("cannot createSourceFile: $e") + return } - } - processingEnv.filer.createSourceFile("$outputPkg.$outputClass").openWriter().use { + javaFileObject.openWriter().use { it.write("package $outputPkg;\n\n") - it.write("import $PACKAGE.$PREFERENCE_SCREEN_METADATA;\n\n") + it.write("import $PACKAGE.FixedArrayMap;\n") + it.write("import $PACKAGE.FixedArrayMap.OrderedInitializer;\n") + it.write("import $PACKAGE.$CREATOR;\n\n") it.write("// Generated by annotation processor for @$ANNOTATION_NAME\n") it.write("public final class $outputClass {\n") it.write(" private $outputClass() {}\n\n") - it.write( - " public static java.util.List<$PREFERENCE_SCREEN_METADATA> " + - "$outputFun(android.content.Context context) {\n" - ) - it.write( - " java.util.ArrayList<$PREFERENCE_SCREEN_METADATA> screens = " + - "new java.util.ArrayList<>(${screens.size});\n" - ) - for ((screen, constructorType) in screens) { + it.write(" public static FixedArrayMap<String, $CREATOR> $outputFun() {\n") + val size = screens.size + it.write(" return new FixedArrayMap<>($size, $outputClass::init);\n") + it.write(" }\n\n") + fun Screen.write() { + it.write(" screens.put(\"$key\", context -> new $klass(") when (constructorType) { - ConstructorType.DEFAULT -> it.write(" screens.add(new $screen());\n") - ConstructorType.CONTEXT -> it.write(" screens.add(new $screen(context));\n") - ConstructorType.SINGLETON -> it.write(" screens.add($screen.INSTANCE);\n") + ConstructorType.DEFAULT -> it.write("));") + ConstructorType.CONTEXT -> it.write("context));") } + if (overlay) it.write(" // overlay") + it.write("\n") } - for ((overlay, screen) in overlays) { - it.write(" // $overlay is overlaid by $screen\n") + it.write(" private static void init(OrderedInitializer<String, $CREATOR> screens) {\n") + var index = 0 + while (index < size) { + val screen = screens[index] + var next = index + 1 + while (next < size && screen.key == screens[next].key) next++ + val n = next - index + if (n == 1) { + screen.write() + } else if (n == 2 && screen.overlay && !screens[index + 1].overlay) { + it.write(" // ${screen.klass} overlays ${screens[index + 1].klass}\n") + screen.write() + } else { + val msg = StringBuilder("${screen.key} is associated to") + for (i in index until next) msg.append(" ${screens[i]}") + processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, msg) + } + index = next } - it.write(" return screens;\n") - it.write(" }\n") - it.write("}") + it.write(" }\n}") } } private fun AnnotationMirror.isElement(element: TypeElement) = processingEnv.typeUtils.isSameType(annotationType.asElement().asType(), element.asType()) - private fun AnnotationMirror.getOverlay(): String? { + @Suppress("UNCHECKED_CAST") + private fun <T> AnnotationMirror.fieldValue(name: String): T? = field(name)?.value as? T + + private fun AnnotationMirror.field(name: String): AnnotationValue? { for ((key, value) in elementValues) { - if (key.simpleName.contentEquals("overlay")) { - return if (value.isDefaultClassValue(key)) null else value.value.toString() - } + if (key.simpleName.contentEquals(name)) return value } return null } - private fun AnnotationValue.isDefaultClassValue(key: ExecutableElement) = - processingEnv.typeUtils.isSameType( - value as TypeMirror, - key.defaultValue.value as TypeMirror, - ) - private fun TypeElement.getConstructorType(): ConstructorType? { var constructor: ExecutableElement? = null for (element in enclosedElements) { - if (element.isKotlinObject()) return ConstructorType.SINGLETON if (element.kind != ElementKind.CONSTRUCTOR) continue if (!element.modifiers.contains(Modifier.PUBLIC)) continue if (constructor != null) return null @@ -196,21 +197,27 @@ class PreferenceScreenAnnotationProcessor : AbstractProcessor() { } } - private fun Element.isKotlinObject() = - kind == ElementKind.FIELD && - modifiers.run { contains(Modifier.PUBLIC) && contains(Modifier.STATIC) } && - simpleName.toString() == "INSTANCE" - private fun warn(msg: CharSequence) = processingEnv.messager.printMessage(Diagnostic.Kind.WARNING, msg) private fun error(msg: CharSequence, element: Element) = processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, msg, element) + private data class Screen( + val key: String, + val overlay: Boolean, + val klass: String, + val constructorType: ConstructorType, + ) : Comparable<Screen> { + override fun compareTo(other: Screen): Int { + val diff = key.compareTo(other.key) + return if (diff != 0) diff else other.overlay.compareTo(overlay) + } + } + private enum class ConstructorType { DEFAULT, // default constructor with no parameter CONTEXT, // constructor with a Context parameter - SINGLETON, // Kotlin object class } companion object { @@ -218,6 +225,7 @@ class PreferenceScreenAnnotationProcessor : AbstractProcessor() { private const val ANNOTATION_NAME = "ProvidePreferenceScreen" private const val ANNOTATION = "$PACKAGE.$ANNOTATION_NAME" private const val PREFERENCE_SCREEN_METADATA = "PreferenceScreenMetadata" + private const val CREATOR = "PreferenceScreenMetadataCreator" private const val OPTIONS_NAME = "ProvidePreferenceScreenOptions" private const val OPTIONS = "$PACKAGE.$OPTIONS_NAME" diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/Annotations.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/Annotations.kt index ea20a74de3cf..4bed795ea760 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/Annotations.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/Annotations.kt @@ -16,24 +16,20 @@ package com.android.settingslib.metadata -import kotlin.reflect.KClass - /** * Annotation to provide preference screen. * * The annotated class must satisfy either condition: * - the primary constructor has no parameter * - the primary constructor has a single [android.content.Context] parameter - * - it is a Kotlin object class * - * @param overlay if specified, current annotated screen will overlay the given screen + * @param value unique preference screen key + * @param overlay if true, current annotated screen will overlay the screen that has identical key */ @Retention(AnnotationRetention.SOURCE) @Target(AnnotationTarget.CLASS) @MustBeDocumented -annotation class ProvidePreferenceScreen( - val overlay: KClass<out PreferenceScreenMetadata> = PreferenceScreenMetadata::class, -) +annotation class ProvidePreferenceScreen(val value: String, val overlay: Boolean = false) /** * Provides options for [ProvidePreferenceScreen] annotation processor. diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/FixedArrayMap.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/FixedArrayMap.kt new file mode 100644 index 000000000000..149331a5947a --- /dev/null +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/FixedArrayMap.kt @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.metadata + +import java.util.function.Consumer + +/** + * A compact and immutable data structure provides [get] and for-each operations on ordered + * key-value entries. + * + * The implementation uses fixed-size array and no API is offered to modify entries. Actually, + * elements are provided in sorted order during constructor to simplify data management. As a + * result, this class is more lightweight compared with `ArrayMap`. + */ +@Suppress("UNCHECKED_CAST") +class FixedArrayMap<K : Comparable<K>, V> { + private val array: Array<Any?> + + /** Constructors with empty element. */ + constructor() { + array = emptyArray() + } + + /** + * Constructors. + * + * @param size the number of elements + * @param consumer initializer to provide exactly [size] elements *in sorted order* + */ + constructor(size: Int, consumer: Consumer<OrderedInitializer<K, V>>) { + array = arrayOfNulls(size * 2) + val orderedInitializer = OrderedInitializer<K, V>(array) + consumer.accept(orderedInitializer) + orderedInitializer.verify() + } + + /** Returns the number of elements. */ + val size: Int + get() = array.size / 2 + + /** + * Returns a new [FixedArrayMap] that merged from current and given [FixedArrayMap] instance. + * + * [other] takes precedence for identical keys. + */ + fun merge(other: FixedArrayMap<K, V>): FixedArrayMap<K, V> { + var newKeys = 0 + other.forEachKey { if (get(it) == null) newKeys++ } + return FixedArrayMap(size + newKeys) { initializer -> + var index1 = 0 + var index2 = 0 + while (!initializer.isDone()) { + val key1 = if (index1 < array.size) array[index1] as K else null + val key2 = if (index2 < other.array.size) other.array[index2] as K else null + val diff = + when { + key1 == null -> 1 + key2 == null -> -1 + else -> key1.compareTo(key2) + } + if (diff < 0) { + initializer.put(key1!!, array[index1 + 1] as V) + index1 += 2 + } else { + initializer.put(key2!!, other.array[index2 + 1] as V) + index2 += 2 + if (diff == 0) index1 += 2 + } + } + } + } + + /** Traversals keys *in sorted order* and applies given action. */ + fun forEachKey(action: (key: K) -> Unit) { + for (index in array.indices step 2) { + action(array[index] as K) + } + } + + /** Traversals keys *in sorted order* and applies given action. */ + suspend fun forEachKeyAsync(action: suspend (key: K) -> Unit) { + for (index in array.indices step 2) { + action(array[index] as K) + } + } + + /** Traversals key-value entries *in sorted order* and applies given action. */ + fun forEach(action: (key: K, value: V) -> Unit) { + for (index in array.indices step 2) { + action(array[index] as K, array[index + 1] as V) + } + } + + /** Traversals key-value entries in sorted order and applies given action. */ + suspend fun forEachAsync(action: suspend (key: K, value: V) -> Unit) { + for (index in array.indices step 2) { + action(array[index] as K, array[index + 1] as V) + } + } + + /** + * Returns the value associated with given key. + * + * Binary-search algorithm is applied, so this operation takes O(log2(N)) at worst case. + */ + operator fun get(key: K): V? { + var low = 0 + var high = array.size / 2 + while (low < high) { + val mid = (low + high).ushr(1) // safe from overflows + val diff = (array[mid * 2] as K).compareTo(key) + when { + diff < 0 -> low = mid + 1 + diff > 0 -> high = mid + else -> return array[mid * 2 + 1] as V + } + } + return null + } + + /** Initializer to provide key-value pairs *in sorted order*. */ + class OrderedInitializer<K : Comparable<K>, V> + internal constructor(private val array: Array<Any?>) { + private var index = 0 + + internal val size: Int + get() = array.size + + /** Returns whether all elements are added. */ + fun isDone() = index == array.size + + /** Adds a new key-value entry. The key must be provided in sorted order. */ + fun put(key: K, value: V) { + array[index++] = key + array[index++] = value + } + + internal fun verify() { + if (!isDone()) throw IllegalStateException("Missing items: ${index / 2} / ${size / 2}") + for (index in 2 until size step 2) { + if ((array[index - 2] as K) >= (array[index] as K)) { + throw IllegalStateException("${array[index - 2]} >= ${array[index]}") + } + } + } + } +} diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt index 9179f8ffc082..876f6152cccd 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt @@ -16,6 +16,8 @@ package com.android.settingslib.metadata +import android.content.Context + /** A node in preference hierarchy that is associated with [PreferenceMetadata]. */ open class PreferenceHierarchyNode internal constructor(val metadata: PreferenceMetadata) { /** @@ -32,7 +34,8 @@ open class PreferenceHierarchyNode internal constructor(val metadata: Preference * * A root hierarchy represents a preference screen. A sub-hierarchy represents a preference group. */ -class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) : +class PreferenceHierarchy +internal constructor(private val context: Context, metadata: PreferenceMetadata) : PreferenceHierarchyNode(metadata) { private val children = mutableListOf<PreferenceHierarchyNode>() @@ -51,7 +54,8 @@ class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) : * * @throws NullPointerException if screen is not registered to [PreferenceScreenRegistry] */ - operator fun String.unaryPlus() = +PreferenceHierarchyNode(PreferenceScreenRegistry[this]!!) + operator fun String.unaryPlus() = + +PreferenceHierarchyNode(PreferenceScreenRegistry.create(context, this)!!) operator fun PreferenceHierarchyNode.unaryPlus() = also { children.add(it) } @@ -79,7 +83,7 @@ class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) : /** Adds a preference group to the hierarchy before given key. */ fun addGroupBefore(key: String, metadata: PreferenceMetadata): PreferenceHierarchy { val (list, index) = findPreference(key) ?: (children to children.size) - return PreferenceHierarchy(metadata).also { list.add(index, it) } + return PreferenceHierarchy(context, metadata).also { list.add(index, it) } } /** Adds a preference to the hierarchy after given key. */ @@ -91,7 +95,7 @@ class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) : /** Adds a preference group to the hierarchy after given key. */ fun addGroupAfter(key: String, metadata: PreferenceMetadata): PreferenceHierarchy { val (list, index) = findPreference(key) ?: (children to children.size - 1) - return PreferenceHierarchy(metadata).also { list.add(index + 1, it) } + return PreferenceHierarchy(context, metadata).also { list.add(index + 1, it) } } private fun findPreference(key: String): Pair<MutableList<PreferenceHierarchyNode>, Int>? { @@ -106,12 +110,13 @@ class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) : } /** Adds a preference group to the hierarchy. */ - operator fun PreferenceGroup.unaryPlus() = PreferenceHierarchy(this).also { children.add(it) } + operator fun PreferenceGroup.unaryPlus() = + PreferenceHierarchy(context, this).also { children.add(it) } /** Adds a preference group and returns its preference hierarchy. */ @JvmOverloads fun addGroup(metadata: PreferenceGroup, order: Int? = null): PreferenceHierarchy = - PreferenceHierarchy(metadata).also { + PreferenceHierarchy(context, metadata).also { this.order = order children.add(it) } @@ -128,7 +133,9 @@ class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) : * @throws NullPointerException if screen is not registered to [PreferenceScreenRegistry] */ fun addPreferenceScreen(screenKey: String) { - children.add(PreferenceHierarchy(PreferenceScreenRegistry[screenKey]!!)) + children.add( + PreferenceHierarchy(context, PreferenceScreenRegistry.create(context, screenKey)!!) + ) } /** Extensions to add more preferences to the hierarchy. */ @@ -175,5 +182,8 @@ class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) : * Builder function to create [PreferenceHierarchy] in * [DSL](https://kotlinlang.org/docs/type-safe-builders.html) manner. */ -fun preferenceHierarchy(metadata: PreferenceMetadata, init: PreferenceHierarchy.() -> Unit) = - PreferenceHierarchy(metadata).also(init) +fun preferenceHierarchy( + context: Context, + metadata: PreferenceMetadata, + init: PreferenceHierarchy.() -> Unit, +) = PreferenceHierarchy(context, metadata).also(init) diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt index c1edbdc20361..1e70a32cb38b 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceMetadata.kt @@ -22,7 +22,6 @@ import android.os.Bundle import androidx.annotation.AnyThread import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.fragment.app.Fragment /** * Interface provides preference metadata (title, summary, icon, etc.). @@ -170,47 +169,3 @@ interface PreferenceMetadata { /** Metadata of preference category. */ @AnyThread open class PreferenceCategory(override val key: String, override val title: Int) : PreferenceGroup - -/** Metadata of preference screen. */ -@AnyThread -interface PreferenceScreenMetadata : PreferenceMetadata { - - /** - * The screen title resource, which precedes [getScreenTitle] if provided. - * - * By default, screen title is same with [title]. - */ - val screenTitle: Int - get() = title - - /** Returns dynamic screen title, use [screenTitle] whenever possible. */ - fun getScreenTitle(context: Context): CharSequence? = null - - /** Returns the fragment class to show the preference screen. */ - fun fragmentClass(): Class<out Fragment>? - - /** - * Indicates if [getPreferenceHierarchy] returns a complete hierarchy of the preference screen. - * - * If `true`, the result of [getPreferenceHierarchy] will be used to inflate preference screen. - * Otherwise, it is an intermediate state called hybrid mode, preference hierarchy is - * represented by other ways (e.g. XML resource) and [PreferenceMetadata]s in - * [getPreferenceHierarchy] will only be used to bind UI widgets. - */ - fun hasCompleteHierarchy(): Boolean = true - - /** - * Returns the hierarchy of preference screen. - * - * The implementation MUST include all preferences into the hierarchy regardless of the runtime - * conditions. DO NOT check any condition (except compile time flag) before adding a preference. - */ - fun getPreferenceHierarchy(context: Context): PreferenceHierarchy - - /** - * Returns the [Intent] to show current preference screen. - * - * @param metadata the preference to locate when show the screen - */ - fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?): Intent? = null -} diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenMetadata.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenMetadata.kt new file mode 100644 index 000000000000..a2dcefb43436 --- /dev/null +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenMetadata.kt @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.metadata + +import android.content.Context +import android.content.Intent +import androidx.annotation.AnyThread +import androidx.fragment.app.Fragment + +/** Metadata of preference screen. */ +@AnyThread +interface PreferenceScreenMetadata : PreferenceMetadata { + + /** + * The screen title resource, which precedes [getScreenTitle] if provided. + * + * By default, screen title is same with [title]. + */ + val screenTitle: Int + get() = title + + /** Returns dynamic screen title, use [screenTitle] whenever possible. */ + fun getScreenTitle(context: Context): CharSequence? = null + + /** Returns the fragment class to show the preference screen. */ + fun fragmentClass(): Class<out Fragment>? + + /** + * Indicates if [getPreferenceHierarchy] returns a complete hierarchy of the preference screen. + * + * If `true`, the result of [getPreferenceHierarchy] will be used to inflate preference screen. + * Otherwise, it is an intermediate state called hybrid mode, preference hierarchy is + * represented by other ways (e.g. XML resource) and [PreferenceMetadata]s in + * [getPreferenceHierarchy] will only be used to bind UI widgets. + */ + fun hasCompleteHierarchy(): Boolean = true + + /** + * Returns the hierarchy of preference screen. + * + * The implementation MUST include all preferences into the hierarchy regardless of the runtime + * conditions. DO NOT check any condition (except compile time flag) before adding a preference. + */ + fun getPreferenceHierarchy(context: Context): PreferenceHierarchy + + /** + * Returns the [Intent] to show current preference screen. + * + * @param metadata the preference to locate when show the screen + */ + fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?): Intent? = null +} + +/** Creator of [PreferenceScreenMetadata]. */ +fun interface PreferenceScreenMetadataCreator { + + /** + * Creates a new [PreferenceScreenMetadata]. + * + * @param context application context to create the PreferenceScreenMetadata + */ + fun create(context: Context): PreferenceScreenMetadata +} diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenRegistry.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenRegistry.kt index ff0991023393..6cf39f3ae8aa 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenRegistry.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenRegistry.kt @@ -18,11 +18,6 @@ package com.android.settingslib.metadata import android.content.Context import com.android.settingslib.datastore.KeyValueStore -import com.google.common.base.Supplier -import com.google.common.base.Suppliers -import com.google.common.collect.ImmutableMap - -private typealias PreferenceScreenMap = ImmutableMap<String, PreferenceScreenMetadata> /** Registry of all available preference screens in the app. */ object PreferenceScreenRegistry : ReadWritePermitProvider { @@ -30,12 +25,12 @@ object PreferenceScreenRegistry : ReadWritePermitProvider { /** Provider of key-value store. */ private lateinit var keyValueStoreProvider: KeyValueStoreProvider - private var preferenceScreensSupplier: Supplier<PreferenceScreenMap> = Supplier { - ImmutableMap.of() - } - - val preferenceScreens: PreferenceScreenMap - get() = preferenceScreensSupplier.get() + /** + * Creators of all available [PreferenceScreenMetadata]s. + * + * The map key is preference screen key. + */ + var preferenceScreenMetadataCreators = FixedArrayMap<String, PreferenceScreenMetadataCreator>() private var readWritePermitProvider: ReadWritePermitProvider = object : ReadWritePermitProvider {} @@ -54,26 +49,9 @@ object PreferenceScreenRegistry : ReadWritePermitProvider { fun getKeyValueStore(context: Context, preference: PreferenceMetadata): KeyValueStore? = keyValueStoreProvider.getKeyValueStore(context, preference) - /** Sets supplier to provide available preference screens. */ - fun setPreferenceScreensSupplier(supplier: Supplier<List<PreferenceScreenMetadata>>) { - preferenceScreensSupplier = - Suppliers.memoize { - val screensBuilder = ImmutableMap.builder<String, PreferenceScreenMetadata>() - for (screen in supplier.get()) screensBuilder.put(screen.key, screen) - screensBuilder.buildOrThrow() - } - } - - /** Sets available preference screens. */ - fun setPreferenceScreens(vararg screens: PreferenceScreenMetadata) { - val screensBuilder = ImmutableMap.builder<String, PreferenceScreenMetadata>() - for (screen in screens) screensBuilder.put(screen.key, screen) - preferenceScreensSupplier = Suppliers.ofInstance(screensBuilder.buildOrThrow()) - } - - /** Returns [PreferenceScreenMetadata] of particular key. */ - operator fun get(key: String?): PreferenceScreenMetadata? = - if (key != null) preferenceScreens[key] else null + /** Creates [PreferenceScreenMetadata] of particular screen key. */ + fun create(context: Context, screenKey: String?): PreferenceScreenMetadata? = + screenKey?.let { preferenceScreenMetadataCreators[it]?.create(context.applicationContext) } /** * Sets the provider to check read write permit. Read and write requests are denied by default. diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt index 991d5b7791e9..e237a6a4cf14 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt @@ -83,7 +83,7 @@ open class PreferenceFragment : @XmlRes protected open fun getPreferenceScreenResId(context: Context): Int = 0 protected fun getPreferenceScreenCreator(context: Context): PreferenceScreenCreator? = - (PreferenceScreenRegistry[getPreferenceScreenBindingKey(context)] + (PreferenceScreenRegistry.create(context, getPreferenceScreenBindingKey(context)) as? PreferenceScreenCreator) ?.run { if (isFlagEnabled(context)) this else null } diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt index a9e20f284a61..91abd8b4c9e9 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt @@ -220,7 +220,7 @@ class PreferenceScreenBindingHelper( /** Updates preference screen that has incomplete hierarchy. */ @JvmStatic fun bind(preferenceScreen: PreferenceScreen) { - PreferenceScreenRegistry[preferenceScreen.key]?.run { + PreferenceScreenRegistry.create(preferenceScreen.context, preferenceScreen.key)?.run { if (!hasCompleteHierarchy()) { val preferenceBindingFactory = (this as? PreferenceScreenCreator)?.preferenceBindingFactory ?: return diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenFactory.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenFactory.kt index 7f99d7a9bbdd..211b3bdaea70 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenFactory.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenFactory.kt @@ -81,8 +81,8 @@ class PreferenceScreenFactory { * * The screen must be registered in [PreferenceScreenFactory] and provide a complete hierarchy. */ - fun createBindingScreen(screenKey: String?): PreferenceScreen? { - val metadata = PreferenceScreenRegistry[screenKey] ?: return null + fun createBindingScreen(context: Context, screenKey: String?): PreferenceScreen? { + val metadata = PreferenceScreenRegistry.create(context, screenKey) ?: return null if (metadata is PreferenceScreenCreator && metadata.hasCompleteHierarchy()) { return metadata.createPreferenceScreen(this) } @@ -93,11 +93,12 @@ class PreferenceScreenFactory { /** Creates [PreferenceScreen] from [PreferenceScreenRegistry]. */ @JvmStatic fun createBindingScreen(preference: Preference): PreferenceScreen? { + val context = preference.context val preferenceScreenCreator = - (PreferenceScreenRegistry[preference.key] as? PreferenceScreenCreator) - ?: return null + (PreferenceScreenRegistry.create(context, preference.key) + as? PreferenceScreenCreator) ?: return null if (!preferenceScreenCreator.hasCompleteHierarchy()) return null - val factory = PreferenceScreenFactory(preference.context) + val factory = PreferenceScreenFactory(context) val preferenceScreen = preferenceScreenCreator.createPreferenceScreen(factory) factory.preferenceManager.setPreferences(preferenceScreen) return preferenceScreen diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-fr-rCA/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-fr-rCA/strings.xml index 8f0d572aa193..da74cf6a3ab9 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-fr-rCA/strings.xml @@ -19,6 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="enabled_by_admin" msgid="6630472777476410137">"Activé par l\'administrateur"</string> <string name="disabled_by_admin" msgid="4023569940620832713">"Désactivé par l\'administrateur"</string> - <string name="enabled_by_advanced_protection" msgid="6236917660829422499">"Activé par la protection avancée"</string> - <string name="disabled_by_advanced_protection" msgid="369596009193239632">"Désactivé par la protection avancée"</string> + <string name="enabled_by_advanced_protection" msgid="6236917660829422499">"Activée par la protection avancée"</string> + <string name="disabled_by_advanced_protection" msgid="369596009193239632">"Désactivée par la protection avancée"</string> </resources> diff --git a/packages/SettingsLib/SegmentedButtonPreference/Android.bp b/packages/SettingsLib/SegmentedButtonPreference/Android.bp new file mode 100644 index 000000000000..6522e98b31df --- /dev/null +++ b/packages/SettingsLib/SegmentedButtonPreference/Android.bp @@ -0,0 +1,33 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +android_library { + name: "SettingsLibSegmentedButtonPreference", + use_resource_processor: true, + defaults: [ + "SettingsLintDefaults", + ], + + srcs: [ + "src/**/*.java", + "src/**/*.kt", + ], + resource_dirs: ["res"], + + static_libs: [ + "SettingsLibSettingsTheme", + "androidx.annotation_annotation", + "androidx.preference_preference", + ], + sdk_version: "system_current", + min_sdk_version: "21", + apex_available: [ + "//apex_available:platform", + ], +} diff --git a/packages/SettingsLib/SegmentedButtonPreference/AndroidManifest.xml b/packages/SettingsLib/SegmentedButtonPreference/AndroidManifest.xml new file mode 100644 index 000000000000..d71bc36dd64b --- /dev/null +++ b/packages/SettingsLib/SegmentedButtonPreference/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.settingslib.widget.preference.segmentedbutton"> + + <uses-sdk android:minSdkVersion="21" /> + +</manifest> diff --git a/packages/SettingsLib/SegmentedButtonPreference/res/layout/settingslib_expressive_preference_segmentedbutton.xml b/packages/SettingsLib/SegmentedButtonPreference/res/layout/settingslib_expressive_preference_segmentedbutton.xml new file mode 100644 index 000000000000..12e2872705f3 --- /dev/null +++ b/packages/SettingsLib/SegmentedButtonPreference/res/layout/settingslib_expressive_preference_segmentedbutton.xml @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + + <com.google.android.material.button.MaterialButtonToggleGroup + android:id="@+id/button_group" + style="@style/Widget.Material3Expressive.MaterialButtonGroup.Connected" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:singleSelection="true" + app:selectionRequired="true" + app:checkedButton="@id/button_1"> + <com.google.android.material.button.MaterialButton + android:id="@+id/button_1" + android:layout_weight="1" + app:iconPadding="0dp" + app:iconGravity="textStart" + style="@style/SettingsLibButtonStyle.Expressive.Tonal.Large"/> + <com.google.android.material.button.MaterialButton + android:id="@+id/button_2" + android:layout_weight="1" + app:iconPadding="0dp" + app:iconGravity="textStart" + style="@style/SettingsLibButtonStyle.Expressive.Tonal.Large"/> + <com.google.android.material.button.MaterialButton + android:id="@+id/button_3" + android:layout_weight="1" + app:iconPadding="0dp" + app:iconGravity="textStart" + style="@style/SettingsLibButtonStyle.Expressive.Tonal.Large"/> + <com.google.android.material.button.MaterialButton + android:id="@+id/button_4" + android:layout_weight="1" + app:iconPadding="0dp" + app:iconGravity="textStart" + style="@style/SettingsLibButtonStyle.Expressive.Tonal.Large"/> + </com.google.android.material.button.MaterialButtonToggleGroup> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/button_group_text" + android:orientation="horizontal" + android:gravity="center" + android:paddingTop="@dimen/settingslib_expressive_space_extrasmall4"> + + <TextView + android:id="@+id/button_1_text" + android:layout_weight="1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:gravity="center" + android:textAppearance="@style/TextAppearance.SettingsLib.TitleSmall.Emphasized" + android:textColor="@color/settingslib_materialColorOnSurface" /> + + <TextView + android:id="@+id/button_2_text" + android:layout_weight="1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:gravity="center" + android:textAppearance="@style/TextAppearance.SettingsLib.TitleSmall.Emphasized" + android:textColor="@color/settingslib_materialColorOnSurface" /> + + <TextView + android:id="@+id/button_3_text" + android:layout_weight="1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:gravity="center" + android:textAppearance="@style/TextAppearance.SettingsLib.TitleSmall.Emphasized" + android:textColor="@color/settingslib_materialColorOnSurface" /> + + <TextView + android:id="@+id/button_4_text" + android:layout_weight="1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:gravity="center" + android:textAppearance="@style/TextAppearance.SettingsLib.TitleSmall.Emphasized" + android:textColor="@color/settingslib_materialColorOnSurface" /> + </LinearLayout> +</LinearLayout>
\ No newline at end of file diff --git a/packages/SettingsLib/SegmentedButtonPreference/src/com/android/settingslib/widget/SegmentedButtonPreference.kt b/packages/SettingsLib/SegmentedButtonPreference/src/com/android/settingslib/widget/SegmentedButtonPreference.kt new file mode 100644 index 000000000000..b133969c82d4 --- /dev/null +++ b/packages/SettingsLib/SegmentedButtonPreference/src/com/android/settingslib/widget/SegmentedButtonPreference.kt @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.widget + +import android.content.Context +import android.util.AttributeSet +import android.view.View.GONE +import android.view.View.VISIBLE +import android.widget.TextView +import androidx.annotation.DrawableRes +import androidx.preference.Preference +import androidx.preference.PreferenceViewHolder +import com.android.settingslib.widget.preference.segmentedbutton.R +import com.google.android.material.button.MaterialButton +import com.google.android.material.button.MaterialButtonToggleGroup + +class SegmentedButtonPreference @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : Preference(context, attrs, defStyleAttr, defStyleRes), GroupSectionDividerMixin { + private var buttonGroup: MaterialButtonToggleGroup? = null + private var buttonLabels: MutableList<TextView> = mutableListOf() + private var buttonCheckedListener: MaterialButtonToggleGroup.OnButtonCheckedListener? = null + + init { + layoutResource = R.layout.settingslib_expressive_preference_segmentedbutton + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + holder.isDividerAllowedBelow = false + holder.isDividerAllowedAbove = false + + buttonGroup = holder.findViewById(R.id.button_group) as MaterialButtonToggleGroup? + buttonLabels.add(holder.findViewById(R.id.button_1_text) as TextView) + buttonLabels.add(holder.findViewById(R.id.button_2_text) as TextView) + buttonLabels.add(holder.findViewById(R.id.button_3_text) as TextView) + buttonLabels.add(holder.findViewById(R.id.button_4_text) as TextView) + } + + fun setupButton(index: Int, text: String, @DrawableRes icon: Int) { + if (index in 0 until buttonLabels.size) { + (buttonGroup?.getChildAt(index) as? MaterialButton)?.setIconResource(icon) + buttonLabels[index].text = text + } + } + + fun setButtonVisibility(index: Int, visible: Boolean) { + if (index in 0 until buttonLabels.size) { + (buttonGroup?.getChildAt(index) as? MaterialButton)?.visibility = + if (visible) VISIBLE else GONE + + buttonLabels[index].visibility = if (visible) VISIBLE else GONE + } + } + + fun setButtonEnabled(index: Int, enabled: Boolean) { + if (index in 0 until buttonLabels.size) { + (buttonGroup?.getChildAt(index) as? MaterialButton)?.isEnabled = enabled + } + } + + fun setOnButtonClickListener(listener: MaterialButtonToggleGroup.OnButtonCheckedListener) { + buttonCheckedListener = listener + buttonGroup?.addOnButtonCheckedListener (listener) + } + + fun removeOnButtonClickListener() { + buttonCheckedListener?.let { buttonGroup?.removeOnButtonCheckedListener(it) } + buttonCheckedListener = null + } +}
\ No newline at end of file diff --git a/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java b/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java index 1815d040bb18..4315238ad7c1 100644 --- a/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java +++ b/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java @@ -268,7 +268,9 @@ public class SliderPreference extends Preference { mSlider.setValueFrom(mMin); mSlider.setValueTo(mMax); mSlider.setValue(mSliderValue); + mSlider.clearOnSliderTouchListeners(); mSlider.addOnSliderTouchListener(mTouchListener); + mSlider.clearOnChangeListeners(); mSlider.addOnChangeListener(mChangeListener); mSlider.setEnabled(isEnabled()); @@ -487,7 +489,7 @@ public class SliderPreference extends Preference { * set the {@link Slider}'s value to the stored value. */ void syncValueInternal(@NonNull Slider slider) { - int sliderValue = mMin + (int) slider.getValue(); + int sliderValue = (int) slider.getValue(); if (sliderValue != mSliderValue) { if (callChangeListener(sliderValue)) { setValueInternal(sliderValue, false); diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt index fcaedd2b80bd..a52222ba678b 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt @@ -64,7 +64,7 @@ object SettingsDimension { bottom = itemPaddingVertical, ) val itemPaddingAround = 8.dp - val itemDividerHeight = 32.dp + val itemDividerHeight = if (isSpaExpressiveEnabled) 40.dp else 32.dp val iconLarge = 48.dp val introIconSize = 40.dp diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt index 3aa7ad0a992d..8b1ed939a967 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetPreference.kt @@ -28,8 +28,6 @@ import androidx.compose.material.icons.filled.ChevronRight import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -104,8 +102,17 @@ internal fun TwoTargetPreference( @Composable private fun PreferenceDivider() { Box( - Modifier.padding(horizontal = SettingsDimension.itemPaddingEnd) - .size(width = 1.dp, height = SettingsDimension.itemDividerHeight) - .background(color = MaterialTheme.colorScheme.divider) + if (isSpaExpressiveEnabled) { + Modifier.padding( + start = SettingsDimension.paddingSmall, + end = SettingsDimension.paddingExtraSmall6, + ) + .size(width = 1.dp, height = SettingsDimension.itemDividerHeight) + .background(color = MaterialTheme.colorScheme.outline) + } else { + Modifier.padding(horizontal = SettingsDimension.itemPaddingEnd) + .size(width = 1.dp, height = SettingsDimension.itemDividerHeight) + .background(color = MaterialTheme.colorScheme.divider) + } ) } diff --git a/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/FlowTestUtil.kt b/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/FlowTestUtil.kt index 99c6a3fd3465..591dff7af5a0 100644 --- a/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/FlowTestUtil.kt +++ b/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/FlowTestUtil.kt @@ -17,18 +17,50 @@ package com.android.settingslib.spa.testutils import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.toList import kotlinx.coroutines.withTimeoutOrNull +/** + * Collects the first element emitted by this flow within a given timeout. + * + * If the flow emits a value within the given timeout, this function returns that value. If the + * timeout expires before the flow emits any values, this function returns null. + * + * This function is similar to [kotlinx.coroutines.flow.firstOrNull], but it adds a timeout to + * prevent potentially infinite waiting. + * + * @param timeMillis The timeout in milliseconds. Defaults to 500 milliseconds. + * @return The first element emitted by the flow within the timeout, or null if the timeout expires. + */ suspend fun <T> Flow<T>.firstWithTimeoutOrNull(timeMillis: Long = 500): T? = - withTimeoutOrNull(timeMillis) { - first() - } + withTimeoutOrNull(timeMillis) { firstOrNull() } -suspend fun <T> Flow<T>.toListWithTimeout(timeMillis: Long = 500): List<T> { - val list = mutableListOf<T>() - return withTimeoutOrNull(timeMillis) { - toList(list) - } ?: list +/** + * Collects elements from this flow for a given time and returns the last emitted element, or null + * if the flow did not emit any elements. + * + * This function is useful when you need to retrieve the last value emitted by a flow within a + * specific timeframe, but the flow might complete without emitting anything or might not emit a + * value within the given timeout. + * + * @param timeMillis The timeout in milliseconds. Defaults to 500ms. + * @return The last emitted element, or null if the flow did not emit any elements. + */ +suspend fun <T> Flow<T>.lastWithTimeoutOrNull(timeMillis: Long = 500): T? = + toListWithTimeout(timeMillis).lastOrNull() + +/** + * Collects elements from this flow into a list with a timeout. + * + * This function attempts to collect all elements from the flow and store them in a list. If the + * collection process takes longer than the specified timeout, the collection is canceled and the + * function returns the elements collected up to that point. + * + * @param timeMillis The timeout duration in milliseconds. Defaults to 500 milliseconds. + * @return A list containing the collected elements, or an empty list if the timeout was reached + * before any elements were collected. + */ +suspend fun <T> Flow<T>.toListWithTimeout(timeMillis: Long = 500): List<T> = buildList { + withTimeoutOrNull(timeMillis) { toList(this@buildList) } } diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUser.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUser.kt index 7d6ee1928111..60ef73317316 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUser.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUser.kt @@ -21,9 +21,8 @@ import android.content.Intent import android.content.IntentFilter import android.os.UserHandle import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLifecycleOwner -import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle import com.android.settingslib.spaprivileged.framework.common.broadcastReceiverAsUserFlow /** @@ -35,6 +34,8 @@ fun DisposableBroadcastReceiverAsUser( userHandle: UserHandle, onReceive: (Intent) -> Unit, ) { - LocalContext.current.broadcastReceiverAsUserFlow(intentFilter, userHandle) - .collectLatestWithLifecycle(LocalLifecycleOwner.current, action = onReceive) + val context = LocalContext.current + LaunchedEffect(Unit) { + context.broadcastReceiverAsUserFlow(intentFilter, userHandle).collect(onReceive) + } } diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt index a59a724d9346..4221f9fb5111 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt @@ -22,10 +22,11 @@ import android.content.Intent import android.content.IntentFilter import android.os.UserHandle import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.junit4.createComposeRule -import androidx.lifecycle.compose.LocalLifecycleOwner -import androidx.lifecycle.testing.TestLifecycleOwner import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.Rule import org.junit.Test @@ -38,34 +39,39 @@ import org.mockito.kotlin.mock @RunWith(AndroidJUnit4::class) class DisposableBroadcastReceiverAsUserTest { - @get:Rule - val composeTestRule = createComposeRule() + @get:Rule val composeTestRule = createComposeRule() private var registeredBroadcastReceiver: BroadcastReceiver? = null - private val context = mock<Context> { - on { - registerReceiverAsUser( - any(), - eq(USER_HANDLE), - eq(INTENT_FILTER), - isNull(), - isNull(), - eq(Context.RECEIVER_NOT_EXPORTED), - ) - } doAnswer { - registeredBroadcastReceiver = it.arguments[0] as BroadcastReceiver - null + private val context = + mock<Context> { + on { + registerReceiverAsUser( + any(), + eq(USER_HANDLE), + eq(INTENT_FILTER), + isNull(), + isNull(), + eq(Context.RECEIVER_NOT_EXPORTED), + ) + } doAnswer + { + registeredBroadcastReceiver = it.arguments[0] as BroadcastReceiver + null + } + + on { unregisterReceiver(any()) } doAnswer + { + if (registeredBroadcastReceiver === it.arguments[0]) { + registeredBroadcastReceiver = null + } + } } - } @Test fun broadcastReceiver_registered() { composeTestRule.setContent { - CompositionLocalProvider( - LocalContext provides context, - LocalLifecycleOwner provides TestLifecycleOwner(), - ) { + CompositionLocalProvider(LocalContext provides context) { DisposableBroadcastReceiverAsUser(INTENT_FILTER, USER_HANDLE) {} } } @@ -77,10 +83,7 @@ class DisposableBroadcastReceiverAsUserTest { fun broadcastReceiver_isCalledOnReceive() { var onReceiveIsCalled = false composeTestRule.setContent { - CompositionLocalProvider( - LocalContext provides context, - LocalLifecycleOwner provides TestLifecycleOwner(), - ) { + CompositionLocalProvider(LocalContext provides context) { DisposableBroadcastReceiverAsUser(INTENT_FILTER, USER_HANDLE) { onReceiveIsCalled = true } @@ -92,6 +95,23 @@ class DisposableBroadcastReceiverAsUserTest { composeTestRule.waitUntil { onReceiveIsCalled } } + @Test + fun broadcastReceiver_unregistered() { + var isBroadcastReceiverRegistered by mutableStateOf(true) + composeTestRule.setContent { + if (isBroadcastReceiverRegistered) { + CompositionLocalProvider(LocalContext provides context) { + DisposableBroadcastReceiverAsUser(INTENT_FILTER, USER_HANDLE) {} + } + } + } + composeTestRule.waitUntil { registeredBroadcastReceiver != null } + + isBroadcastReceiverRegistered = false + + composeTestRule.waitUntil { registeredBroadcastReceiver == null } + } + private companion object { val USER_HANDLE: UserHandle = UserHandle.of(0) diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/PermissionsChangedFlowTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/PermissionsChangedFlowTest.kt index 31522c1209f7..7ef11eb865ba 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/PermissionsChangedFlowTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/PermissionsChangedFlowTest.kt @@ -23,7 +23,6 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull import com.android.settingslib.spa.testutils.toListWithTimeout -import com.android.settingslib.spaprivileged.framework.common.asUser import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.async import kotlinx.coroutines.delay @@ -35,6 +34,7 @@ import org.mockito.kotlin.doAnswer import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.spy +import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) class PermissionsChangedFlowTest { @@ -49,7 +49,7 @@ class PermissionsChangedFlowTest { } private val context: Context = spy(ApplicationProvider.getApplicationContext()) { - on { asUser(APP.userHandle) } doReturn mock + doReturn(mock).whenever(mock).createContextAsUser(APP.userHandle, 0) on { packageManager } doReturn mockPackageManager } diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml index 6dd8fef99dce..e4eb72d0bf82 100644 --- a/packages/SettingsLib/res/values-af/arrays.xml +++ b/packages/SettingsLib/res/values-af/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Slegs toestelskerm (verstek)"</item> + <item msgid="9161645858025071955">"Eksterne skerm"</item> + <item msgid="114384731934682483">"Fokusgebaseer"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Wys skakering net op toestelskerm"</item> + <item msgid="7795034287069726554">"Wys skerm op enkele eksterne skerm"</item> + <item msgid="5280431949814340475">"Wys toestel op laaste gefokusde skerm"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 9af8ba842a61..7e9e369c14af 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktief (net links)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktief (net regs)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktief (links en regs)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktief (net media). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiewe (net media). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Gekoppel (steun oudiodeling). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Oorganganimasieskaal"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator-tydsduurskaal"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuleer sekondêre uitstallings"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Skakeringskermposisie"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Moenie aktiwiteite behou nie"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Vernietig elke aktiwiteit sodra die gebruiker dit verlaat"</string> diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml index 2a052614b6ef..805f0d3c9189 100644 --- a/packages/SettingsLib/res/values-am/arrays.xml +++ b/packages/SettingsLib/res/values-am/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"የመሣሪያ ማሳያ ብቻ (ነባሪ)"</item> + <item msgid="9161645858025071955">"ውጫዊ ማሳያ"</item> + <item msgid="114384731934682483">"ትኩረት ላይ የተመሰረተ"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"በመሣሪያ ማሳያ ላይ ብቻ ጥላ አሳይ"</item> + <item msgid="7795034287069726554">"መሣሪያን በአንድ ውጫዊ ማሳያ ላይ አሳይ"</item> + <item msgid="5280431949814340475">"በመጨረሻ ትኩረት የተደረገበት ማሳያ ላይ መሣሪያን አሳይ"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 03cde01a722d..616187343d0c 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ገቢር (ግራ ብቻ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ገቢር (ቀኝ ብቻ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ገቢር (ግራ እና ቀኝ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"ገቢር (ሚዲያ ብቻ)። <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ።"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"ገቢር (ሚዲያ ብቻ)። ግ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>፣ ቀ፦ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ባትሪ።"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"ተገናኝቷል (የድምፅ ማጋራት ይደግፋል)፣ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ።"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"የእነማ ልኬት ለውጥ ሽግግር"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"እነማ አድራጊ ቆይታ መለኪያ"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ሁለተኛ ማሳያዎችን አስመስለህ ሥራ"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"የጥላ ማሳያ አቀማመጥ"</string> <string name="debug_applications_category" msgid="5394089406638954196">"መተግበሪያዎች"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"እንቅስቃሴዎችን አትጠብቅ"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ተጠቃሚው እስኪተወው ድረስ እያንዳንዱን እንቅስቃሴ አስወግድ"</string> diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml index f389f64d7966..3ff5dc642be8 100644 --- a/packages/SettingsLib/res/values-ar/arrays.xml +++ b/packages/SettingsLib/res/values-ar/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"شاشة الجهاز فقط (الإعداد التلقائي)"</item> + <item msgid="9161645858025071955">"الشاشة الخارجية"</item> + <item msgid="114384731934682483">"على الشاشة التي يتم التركيز عليها"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"عرض الظل على شاشة الجهاز فقط"</item> + <item msgid="7795034287069726554">"عرض الظل على شاشة خارجية واحدة"</item> + <item msgid="5280431949814340475">"عرض الظل على آخر شاشة تم التركيز عليها"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 87a82414195c..a298294956f5 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"سماعة الأذن الطبية نشطة (اليسرى فقط)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"سماعة الأذن الطبية نشطة (اليمنى فقط)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"سماعتا الأذن الطبيتان نشطتان (اليسرى واليمنى)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"البلوتوث نشِط (للوسائط فقط). مستوى شحن البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"البلوتوث نشِط (للوسائط فقط)، مستوى الشحن في سماعة الرأس اليسرى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، مستوى الشحن في سماعة الرأس اليمنى: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"البلوتوث متصل (ميزة \"مشاركة الصوت\" متاحة). مستوى شحن البطارية: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"حجم الرسوم المتحركة للنقل"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"طول مدة الرسوم المتحركة"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"محاكاة الشاشات الثانوية"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"موضع شاشة عرض الظل"</string> <string name="debug_applications_category" msgid="5394089406638954196">"التطبيقات"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"عدم الاحتفاظ بالأنشطة"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"محو كل نشاط فور مغادرة المستخدم له"</string> diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml index b5dfde5b9798..4b5d5a07e120 100644 --- a/packages/SettingsLib/res/values-as/arrays.xml +++ b/packages/SettingsLib/res/values-as/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"কেৱল ডিভাইচৰ ডিছপ্লে’ (ডিফ’ল্ট)"</item> + <item msgid="9161645858025071955">"বাহ্যিক ডিছপ্লে’"</item> + <item msgid="114384731934682483">"ফ’কাছ-আধাৰিত"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"কেৱল ডিভাইচৰ ডিছপ্লে’তহে শ্বেড দেখুৱাওক"</item> + <item msgid="7795034287069726554">"ডিভাইচটো এখনেই বাহ্যিক ডিছপ্লে’ত দেখুৱাওক"</item> + <item msgid="5280431949814340475">"ডিভাইচটো অন্তিম ফ’কাছ কৰা ডিছপ্লে’ত দেখুৱাওক"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 4aab7d63d4d0..addf12b6f5a0 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"সক্ৰিয় হৈ আছে (কেৱল বাওঁফালৰটো)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"সক্ৰিয় হৈ আছে (কেৱল সোঁফালৰটো)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"সক্ৰিয় হৈ আছে (বাওঁফালৰটো আৰু সোঁফালৰটো)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"সক্ৰিয় হৈ আছে (কেৱল মিডিয়া)। <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰী।"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"সক্ৰিয় হৈ আছে (কেৱল মিডিয়া)। বাওঁ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, সোঁ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> বেটাৰী।"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"সংযুক্ত হৈ আছে (অডিঅ’ শ্বেয়াৰিং সমৰ্থন কৰে), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰী।"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ট্ৰাঞ্জিশ্বন এনিমেশ্বন স্কেল"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"এনিমেটৰ কালদৈৰ্ঘ্য স্কেল"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"গৌণ প্ৰদৰ্শনৰ নকল বনাওক"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"শ্বেড ডিছপ্লে’ৰ স্থান"</string> <string name="debug_applications_category" msgid="5394089406638954196">"এপ্সমূহ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"কাৰ্যকলাপসমূহ নাৰাখিব"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ব্যৱহাৰকাৰী ওলোৱাৰ লগে লগে আটাইবোৰ কাৰ্যকলাপ মচক"</string> diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml index 4f7aabd0804e..511e9701cd71 100644 --- a/packages/SettingsLib/res/values-az/arrays.xml +++ b/packages/SettingsLib/res/values-az/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Yalnız cihaz displeyi (defolt)"</item> + <item msgid="9161645858025071955">"Xarici displey"</item> + <item msgid="114384731934682483">"Fokus əsaslı"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Kölgəni yalnız cihaz displeyində göstərin"</item> + <item msgid="7795034287069726554">"Cihazı bir xarici displeydə göstərin"</item> + <item msgid="5280431949814340475">"Cihazı son fokuslanmış displeydə göstərin"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 5841bdab9310..6f97c9c19e98 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktiv (yalnız sol)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktiv (yalnız sağ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktiv (sol və sağ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktiv (yalnız media). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiv (yalnız media). Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batareya."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Qoşulub (audio paylaşma dəstəklənir). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Keçid animasiyası"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animasiya müddəti"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"İkincili displeyi imitasiya edin"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Kölgənin ekran mövqeyi"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Tətbiqlər"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Fəaliyyətlər saxlanmasın"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"İstifadəçi çıxan kimi fəaliyyət silinsin"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml index f5ba2dfdf120..452831453acf 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Prikaz samo na uređaju (podrazumevano)"</item> + <item msgid="9161645858025071955">"Spoljni ekran"</item> + <item msgid="114384731934682483">"Zasnovano na fokusu"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Prikaži senku samo na ekranu uređaja"</item> + <item msgid="7795034287069726554">"Prikaži uređaj na jednom spoljnom ekranu"</item> + <item msgid="5280431949814340475">"Prikaži uređaj na poslednjem ekranu u fokusu"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index d36a8641da41..fc55fff3e8f9 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktivno (samo levo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktivno (samo desno)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktivno (levo i desno)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktivno (samo za medije). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktivno (samo za medije). Levo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, desno: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Povezano (podržava deljenje zvuka), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Razmera animacije prelaza"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatorova razmera trajanja"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuliraj sekundarne ekrane"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Položaj senke na ekranu"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikacije"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ne čuvaj aktivnosti"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Uništava svaku aktivnost čim je korisnik napusti"</string> diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml index e70d694bb87f..33393610fae2 100644 --- a/packages/SettingsLib/res/values-be/arrays.xml +++ b/packages/SettingsLib/res/values-be/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Толькі дысплэй прылады (стандартна)"</item> + <item msgid="9161645858025071955">"Знешні дысплэй"</item> + <item msgid="114384731934682483">"У залежнасці ад выкарыстання"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Паказваць шчыток толькі на дысплэі прылады"</item> + <item msgid="7795034287069726554">"Паказваць прыладу на адным знешнім дысплэі"</item> + <item msgid="5280431949814340475">"Паказваць прыладу на дысплэі, які выкарыстоўваўся апошнім"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 29f5542a7953..be86aca4da85 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Выкарыстоўваецца (толькі левы навушнік)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Выкарыстоўваецца (толькі правы навушнік)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Выкарыстоўваецца (левы і правы навушнікі)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Выкарыстоўваецца (толькі для мультымедыя). Зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Выкарыстоўваецца (толькі для мультымедыя). Зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (левы навушнік), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (правы навушнік)."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Падключана (падтрымліваецца абагульванне аўдыя). Зарад акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Маштаб перадачы анімацыі"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Працягласць анімацыі"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Мадэляванне другасных экранаў"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Месца паказу шчытка"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Праграмы"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Не захоўваць дзеянні"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Выдаляць усе дзеянні пасля выхаду карыстальніка"</string> diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml index ce497f3d8c8c..c3bc26f30dbf 100644 --- a/packages/SettingsLib/res/values-bg/arrays.xml +++ b/packages/SettingsLib/res/values-bg/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Само на екрана на устройството (по подразбиране)"</item> + <item msgid="9161645858025071955">"Външен екран"</item> + <item msgid="114384731934682483">"Въз основа на фокуса"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Показване на падащия панел само на екрана на устройството"</item> + <item msgid="7795034287069726554">"Показване на устройството на един външен екран"</item> + <item msgid="5280431949814340475">"Показване на устройството на екрана, върху който последно е бил поставен фокусът"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 8d261a243614..624c55b6bb55 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Активно (само лявото)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Активно (само дясното)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Активно (лявото и дясното)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Активно (само за мултимедия). Батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Активно (само за мултимедия). Л: батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Д: батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Свързано (поддържа споделяне на звука). Батерия – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Скала на преходната анимация"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Скала за Animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Симулиране на алтерн. дисплеи"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Позиция на показване на падащия панел"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Приложения"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Без съхран. на дейностите"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Унищож. на всяка дейност при напускане от потребител"</string> diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml index f30ff08ff564..2b939d0ceee4 100644 --- a/packages/SettingsLib/res/values-bn/arrays.xml +++ b/packages/SettingsLib/res/values-bn/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"শুধুমাত্র ডিভাইসের ডিসপ্লে (ডিফল্ট)"</item> + <item msgid="9161645858025071955">"এক্সটার্নাল ডিসপ্লে"</item> + <item msgid="114384731934682483">"ফোকাস অনুযায়ী"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"শুধুমাত্র ডিভাইসের ডিসপ্লেতে শেড দেখুন"</item> + <item msgid="7795034287069726554">"শেড একটি এক্সটার্নাল ডিসপ্লেতে দেখুন"</item> + <item msgid="5280431949814340475">"ফোকাস করা শেষ ডিসপ্লেতে ডিভাইস দেখুন"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 0ad50cc04b01..fcc99cadf0f4 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"চালু আছে (শুধু বাঁদিক)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"চালু আছে (শুধু ডানদিক)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"চালু আছে (বাঁদিক ও ডানদিক)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"চালু আছে (শুধুমাত্র মিডিয়া)। <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ব্যাটারি।"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"চালু আছে (শুধুমাত্র মিডিয়া), বাঁদিক: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ডানদিক: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ব্যাটারি।"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"কানেক্ট করা আছে (অডিও শেয়ারিংয়ে কাজ করে), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ব্যাটারি।"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ট্র্যানজিশন অ্যানিমেশন স্কেল"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"অ্যানিমেটর সময়কাল স্কেল"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"গৌণ প্রদর্শনগুলি নকল করুন"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"শেড ডিসপ্লে করার পজিশন"</string> <string name="debug_applications_category" msgid="5394089406638954196">"অ্যাপ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"অ্যাক্টিভিটি রাখবেন না"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ব্যবহারকারী এটি ছেড়ে যাওয়ার পরে যত তাড়াতাড়ি সম্ভব প্রতিটি অ্যাক্টিভিটি ধ্বংস করুন"</string> diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml index 069dc04e84b2..625112ce873d 100644 --- a/packages/SettingsLib/res/values-bs/arrays.xml +++ b/packages/SettingsLib/res/values-bs/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Samo zaslon uređaja (zadano)"</item> + <item msgid="9161645858025071955">"Vanjski ekran"</item> + <item msgid="114384731934682483">"Na osnovu fokusa"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Prikaži sjenu samo na ekranu uređaja"</item> + <item msgid="7795034287069726554">"Prikaži uređaj na jednom vanjskom ekranu"</item> + <item msgid="5280431949814340475">"Prikaži uređaj na posljednjem fokusiranom ekranu"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index a30bcfa406f1..fea1fa561d98 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktivno (samo lijevo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktivno (samo desno)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktivno (lijevo i desno)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktivno (samo za medijski sadržaj). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktivno (samo za medijski sadržaj). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> baterije, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Povezano (podržava dijeljenje zvuka). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animacije prijelaza"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala trajanja animatora"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulacija sekundarnih ekrana"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Položaj prikaza sjene"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikacije"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ne čuvaj aktivnosti"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Obustavlja se svaka aktivnost čim je korisnik napusti"</string> diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index 133ad13f5ff4..e9b437e717d9 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Només a la pantalla del dispositiu (opció predeterminada)"</item> + <item msgid="9161645858025071955">"Pantalla externa"</item> + <item msgid="114384731934682483">"Basat en l\'enfocament"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Mostra l\'ombra només a la pantalla del dispositiu"</item> + <item msgid="7795034287069726554">"Mostra el dispositiu en una sola pantalla externa"</item> + <item msgid="5280431949814340475">"Mostra el dispositiu a la darrera pantalla en què s\'hagi posat el focus"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index ba733de812cb..3f73bccef833 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Actiu (només l\'esquerre)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Actiu (només el dret)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Actiu (esquerre i dret)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Actiu (només contingut multimèdia). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Actiu (només contingut multimèdia), E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connectat (admet compartició d\'àudio). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala d\'animació de la transició"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de durada de l\'animació"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simula pantalles secundàries"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posició de l\'ombra a la pantalla"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplicacions"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"No desis les activitats"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destrueix activitats quan l\'usuari deixi d\'utilitzar-les"</string> diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml index 20405ed6a773..4bfdaf47ea9b 100644 --- a/packages/SettingsLib/res/values-cs/arrays.xml +++ b/packages/SettingsLib/res/values-cs/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Pouze zobrazení zařízení (výchozí)"</item> + <item msgid="9161645858025071955">"Externí displej"</item> + <item msgid="114384731934682483">"Výběr"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Zobrazovat panel pouze na displeji zařízení"</item> + <item msgid="7795034287069726554">"Zobrazovat panel na jednom externím displeji"</item> + <item msgid="5280431949814340475">"Zobrazovat panel na naposledy vybraném displeji"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 1a239a119224..940e2f6200a6 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktivní (pouze levé)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktivní (pouze pravé)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktivní (levé a pravé)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktivní (pouze média). Baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktivní (pouze média), baterie: L <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, P <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Připojeno (podporuje sdílení zvuku), baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Měřítko animace přeměny"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Měřítko délky animace"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulovat sekundární obrazovky"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Pozice panelu"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikace"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Neukládat aktivity"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Rušit všechny činnosti, jakmile je uživatel zavře"</string> diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml index 3d2d6c7a5681..69497555fae7 100644 --- a/packages/SettingsLib/res/values-da/arrays.xml +++ b/packages/SettingsLib/res/values-da/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Kun på enhedens skærm (standard)"</item> + <item msgid="9161645858025071955">"Ekstern skærm"</item> + <item msgid="114384731934682483">"Fokusbaseret"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Vis kun skygge på enhedens skærm"</item> + <item msgid="7795034287069726554">"Vis enheden på en enkelt ekstern skærm"</item> + <item msgid="5280431949814340475">"Vis enheden på den skærm, der sidst var i fokus"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 3753e033442f..2b3084704bee 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktiveret (kun venstre)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktiveret (kun højre)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktiveret (venstre og højre)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktiveret (kun for medier). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiveret (kun for medier), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Forbundet (understøtter lyddeling). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Overgangsanimationsskala"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatorvarighedsskala"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuler sekundære skærme"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Placering af skærmens skygge"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Behold ikke aktiviteter"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Luk hver aktivitet, så snart brugeren forlader den"</string> diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml index 291f4e5b2533..adddd7706617 100644 --- a/packages/SettingsLib/res/values-de/arrays.xml +++ b/packages/SettingsLib/res/values-de/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Nur Gerätedisplay (Standard)"</item> + <item msgid="9161645858025071955">"Externes Display"</item> + <item msgid="114384731934682483">"Fokusbasiert"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Leiste nur auf dem Display des Geräts anzeigen"</item> + <item msgid="7795034287069726554">"Gerät auf einem einzigen externen Display anzeigen"</item> + <item msgid="5280431949814340475">"Gerät auf zuletzt fokussiertem Display anzeigen"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 7d0b848941d6..e9e9275fdb7d 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktiv (nur links)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktiv (nur rechts)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktiv (links und rechts)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktiv (nur Medien). Akku: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiv (nur Medien). Akku links: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Akku rechts: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Verbunden (unterstützt Audiofreigabe). Akku: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Übergangsanimationsfaktor"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animationsdauerfaktor"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Sekundäre Displays simulieren"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Position der Leiste auf dem Display"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Aktivitäten nicht speichern"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Aktivität löschen, sobald der Nutzer diese beendet"</string> diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml index 27927ebda467..9d7612ca8df1 100644 --- a/packages/SettingsLib/res/values-el/arrays.xml +++ b/packages/SettingsLib/res/values-el/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Μόνο οθόνη συσκευής (Προεπιλογή)"</item> + <item msgid="9161645858025071955">"Εξωτερική οθόνη"</item> + <item msgid="114384731934682483">"Με εστίαση"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Εμφάνιση σκίασης μόνο στην οθόνη συσκευής"</item> + <item msgid="7795034287069726554">"Εμφάνιση συσκευής σε μία εξωτερική οθόνη"</item> + <item msgid="5280431949814340475">"Εμφάνιση συσκευής στην τελευταία οθόνη με εστίαση"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 915cabbf1e0b..4662c3ccd67e 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Ενεργό (μόνο το αριστερό)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Ενεργό (μόνο το δεξί)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Ενεργό (αριστερό και δεξί)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Ενεργό (μόνο για μέσα). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Ενεργό (μόνο για μέσα). Α: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Δ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> μπαταρία."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Συνδεδεμένο (υποστηρίζει κοινή χρήση ήχου). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Κλίμακα κίνησης μετάβασης"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Κλίμ. διάρ. Animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Προσομ. δευτερ. προβολών"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Θέση οθόνης σκίασης"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Εφαρμογές"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Μη διατήρ. δραστηριοτήτων"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Διαγραφή κάθε δραστηριότητας μετά τον τερματισμό"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml index 7e846fbfbb89..8c27ec6315c9 100644 --- a/packages/SettingsLib/res/values-en-rAU/arrays.xml +++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Device display only (default)"</item> + <item msgid="9161645858025071955">"External display"</item> + <item msgid="114384731934682483">"Focus-based"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Show shade on device display only"</item> + <item msgid="7795034287069726554">"Show device on single external display"</item> + <item msgid="5280431949814340475">"Show device on last focused display"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index d9c35f50582b..b281f4ceccc2 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Active (left only)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Active (right only)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Active (left and right)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Active (media only). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Active (media only). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connected (supports audio sharing). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Transition animation scale"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator duration scale"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulate secondary displays"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Shade display position"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Don\'t keep activities"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destroy every activity as soon as the user leaves it"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml index ec6894a50177..cfe77ca538bd 100644 --- a/packages/SettingsLib/res/values-en-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Device display only (Default)"</item> + <item msgid="9161645858025071955">"External display"</item> + <item msgid="114384731934682483">"Focus-based"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Show shade on device display only"</item> + <item msgid="7795034287069726554">"Show device on single external display"</item> + <item msgid="5280431949814340475">"Show device on last focused display"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 887841cafbc0..3d5d5c7a58b6 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -110,6 +110,7 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Active (left only)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Active (right only)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Active (left and right)"</string> + <string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"Couldn’t update surroundings"</string> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Active (media only). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Active (media only). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connected (supports audio sharing). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> @@ -423,6 +424,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Transition animation scale"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator duration scale"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulate secondary displays"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Shade display position"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Don’t keep activities"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destroy every activity as soon as the user leaves it"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml index 7e846fbfbb89..8c27ec6315c9 100644 --- a/packages/SettingsLib/res/values-en-rGB/arrays.xml +++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Device display only (default)"</item> + <item msgid="9161645858025071955">"External display"</item> + <item msgid="114384731934682483">"Focus-based"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Show shade on device display only"</item> + <item msgid="7795034287069726554">"Show device on single external display"</item> + <item msgid="5280431949814340475">"Show device on last focused display"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index d9c35f50582b..b281f4ceccc2 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Active (left only)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Active (right only)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Active (left and right)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Active (media only). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Active (media only). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connected (supports audio sharing). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Transition animation scale"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator duration scale"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulate secondary displays"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Shade display position"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Don\'t keep activities"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destroy every activity as soon as the user leaves it"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml index 7e846fbfbb89..8c27ec6315c9 100644 --- a/packages/SettingsLib/res/values-en-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Device display only (default)"</item> + <item msgid="9161645858025071955">"External display"</item> + <item msgid="114384731934682483">"Focus-based"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Show shade on device display only"</item> + <item msgid="7795034287069726554">"Show device on single external display"</item> + <item msgid="5280431949814340475">"Show device on last focused display"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index d9c35f50582b..b281f4ceccc2 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Active (left only)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Active (right only)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Active (left and right)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Active (media only). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Active (media only). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connected (supports audio sharing). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Transition animation scale"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator duration scale"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulate secondary displays"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Shade display position"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Don\'t keep activities"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destroy every activity as soon as the user leaves it"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml index 541f4db7e691..daf9ab98996d 100644 --- a/packages/SettingsLib/res/values-es-rUS/arrays.xml +++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Solo en la pantalla del dispositivo (predeterminado)"</item> + <item msgid="9161645858025071955">"Pantalla externa"</item> + <item msgid="114384731934682483">"Basado en el enfoque"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Mostrar sobra solo en la pantalla del dispositivo"</item> + <item msgid="7795034287069726554">"Mostrar dispositivo en una sola pantalla externa"</item> + <item msgid="5280431949814340475">"Mostrar dispositivo en la última pantalla enfocada"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 191a8eb9bb02..6ad60084b622 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Activo (solo izquierdo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Activo (solo derecho)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Activos (izquierdo y derecho)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Activado (solo para contenido multimedia). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Activo (solo para contenido multimedia); I: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>; D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Conectado (admite el uso compartido de audio); <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala de animación de transición"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de duración de animador"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simular pantallas secundarias"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posición de visualización de la sombra"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplicaciones"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Eliminar actividades"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Descartar todas las actividades en cuanto el usuario las abandona"</string> diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml index b99219cadbe9..a4bb49ee145a 100644 --- a/packages/SettingsLib/res/values-es/arrays.xml +++ b/packages/SettingsLib/res/values-es/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Solo en la pantalla del dispositivo (predeterminado)"</item> + <item msgid="9161645858025071955">"Pantalla externa"</item> + <item msgid="114384731934682483">"Basado en el enfoque"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Mostrar el panel solo en la pantalla del dispositivo"</item> + <item msgid="7795034287069726554">"Mostrar el dispositivo en una sola pantalla externa"</item> + <item msgid="5280431949814340475">"Mostrar el dispositivo en la última pantalla enfocada"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 95ebbfa74986..60197511390b 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Activo (solo izquierdo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Activo (solo derecho)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Activo (izquierdo y derecho)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Activo (solo multimedia). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Activo (solo multimedia). Izquierdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería. Derecho: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Conectado (permite compartir audio). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala de animación de transición"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de duración de animación"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simular pantallas secundarias"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posición del panel en la pantalla"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplicaciones"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"No mantener actividades"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destruir actividades cuando el usuario salga de ellas"</string> diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml index 6762abf2fca6..9a77991309a2 100644 --- a/packages/SettingsLib/res/values-et/arrays.xml +++ b/packages/SettingsLib/res/values-et/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Ainult seadme ekraan (vaikimisi)"</item> + <item msgid="9161645858025071955">"Väline ekraan"</item> + <item msgid="114384731934682483">"Fookusepõhine"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Kuva menüü ainult seadme ekraanil"</item> + <item msgid="7795034287069726554">"Kuva seade ühe välisel ekraanil"</item> + <item msgid="5280431949814340475">"Kuva seade viimati esile tõstetud ekraanil"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 802c1e258e85..773b1e67b232 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktiivne (ainult vasak)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktiivne (ainult parem)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktiivne (vasak ja parem)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktiivne (ainult meedia). Aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiivne (ainult meedia). Aku: V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Ühendatud (toetab heli jagamist). Aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Ülemineku animatsioonimastaap"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animaatori kestuse mastaap"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Modelleeri teisi ekraane"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Menüü kuvamise asukoht"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Rakendused"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ära hoia tegevusi alles"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Hävita kõik tegevused kohe, kui kasutaja neist lahkub"</string> diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index 6ed484c40e57..3d59a279d3c0 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -153,15 +153,15 @@ <item msgid="1333279807604675720">"Estereoa"</item> </string-array> <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles"> - <item msgid="1241278021345116816">"Audioaren kalitatea areagotzeko optimizatua (990 Kb/s / 909 Kb/s)"</item> + <item msgid="1241278021345116816">"Audioaren kalitatea hobetzeko optimizatua (990 Kb/s / 909 Kb/s)"</item> <item msgid="3523665555859696539">"Audioaren eta konexioaren kalitate orekatua (660 Kb/s / 606 Kb/s)"</item> - <item msgid="886408010459747589">"Konexioaren kalitatea areagotzeko optimizatua (330 Kb/s / 303 Kb/s)"</item> + <item msgid="886408010459747589">"Konexioaren kalitatea hobetzeko optimizatua (330 Kb/s / 303 Kb/s)"</item> <item msgid="3808414041654351577">"Emaitzarik onenak (bit-abiadura egokitua)"</item> </string-array> <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries"> - <item msgid="804499336721569838">"Audioaren kalitatea areagotzeko optimizatua"</item> + <item msgid="804499336721569838">"Audioaren kalitatea hobetzeko optimizatua"</item> <item msgid="7451422070435297462">"Orekatu audioaren eta konexioaren kalitateak"</item> - <item msgid="6173114545795428901">"Konexioaren kalitatea areagotzeko optimizatua"</item> + <item msgid="6173114545795428901">"Konexioaren kalitatea hobetzeko optimizatua"</item> <item msgid="4349908264188040530">"Emaitzarik onenak (bit-abiadura egokitua)"</item> </string-array> <string-array name="bluetooth_audio_active_device_summaries"> @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Gailuaren pantailan soilik (lehenetsia)"</item> + <item msgid="9161645858025071955">"Kanpoko pantailan"</item> + <item msgid="114384731934682483">"Fokuaren arabera"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Erakutsi itzalak gailuaren pantailan soilik"</item> + <item msgid="7795034287069726554">"Erakutsi gailua kanpoko pantaila bakarrean"</item> + <item msgid="5280431949814340475">"Erakutsi gailua fokuratutako azken pantailan"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 16dd1f6ffba9..274b9a1c5790 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktibo (ezkerrekoa soilik)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktibo (eskuinekoa soilik)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktibo (ezkerrekoa eta eskuinekoa)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktibo (multimedia-edukia soilik). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktibo (multimedia-edukia soilik). L aldearen bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. R aldearen bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Konektatuta (audioa partekatzeko eginbidea onartzen du). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Trantsizioen animazio-eskala"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatzailearen iraupen-eskala"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulatu bigarren mailako pantailak"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Itzalak pantailan duen posizioa"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikazioak"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ez mantendu jarduerak"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Ezabatu jarduerak erabiltzailea haietatik irtetean"</string> diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml index d1505386ec02..9e1da41e6edc 100644 --- a/packages/SettingsLib/res/values-fa/arrays.xml +++ b/packages/SettingsLib/res/values-fa/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"۲"</item> <item msgid="4779928470672877922">"۳"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"فقط نمایشگر دستگاه (پیشفرض)"</item> + <item msgid="9161645858025071955">"نمایشگر خارجی"</item> + <item msgid="114384731934682483">"کانونیمحور"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"نمایش سایه فقط در نمایشگر دستگاه"</item> + <item msgid="7795034287069726554">"نمایش دستگاه در یک نمایشگر خارجی"</item> + <item msgid="5280431949814340475">"نمایش دستگاه در آخرین نمایشگر کانونیشده"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"نمایشگر_پیشفرض"</item> + <item msgid="774789415968826925">"هر_نمایشگر_خارجی"</item> + <item msgid="7880769915418638436">"آخرین_لمس_نوار_وضعیت"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 85ef0f9cb5fd..6154b8cef78a 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"فعال (فقط چپ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"فعال (فقط راست)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"فعال (چپ و راست)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"فعال (فقط رسانه). باتری: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"فعال (فقط رسانه). باتری چپ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، باتری راست: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"متصل (از اشتراک صدا پشتیبانی میکند)، باتری: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"مقیاس پویانمایی انتقالی"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"مقیاس طول مدت مقیاس مدت پویانماساز"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"شبیهسازی نمایشگر ثانویه"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"موقعیت سایه نمایشگر"</string> <string name="debug_applications_category" msgid="5394089406638954196">"برنامهها"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"فعالیتها نگه داشته نشوند"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"از بین بردن هر فعالیت به محض خروج کاربر از آن"</string> diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml index 92814dec1330..0c970ec5fbbd 100644 --- a/packages/SettingsLib/res/values-fi/arrays.xml +++ b/packages/SettingsLib/res/values-fi/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Vain laitteen näyttö (oletus)"</item> + <item msgid="9161645858025071955">"Ulkoinen näyttö"</item> + <item msgid="114384731934682483">"Kohdistusperustainen"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Näytä ilmoitusalue vain laitteen näytöllä"</item> + <item msgid="7795034287069726554">"Näytä laite yhdellä ulkoisella näytöllä"</item> + <item msgid="5280431949814340475">"Näytä laite viimeksi kohdistetulla näytöllä"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 4b18d2f96515..7baf2a0803fc 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktiivinen (vain vasen)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktiivinen (vain oikea)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktiivinen (vasen ja oikea)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktiivinen (vain media). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> virtaa."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiivinen (vain media). V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, O: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> virtaa."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Yhdistetty (tukee audionjakoa). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> virtaa."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Siirtymä"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animaattori"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuloi toissijaiset näytöt"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Ilmoitusalueen sijainti näytöllä"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Sovellukset"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Älä säilytä toimintoja"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Tuhoa kaikki toiminnot, kun käyttäjä poistuu"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml index 15cb17d0817c..6fc0ed9a1e3c 100644 --- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Écran de l\'appareil seulement (par défaut)"</item> + <item msgid="9161645858025071955">"Écran externe"</item> + <item msgid="114384731934682483">"Affichage mis en évidence"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Afficher le volet sur l\'écran de l\'appareil seulement"</item> + <item msgid="7795034287069726554">"Afficher l\'appareil sur un seul écran externe"</item> + <item msgid="5280431949814340475">"Afficher l\'appareil sur le dernier affichage mis en évidence"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index a1d15997b630..699fa7f118d8 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Actif (gauche seulement)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Actif (droite seulement)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Actif (gauche et droite)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Actif (contenu multimédia uniquement). Pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Actif (contenu multimédia uniquement). G. : pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D. : pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connecté (prise en charge du partage audio). Pile à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Éch. d\'animation des transitions"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Échelle durée animation"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuler affich. secondaires"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Position d\'affichage du volet"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Applis"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ne pas conserver activités"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Supprimer immédiatement les activités abandonnées"</string> diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml index b32adc955fe7..970e21719a87 100644 --- a/packages/SettingsLib/res/values-fr/arrays.xml +++ b/packages/SettingsLib/res/values-fr/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Écran de l\'appareil uniquement (par défaut)"</item> + <item msgid="9161645858025071955">"Écran externe"</item> + <item msgid="114384731934682483">"Basé sur la sélection"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Afficher le volet sur l\'écran de l\'appareil uniquement"</item> + <item msgid="7795034287069726554">"Afficher l\'appareil sur un seul écran externe"</item> + <item msgid="5280431949814340475">"Afficher l\'appareil sur le dernier écran sélectionné"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index f22f8bffcc41..73dbdbffe2fb 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Actif (gauche uniquement)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Actif (droit uniquement)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Actifs (gauche et droit)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Actif (multimédia uniquement). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Actif (multimédia uniquement). Gauche : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batterie, droit : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batterie."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connecté (compatible avec le partage audio). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Échelle d\'animation des transitions"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Échelle de durée d\'animation"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuler des écrans secondaires"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Position d\'affichage du volet"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Applications"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ne pas conserver les activités"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Supprimer immédiatement les activités abandonnées"</string> diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml index 8f7a8b6a79c8..cd085fa65275 100644 --- a/packages/SettingsLib/res/values-gl/arrays.xml +++ b/packages/SettingsLib/res/values-gl/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Só pantalla do dispositivo (opción predeterminada)"</item> + <item msgid="9161645858025071955">"Pantalla externa"</item> + <item msgid="114384731934682483">"En función do enfoque"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Mostrar panel despregable só na pantalla do dispositivo"</item> + <item msgid="7795034287069726554">"Mostrar dispositivo nunha única pantalla externa"</item> + <item msgid="5280431949814340475">"Mostrar dispositivo na última pantalla enfocada"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"pantalla_predeterminada"</item> + <item msgid="774789415968826925">"calquera_pantalla_externa"</item> + <item msgid="7880769915418638436">"último_toque_barra_estado"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 6a22a9ba34c1..9f14f7cc3f71 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Activo (só o esquerdo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Activo (só o dereito)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Activos (o esquerdo e o dereito)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Activo (só contido multimedia). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Activo (só contido multimedia). Esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de batería. Dereito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de batería."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Conectado (compatible con audio compartido). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala animación-transición"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala duración animador"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simular pantallas secundarias"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posición do panel despregable na pantalla"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplicacións"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Non manter actividades"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destrúe as actividades cando o usuario non as usa"</string> diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml index 4f7cbd26532c..912df2d85988 100644 --- a/packages/SettingsLib/res/values-gu/arrays.xml +++ b/packages/SettingsLib/res/values-gu/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"માત્ર ડિવાઇસનું ડિસ્પ્લે (ડિફૉલ્ટ)"</item> + <item msgid="9161645858025071955">"બાહ્ય ડિસ્પ્લે"</item> + <item msgid="114384731934682483">"ફોકસ-આધારિત"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"માત્ર ડિવાઇસના ડિસ્પ્લે પર શેડ બતાવો"</item> + <item msgid="7795034287069726554">"માત્ર એક બાહ્ય ડિસ્પ્લે પર ડિવાઇસ બતાવો"</item> + <item msgid="5280431949814340475">"છેલ્લે ફોકસ કરેલા ડિસ્પ્લે પર ડિવાઇસ બતાવો"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 91518d36cdee..74b19f609179 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ચાલુ છે (માત્ર ડાબી બાજુ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ચાલુ છે (માત્ર જમણી બાજુ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ચાલુ છે (ડાબી અને જમણી બાજુ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"સક્રિય (માત્ર મીડિયા માટે). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"સક્રિય (માત્ર મીડિયા માટે). ડાબી બાજુ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, જમણી બાજુ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"કનેક્ટેડ (ઑડિયો શેરિંગને સપોર્ટ કરે છે). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ટ્રાન્ઝિશન ઍનિમેશન સ્કેલ"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ઍનિમેટર અવધિ સ્કેલ"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"સેકન્ડરી ડિસ્પ્લેનું અનુકરણ કરો"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"શેડના ડિસ્પ્લેની સ્થિતિ"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ઍપ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"પ્રવૃત્તિઓ રાખશો નહીં"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"જેવો વપરાશકર્તા તેને છોડે, તરત જ દરેક પ્રવૃત્તિ નષ્ટ કરો"</string> diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 2173ad62404a..25d638897f96 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"सिर्फ़ डिवाइस का डिसप्ले (डिफ़ॉल्ट)"</item> + <item msgid="9161645858025071955">"बाहरी डिसप्ले पर"</item> + <item msgid="114384731934682483">"फ़ोकस के हिसाब से"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"सिर्फ़ डिवाइस के डिसप्ले पर शेड दिखाएं"</item> + <item msgid="7795034287069726554">"शेड को बाहरी डिसप्ले पर दिखाएं"</item> + <item msgid="5280431949814340475">"फ़ोकस किए गए पिछले डिसप्ले पर शेड दिखाएं"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 10a4622568f9..8f9229ae6bf0 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"सिर्फ़ बाईं तरफ़ वाला चालू है"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"सिर्फ़ दाईं तरफ़ वाला चालू है"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"बाईं और दाईं तरफ़ वाला चालू है"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"चालू है (सिर्फ़ मीडिया के लिए). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"चालू है (सिर्फ़ मीडिया के लिए). बायां हेडसेट: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, दायां हेडसेट: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बैटरी."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"कनेक्ट हो गया (ऑडियो शेयर करने की सुविधा काम करती है). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ट्रांज़िशन ऐनिमेशन स्केल"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ऐनिमेटर ड्यूरेशन स्केल"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"कई साइज़ के डिसप्ले बनाएं"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"शेड दिखने की स्थिति"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ऐप्लिकेशन"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"गतिविधियों को न रखें"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"उपयोगकर्ता के छोड़ते ही हर गतिविधि को खत्म करें"</string> diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml index f4bb41939215..639e39ec1410 100644 --- a/packages/SettingsLib/res/values-hr/arrays.xml +++ b/packages/SettingsLib/res/values-hr/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Samo zaslon uređaja (zadano)"</item> + <item msgid="9161645858025071955">"Vanjski zaslon"</item> + <item msgid="114384731934682483">"Na temelju fokusa"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Prikaži sjenu samo na zaslonu uređaja"</item> + <item msgid="7795034287069726554">"Prikaži uređaj na jednom vanjskom zaslonu"</item> + <item msgid="5280431949814340475">"Prikaži uređaj na posljednjem fokusiranom zaslonu"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index c3284ae4f400..3a18da0ff703 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktivno (samo lijevo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktivno (samo desno)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktivno (lijevo i desno)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktivno (samo medijski sadržaji). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktivno (samo medijski sadržaji), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterije."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Povezano (podržava zajedničko slušanje). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Brzina animacije prijelaza"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Brzina generiranja animacija"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulacija sekundarnih zaslona"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Položaj prikaza sjene"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikacije"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ukloni aktivnosti"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Aktivnost se uklanja čim je korisnik napusti"</string> diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml index 6ece81a02f8b..d1319665bf0b 100644 --- a/packages/SettingsLib/res/values-hu/arrays.xml +++ b/packages/SettingsLib/res/values-hu/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Csak az eszköz kijelzője (alapértelmezett)"</item> + <item msgid="9161645858025071955">"Külső kijelző"</item> + <item msgid="114384731934682483">"Fókusz alapján"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Felület megjelenítése csak az eszköz kijelzőjén"</item> + <item msgid="7795034287069726554">"Felület megjelenítése egyetlen külső kijelzőn"</item> + <item msgid="5280431949814340475">"Felület megjelenítése a legutóbb fókuszban lévő kijelzőn"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index dcf1610ccad4..00ca5c6a0e21 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktív (csak bal)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktív (csak jobb)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktív (bal és jobb)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktív (csak médiatartalom lejátszása esetén). Akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktív (csak médiatartalom lejátszása esetén). Akkumulátorok töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (bal) és <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (jobb)."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Csatlakoztatva (támogatja a hang megosztását). Akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Áttűnési animáció tempója"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animáció tempója"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Másodlagos kijelzők szimulálása"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Felület megjelenítési pozíciója"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Alkalmazások"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Tevékenységek törlése"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Tevékenységek törlése, amint elhagyják azokat"</string> diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml index 6819f31af2be..56545014e60f 100644 --- a/packages/SettingsLib/res/values-hy/arrays.xml +++ b/packages/SettingsLib/res/values-hy/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Միայն սարքի էկրանը (կանխադրված)"</item> + <item msgid="9161645858025071955">"Արտաքին էկրան"</item> + <item msgid="114384731934682483">"Ֆոկուսի հիման վրա"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Ցույց տալ երանգը միայն սարքի էկրանին"</item> + <item msgid="7795034287069726554">"Ցույց տալ սարքը մեկ արտաքին էկրանին"</item> + <item msgid="5280431949814340475">"Ցույց տալ սարքը վերջին ֆոկուսավորված էկրանին"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index cd6cfdfbf1ec..58eca5cd3b7c 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Ակտիվ է (միայն ձախ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Ակտիվ է (միայն աջ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Ակտիվ է (ձախ և աջ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Ակտիվ է (միայն մեդիա)։ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>։"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Ակտիվ է (միայն մեդիա)։ Ձախ ականջակալի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, աջ ականջակալի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>։"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Միացված է (աջակցում է աուդիոյի փոխանցում)։ Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>։"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Անցումների շարժապատկեր"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Շարժանկարի տևողության սանդղակ"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Կրկնաստեղծել երկրորդական էկրան"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Երանգի ցուցադրման դիրքը"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Հավելվածներ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Չպահել գործողությունները"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Օգտատիրոջ դուրս գալուց հետո հեռացնել բոլոր գործողությունները"</string> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index 00ea04d68c16..c256e8cd72d0 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Hanya layar perangkat (Default)"</item> + <item msgid="9161645858025071955">"Layar eksternal"</item> + <item msgid="114384731934682483">"Berbasis fokus"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Tampilkan shade hanya di layar perangkat"</item> + <item msgid="7795034287069726554">"Tampilkan perangkat di satu layar eksternal"</item> + <item msgid="5280431949814340475">"Tampilkan perangkat di layar yang terakhir difokuskan"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index cd5350755f7e..1652ebf66d74 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktif (hanya kiri)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktif (hanya kanan)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktif (kiri dan kanan)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktif (hanya media). Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktif (hanya media). Baterai L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Terhubung (mendukung berbagi audio). Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animasi transisi"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala durasi animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulasikan tampilan sekunder"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posisi shade layar"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikasi"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Jangan simpan aktivitas"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Hancurkan aktivitas setelah ditinggal pengguna"</string> diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml index 928cdfa2d796..1d81344ba7b2 100644 --- a/packages/SettingsLib/res/values-is/arrays.xml +++ b/packages/SettingsLib/res/values-is/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Aðeins skjár tækis (sjálfgefið)"</item> + <item msgid="9161645858025071955">"Ytri skjár"</item> + <item msgid="114384731934682483">"Byggt á fókus"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Aðeins skyggja skjá tækis"</item> + <item msgid="7795034287069726554">"Sýna tæki á einum ytri skjá"</item> + <item msgid="5280431949814340475">"Sýna tæki á skjá sem var síðast í fókus"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index ff4e38b3f2de..bc766325d871 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Kveikt (eingöngu vinstra)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Kveikt (eingöngu hægra)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Kveikt (vinstra og hægra)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Virkt (eingöngu margmiðlunarefni). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlöðuhleðsla."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Virkt (eingöngu margmiðlunarefni), V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> rafhlöðuhleðsla."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Tengt (styður hljóðdeilingu), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlöðuhleðsla."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Lengd hreyfiumbreytinga"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Tímalengd hreyfiáhrifa"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Herma eftir aukaskjáum"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Staðsetning skugga á skjá"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Forrit"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ekki vista virkni"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Eyðileggja öll verk um leið og notandi yfirgefur þau"</string> diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml index c9f31ff624c2..331410cada30 100644 --- a/packages/SettingsLib/res/values-it/arrays.xml +++ b/packages/SettingsLib/res/values-it/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Solo display del dispositivo (impostazione predefinita)"</item> + <item msgid="9161645858025071955">"Display esterno"</item> + <item msgid="114384731934682483">"In base alla selezione"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Mostra l\'area delle notifiche solo sul display del dispositivo"</item> + <item msgid="7795034287069726554">"Mostra il dispositivo su un singolo display esterno"</item> + <item msgid="5280431949814340475">"Mostra il dispositivo sull\'ultimo display selezionato"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 183a7990171f..a604e5bf40cc 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -110,6 +110,7 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Attivo (solo sinistro)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Attivo (solo destro)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Attivi (destro e sinistro)"</string> + <string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"Impossibile aggiornare audio ambientale"</string> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Attivo (solo contenuti multimediali). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> di batteria."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Attivo (solo contenuti multimediali). S: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> di batteria. D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> di batteria."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Connesso (supporta la condivisione audio). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> di batteria."</string> @@ -423,6 +424,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Scala animazione transizione"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Scala durata animatore"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simula display secondari"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posizione display area delle notifiche"</string> <string name="debug_applications_category" msgid="5394089406638954196">"App"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Non conservare attività"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Elimina ogni attività appena l\'utente la interrompe"</string> diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml index 01bb1fb5339e..d1771fcfffec 100644 --- a/packages/SettingsLib/res/values-iw/arrays.xml +++ b/packages/SettingsLib/res/values-iw/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"מסך המכשיר בלבד (ברירת המחדל)"</item> + <item msgid="9161645858025071955">"מסך חיצוני"</item> + <item msgid="114384731934682483">"לפי התמקדות"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"הצגת הצללה במסך המכשיר בלבד"</item> + <item msgid="7795034287069726554">"הצגת המכשיר במסך חיצוני אחד"</item> + <item msgid="5280431949814340475">"הצגת המכשיר במסך האחרון שהתמקדת בו"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index c2b9cbc2a68d..f51c9166cca4 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"פעיל (שמאל בלבד)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"פעיל (ימין בלבד)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"פעיל (ימין ושמאל)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"פעיל (מדיה בלבד). סוללה: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"פעיל (מדיה בלבד). סוללה בצד שמאל: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, סוללה בצד ימין: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"מחובר (תמיכה בשיתוף אודיו). סוללה: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"קנה מידה לאנימציית מעבר"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"קנה מידה למשך זמן אנימציה"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"יצירת הדמיה של תצוגות משניות"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"מיקום התצוגה של ההצללה"</string> <string name="debug_applications_category" msgid="5394089406638954196">"אפליקציות"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ללא שמירת פעילויות"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"השמדת כל פעילות ברגע שהמשתמש עוזב אותה"</string> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index 31bcec196a63..9dc234b8758d 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"デバイスのディスプレイのみ(デフォルト)"</item> + <item msgid="9161645858025071955">"外部ディスプレイ"</item> + <item msgid="114384731934682483">"フォーカスに基づく"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"デバイスのディスプレイにのみシェードを表示する"</item> + <item msgid="7795034287069726554">"1 台の外部ディスプレイにデバイスを表示する"</item> + <item msgid="5280431949814340475">"最後にフォーカスされたディスプレイにデバイスを表示する"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 081ab48d511c..923054d268b6 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"アクティブ(左のみ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"アクティブ(右のみ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"アクティブ(左と右)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"有効(メディアのみ)。バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"有効(メディアのみ)。左: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>、右: バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>。"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"接続済み(音声の共有をサポート)。バッテリー残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"トランジション アニメ スケール"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator 再生時間スケール"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"第2画面のシミュレーション"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"シェードの表示位置"</string> <string name="debug_applications_category" msgid="5394089406638954196">"アプリ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"アクティビティを保持しない"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ユーザーが離れたアクティビティを直ちに破棄する"</string> diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml index 4de27e7915ca..8d1adf653f97 100644 --- a/packages/SettingsLib/res/values-ka/arrays.xml +++ b/packages/SettingsLib/res/values-ka/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"მხოლოდ მოწყობილობის ეკრანი (ნაგულისხმევი)"</item> + <item msgid="9161645858025071955">"გარე ეკრანი"</item> + <item msgid="114384731934682483">"ფოკუსის მიხედვით"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"ჩრდილის ჩვენება მხოლოდ მოწყობილობის ეკრანზე"</item> + <item msgid="7795034287069726554">"ჩრდილის ჩვენება ერთ გარე ეკრანზე"</item> + <item msgid="5280431949814340475">"მოწყობილობის ჩვენება ბოლო ფოკუსირებულ ეკრანზე"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 0ca04a19c809..e8f1b0769cb6 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"აქტიური (მხოლოდ მარცხენა)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"აქტიური (მხოლოდ მარჯვენა)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"აქტიური (მარცხენა და მარჯვენა)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"აქტიური (მხოლოდ მედია). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>%% ბატარეა."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"აქტიური (მხოლოდ მედია), მარცხენა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, მარჯვენა:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ბატარეა."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია). ბატარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"გადასვლის მასშტაბი"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ანიმაციების ხანგრძლივობის მასშტაბი"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"მეორადი ეკრანების სიმულაცია"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ჩრდილის პოზიცია ეკრანზე"</string> <string name="debug_applications_category" msgid="5394089406638954196">"აპები"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ნუ შეინარჩუნებ მოქმედებებს"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ნებისმიერი აქტივობის განადგურება დასრულებისთანავე"</string> diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml index 666982096988..e8996de87cb0 100644 --- a/packages/SettingsLib/res/values-kk/arrays.xml +++ b/packages/SettingsLib/res/values-kk/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Тек құрылғы дисплейі (әдепкі)"</item> + <item msgid="9161645858025071955">"Сыртқы дисплей"</item> + <item msgid="114384731934682483">"Назарға негізделген"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Құрылғы дисплейінде ғана реңк көрсету"</item> + <item msgid="7795034287069726554">"Жалғыз сыртқы дисплейі бар құрылғыны көрсету"</item> + <item msgid="5280431949814340475">"Соңғы рет назарда болған дисплейдегі құрылғыны көрсету"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 87917af0d29c..a88517dfe445 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Істеп тұр (тек сол жағы)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Істеп тұр (тек оң жағы)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Істеп тұр (екі жағы да)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Істеп тұр (тек мультимедиа). Батарея зарядының деңгейі – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Істеп тұр (тек мультимедиа). Сол жақ: батарея зарядының деңгейі — <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>. Оң жақ: батарея зарядының деңгейі — <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Жалғанып тұр (аудио бөлісу мүмкіндігі бар). Батарея зарядының деңгейі – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Ауысу анимациясының өлшемі"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Аниматор ұзақтығы"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Қосымша дисплей симуляциясы"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Реңк дисплей позициясы"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Қолданбалар"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Әрекеттерді сақтамау"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Әр әрекетті пайдаланушы аяқтай салысымен жою"</string> diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml index 3a533ced61e8..ee6ee565fbae 100644 --- a/packages/SettingsLib/res/values-km/arrays.xml +++ b/packages/SettingsLib/res/values-km/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"ផ្ទាំងអេក្រង់ឧបករណ៍តែប៉ុណ្ណោះ (លំនាំដើម)"</item> + <item msgid="9161645858025071955">"ផ្ទាំងអេក្រង់ខាងក្រៅ"</item> + <item msgid="114384731934682483">"ផ្អែកលើការផ្ដោត"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"បង្ហាញផ្ទាំងនៅលើផ្ទាំងអេក្រង់ឧបករណ៍តែប៉ុណ្ណោះ"</item> + <item msgid="7795034287069726554">"បង្ហាញឧបករណ៍នៅលើផ្ទាំងអេក្រង់ខាងក្រៅតែមួយ"</item> + <item msgid="5280431949814340475">"បង្ហាញឧបករណ៍នៅលើផ្ទាំងអេក្រង់ដែលផ្ដោតចុងក្រោយ"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 2398ca81a03d..41b427a91bf6 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"សកម្ម (ខាងឆ្វេងប៉ុណ្ណោះ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"សកម្ម (ខាងស្ដាំប៉ុណ្ណោះ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"សកម្ម (ខាងឆ្វេង និងខាងស្ដាំ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"សកម្ម (តែមេឌៀប៉ុណ្ណោះ)។ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>។"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"សកម្ម (តែមេឌៀប៉ុណ្ណោះ)។ ឆ្វេង៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ស្ដាំ៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>។"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)។ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>។"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"មាត្រដ្ឋានចលនាបែបផែនឆ្លង"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"មាត្រដ្ឋានរយៈពេលចលនា"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ត្រាប់ជាអេក្រង់ទីពីរ"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ទីតាំងបង្ហាញផ្ទាំង"</string> <string name="debug_applications_category" msgid="5394089406638954196">"កម្មវិធី"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"កុំរក្សាទុកសកម្មភាព"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"បំផ្លាញគ្រប់សកម្មភាព ពេលអ្នកប្រើចាកចេញ"</string> diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml index 1c8112aa1faa..51e6e15a3e1b 100644 --- a/packages/SettingsLib/res/values-kn/arrays.xml +++ b/packages/SettingsLib/res/values-kn/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"ಸಾಧನದ ಡಿಸ್ಪ್ಲೇ ಮಾತ್ರ (ಡೀಫಾಲ್ಟ್)"</item> + <item msgid="9161645858025071955">"ಬಾಹ್ಯ ಡಿಸ್ಪ್ಲೇ"</item> + <item msgid="114384731934682483">"ಫೋಕಸ್-ಆಧಾರಿತ"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"ಸಾಧನದ ಡಿಸ್ಪ್ಲೇನಲ್ಲಿ ಮಾತ್ರ ಶೇಡ್ ತೋರಿಸಿ"</item> + <item msgid="7795034287069726554">"ಒಂದೇ ಬಾಹ್ಯ ಡಿಸ್ಪ್ಲೇನಲ್ಲಿ ಸಾಧನವನ್ನು ತೋರಿಸಿ"</item> + <item msgid="5280431949814340475">"ಕೊನೆಯ ಕೇಂದ್ರೀಕೃತ ಡಿಸ್ಪ್ಲೇನಲ್ಲಿ ಸಾಧನವನ್ನು ತೋರಿಸಿ"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index a85d0cc02216..20b4c93eef8f 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ಸಕ್ರಿಯವಾಗಿದೆ (ಎಡಕಿವಿಯ ಸಾಧನ ಮಾತ್ರ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ಸಕ್ರಿಯವಾಗಿದೆ (ಬಲಕಿವಿಯ ಸಾಧನ ಮಾತ್ರ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ಸಕ್ರಿಯವಾಗಿವೆ (ಎಡ ಮತ್ತು ಬಲಕಿವಿಯ ಸಾಧನಗಳು)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ). ಎಡ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ಬಲ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ ಮಟ್ಟ."</string> @@ -241,7 +243,7 @@ <string name="category_clone" msgid="1554511758987195974">"ಕ್ಲೋನ್"</string> <string name="development_settings_title" msgid="140296922921597393">"ಡೆವಲಪರ್ ಆಯ್ಕೆಗಳು"</string> <string name="development_settings_enable" msgid="4285094651288242183">"ಡೆವಲಪರ್ ಆಯ್ಕೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> - <string name="development_settings_summary" msgid="8718917813868735095">"ಆ್ಯಪ್ ಅಭಿವೃದ್ಧಿಗಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ಹೊಂದಿಸಿ"</string> + <string name="development_settings_summary" msgid="8718917813868735095">"ಆ್ಯಪ್ ಅಭಿವೃದ್ಧಿಗಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ಸೆಟ್ ಮಾಡಿ"</string> <string name="development_settings_not_available" msgid="355070198089140951">"ಈ ಬಳಕೆದಾರರಿಗೆ ಡೆವಲಪರ್ ಆಯ್ಕೆಗಳು ಲಭ್ಯವಿಲ್ಲ"</string> <string name="vpn_settings_not_available" msgid="2894137119965668920">"VPN ಸೆಟ್ಟಿಂಗ್ಗಳು ಈ ಬಳಕೆದಾರರಿಗೆ ಲಭ್ಯವಿಲ್ಲ"</string> <string name="tethering_settings_not_available" msgid="266821736434699780">"ಟೆಥರಿಂಗ್ ಸೆಟ್ಟಿಂಗ್ಗಳು ಈ ಬಳಕೆದಾರರಿಗೆ ಲಭ್ಯವಿಲ್ಲ"</string> @@ -361,7 +363,7 @@ <string name="enable_linux_terminal_summary" msgid="2029479880888108902">"(ಪ್ರಾಯೋಗಿಕ) Android ನಲ್ಲಿ Linux ಟರ್ಮಿನಲ್ ಅನ್ನು ರನ್ ಮಾಡಿ"</string> <string name="disable_linux_terminal_disclaimer" msgid="3054320531778388231">"ನೀವು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, Linux ಟರ್ಮಿನಲ್ ಡೇಟಾ ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ"</string> <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ಪರೀಕ್ಷಿಸುವಿಕೆ"</string> - <string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCP ಪರಿಶೀಲನಾ ನಡವಳಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string> + <string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCP ಪರಿಶೀಲನಾ ನಡವಳಿಕೆಯನ್ನು ಸೆಟ್ ಮಾಡಿ"</string> <string name="debug_debugging_category" msgid="535341063709248842">"ಡೀಬಗ್ ಮಾಡುವಿಕೆ"</string> <string name="debug_app" msgid="8903350241392391766">"ಡೀಬಗ್ ಆ್ಯಪ್ ಆಯ್ಕೆಮಾಡಿ"</string> <string name="debug_app_not_set" msgid="1934083001283807188">"ಯಾವುದೇ ಡೀಬಗ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಹೊಂದಿಸಿಲ್ಲ"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ಪರಿವರ್ತನೆ ಅನಿಮೇಶನ್ ಸ್ಕೇಲ್"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ಅನಿಮೇಟರ್ ಅವಧಿಯ ಪ್ರಮಾಣ"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ಮಾಧ್ಯಮಿಕ ಡಿಸ್ಪ್ಲೇ ಸಿಮ್ಯುಲೇಟ್"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ಶೇಡ್ ಡಿಸ್ಪ್ಲೇ ಸ್ಥಾನ"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ಚಟುವಟಿಕೆಗಳನ್ನು ಇರಿಸಬೇಡಿ"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ಬಳಕೆದಾರರು ಹೊರಹೋಗುತ್ತಿದ್ದಂತೆಯೇ ಚಟುವಟಿಕೆ ನಾಶಪಡಿಸು"</string> @@ -466,7 +469,7 @@ <string name="runningservices_settings_title" msgid="6460099290493086515">"ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ಈಗ ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ಹೊಂದಿಸಿ"</string> - <string name="select_webview_provider_dialog_title" msgid="2444261109877277714">"WebView ಅನುಷ್ಠಾನಗೊಳಿಸುವಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string> + <string name="select_webview_provider_dialog_title" msgid="2444261109877277714">"WebView ಅನುಷ್ಠಾನಗೊಳಿಸುವಿಕೆಯನ್ನು ಸೆಟ್ ಮಾಡಿ"</string> <string name="select_webview_provider_toast_text" msgid="8512254949169359848">"ಈ ಆಯ್ಕೆಯು ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿರುವುದಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="picture_color_mode" msgid="1013807330552931903">"ಚಿತ್ರ ಬಣ್ಣದ ಮೋಡ್"</string> <string name="picture_color_mode_desc" msgid="151780973768136200">"sRGB ಬಳಸಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml index 0a9663e65455..dd1121f55c04 100644 --- a/packages/SettingsLib/res/values-ko/arrays.xml +++ b/packages/SettingsLib/res/values-ko/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"기기 디스플레이만(기본값)"</item> + <item msgid="9161645858025071955">"외부 디스플레이"</item> + <item msgid="114384731934682483">"포커스 기반"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"기기 디스플레이에만 음영 표시"</item> + <item msgid="7795034287069726554">"단일 외부 디스플레이에 기기 표시"</item> + <item msgid="5280431949814340475">"마지막으로 포커스된 디스플레이에 기기 표시"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 3f3fa5470e3f..084ab17845d3 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"활성(왼쪽만)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"활성(오른쪽만)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"활성(왼쪽 및 오른쪽)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"사용 중입니다(미디어 전용). 배터리는 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>입니다."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"사용 중입니다(미디어 전용). 배터리는 왼쪽 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, 오른쪽 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>입니다."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"연결되었습니다(오디오 공유 지원). 배터리는 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>입니다."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"전환 애니메이션 배율"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator 길이 배율"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"보조 디스플레이 시뮬레이션"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"음영 표시 위치"</string> <string name="debug_applications_category" msgid="5394089406638954196">"앱"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"활동 유지 안함"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"사용자가 종료하는 즉시 바로 제거"</string> diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml index f28026e1e562..fe44fe066e46 100644 --- a/packages/SettingsLib/res/values-ky/arrays.xml +++ b/packages/SettingsLib/res/values-ky/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Түзмөктүн экраны гана (демейки)"</item> + <item msgid="9161645858025071955">"Тышкы экран"</item> + <item msgid="114384731934682483">"Focus-based"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Көлөкөнү түзмөктүн экранында гана көрсөтүү"</item> + <item msgid="7795034287069726554">"Түзмөктү бир тышкы экранда көрсөтүү"</item> + <item msgid="5280431949814340475">"Түзмөктү акыркы активдүү экранда көрсөтүү"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index db5525202f4c..2d1ea8677934 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Иштеп жатат (сол тарап гана)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Иштеп жатат (оң тарап гана)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Иштеп жатат (сол жана оң)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Жигердүү (медиа үчүн гана). Батарея: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Жигердүү (медиа үчүн гана). Батарея: L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Туташып турат (чогуу уксаңыз болот). Батарея: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Өткөрүү анимацснн шкаласы"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Анимациянын узактыгы"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Көмөкчү экрандардын эмуляциясы"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Көлөкө экранынын абалы"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Колдонмолор"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Аракеттер сакталбасын"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Колдонуучу чыгып кетери менен бардык аракеттер өчүп калат"</string> diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml index 478b5d584a62..d9da45b40f99 100644 --- a/packages/SettingsLib/res/values-lo/arrays.xml +++ b/packages/SettingsLib/res/values-lo/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"ຈໍສະແດງຜົນຂອງອຸປະກອນເທົ່ານັ້ນ (ຄ່າເລີ່ມຕົ້ນ)"</item> + <item msgid="9161645858025071955">"ຈໍສະແດງຜົນພາຍນອກ"</item> + <item msgid="114384731934682483">"ອີງຕາມການໂຟກັສ"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"ສະແດງເສດສີໃນຈໍສະແດງຜົນຂອງອຸປະກອນເທົ່ານັ້ນ"</item> + <item msgid="7795034287069726554">"ສະແດງອຸປະກອນໃນຈໍສະແດງຜົນພາຍນອກເຄື່ອງດຽວ"</item> + <item msgid="5280431949814340475">"ສະແດງອຸປະກອນໃນຈໍສະແດງຜົນທີ່ໂຟກັສຫຼ້າສຸດ"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index f60894b5242a..ec06e5e07e64 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ນຳໃຊ້ຢູ່ (ຊ້າຍເທົ່ານັ້ນ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ນຳໃຊ້ຢູ່ (ຂວາເທົ່ານັ້ນ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ນຳໃຊ້ຢູ່ (ຊ້າຍ ແລະ ຂວາ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ). ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ). ຊ: ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ຂ: ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ). ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ຂະໜາດສະຫຼັບອະນິເມຊັນ"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ໄລຍະເວລາອະນິເມຊັນ"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ຈຳລອງຈໍສະແດງຜົນທີສອງ"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ຕຳແໜ່ງການສະແດງຜົນຂອງເສດສີ"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ແອັບ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ບໍ່ຕ້ອງຮັກສາການເຄື່ອນໄຫວ"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ລຶບທຸກການເຄື່ອນໄຫວທັນທີທີ່ຜູ້ໃຊ້ອອກຈາກມັນ"</string> diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml index 5d3d59628792..cf9b8d870b43 100644 --- a/packages/SettingsLib/res/values-lt/arrays.xml +++ b/packages/SettingsLib/res/values-lt/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Tik įrenginio ekranas (numatytasis nustatymas)"</item> + <item msgid="9161645858025071955">"Išorinis ekranas"</item> + <item msgid="114384731934682483">"Pagal fokusavimą"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Rodyti šešėlį tik įrenginio ekrane"</item> + <item msgid="7795034287069726554">"Rodyti įrenginį viename išoriniame ekrane"</item> + <item msgid="5280431949814340475">"Rodyti įrenginį paskutiniame fokusuotame ekrane"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 2932d21cba56..f0a82e01c896 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktyvus (tik kairiojoje pusėje)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktyvus (tik dešiniojoje pusėje)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktyvus (kairiojoje ir dešiniojoje pusėse)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktyvus (tik medija). Akumuliatorius lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktyvus (tik medija), akumuliatoriaus lygis kairėje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, dešinėje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Prijungta (palaikomas garso įrašų bendrinimas). Akumuliatoriaus lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Animuoto perėjimo mast."</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator. trukmės skalė"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Imituoti antrin. ekranus"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Šešėlio rodymo padėtis"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Programos"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Nesaugoti veiklos"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Sunaikinti visą veiklą, kai naud. iš jos išeina"</string> diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml index 7626c66c6bc8..92d141e1723b 100644 --- a/packages/SettingsLib/res/values-lv/arrays.xml +++ b/packages/SettingsLib/res/values-lv/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Tikai ierīces displejs (noklusējums)"</item> + <item msgid="9161645858025071955">"Ārējais displejs"</item> + <item msgid="114384731934682483">"Saskaņā ar fokusu"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Rādīt ēnu tikai ierīces displejā"</item> + <item msgid="7795034287069726554">"Rādīt ierīci vienā ārējā displejā"</item> + <item msgid="5280431949814340475">"Rādīt ierīci pēdējā fokusētajā displejā"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 2f497fbc76b6..47fe2d952b34 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Ierīce aktīva (tikai kreisā auss)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Ierīce aktīva (tikai labā auss)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Ierīces aktīvas (kreisā un labā auss)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktīvs (tikai multividei). Akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktīvs (tikai multividei). Akumulatora uzlādes līmenis kreisajā austiņā: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, labajā austiņā: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Izveidots savienojums (atbalsta audio kopīgošanu). Akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Pārejas animācijas mērogs"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animācijas ilguma mērogs"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulēt sekundāros ekr."</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Ēnas parādīšanas pozīcija"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Lietotnes"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Nesaglabāt darbības"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Iznīcināt katru darbību, kad lietotājs to pārtrauc"</string> diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml index f1a02bb11da0..8e9bb21ff520 100644 --- a/packages/SettingsLib/res/values-mk/arrays.xml +++ b/packages/SettingsLib/res/values-mk/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Само на екранот на уредот (стандардно)"</item> + <item msgid="9161645858025071955">"Надворешен екран"</item> + <item msgid="114384731934682483">"Засновано на фокус"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Прикажувај сенка само на екранот на уредот"</item> + <item msgid="7795034287069726554">"Прикажувај сенка на еден надворешен екран"</item> + <item msgid="5280431949814340475">"Прикажувај сенка на последниот фокусиран екран"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"стандарден_екран"</item> + <item msgid="774789415968826925">"кој_било_надворешен_екран"</item> + <item msgid="7880769915418638436">"последен_допир_на_статусната_лента"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 54d1ff15481e..a8c8d83e3641 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Активно (само лево)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Активно (само десно)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Активно (лево и десно)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Активно (само аудиовизуелни содржини). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Активно (само аудиовизуелни содржини). Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерија, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерија."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Поврзано (поддржува споделување аудио). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Брзина на преодни анимации"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Брзина на општи анимации"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Симул. секундарен екран"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Позиција на екранот за сенка"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Апликации"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Не чувај активности"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Уништи ја секоја активност штом корисникот ќе ја напушти"</string> diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml index 5e535d36b0a1..4b8dbce2a523 100644 --- a/packages/SettingsLib/res/values-ml/arrays.xml +++ b/packages/SettingsLib/res/values-ml/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"ഉപകരണ ഡിസ്പ്ലേ മാത്രം (ഡിഫോൾട്ട്)"</item> + <item msgid="9161645858025071955">"ബാഹ്യ ഡിസ്പ്ലേ"</item> + <item msgid="114384731934682483">"ഫോക്കസ്-അടിസ്ഥാനമാക്കിയുള്ളത്"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"ഉപകരണ ഡിസ്പ്ലേയിൽ മാത്രം ഷെയ്ഡ് കാണിക്കുക"</item> + <item msgid="7795034287069726554">"ഒരൊറ്റ ബാഹ്യ ഡിസ്പ്ലേയിൽ ഉപകരണം കാണിക്കുക"</item> + <item msgid="5280431949814340475">"അവസാനം ഫോക്കസ് ചെയ്ത ഡിസ്പ്ലേയിൽ ഉപകരണം കാണിക്കുക"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 19c380b50cb8..859c67e62ef5 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"സജീവമാണ് (ഇടതുഭാഗത്ത് മാത്രം)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"സജീവമാണ് (വലതുഭാഗത്ത് മാത്രം)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"സജീവമാണ് (ഇടതുഭാഗത്തും വലതുഭാഗത്തും)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"സജീവം (മീഡിയ മാത്രം). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"സജീവം (മീഡിയ മാത്രം). ഇടതുവശത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ബാറ്ററി, വലതുവശത്ത്: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ബാറ്ററി."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ട്രാൻസിഷൻ ആനിമേഷൻ സ്കെയിൽ"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ആനിമേറ്റർ ദൈർഘ്യ സ്കെയിൽ"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"രണ്ടാം ഡിസ്പ്ലേകൾ പ്രവർത്തിപ്പിക്കുക"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ഷെയ്ഡ് ഡിസ്പ്ലേ സ്ഥാനം"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ആപ്പുകൾ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"പ്രവർത്തനങ്ങൾ സൂക്ഷിക്കരുത്"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ഉപയോക്താവ് ഉപേക്ഷിക്കുന്നതിനനുസരിച്ച് എല്ലാ പ്രവർത്തനങ്ങളും നശിപ്പിക്കുക"</string> diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml index 84c707f0eee8..5d5b8f9af59c 100644 --- a/packages/SettingsLib/res/values-mn/arrays.xml +++ b/packages/SettingsLib/res/values-mn/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Зөвхөн төхөөрөмжийн дэлгэц (өгөгдмөл)"</item> + <item msgid="9161645858025071955">"Гаднын дэлгэц"</item> + <item msgid="114384731934682483">"Төвлөрөлд тулгуурласан"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Зөвхөн төхөөрөмж дээрх дэлгэцэд сүүдрийг харуулах"</item> + <item msgid="7795034287069726554">"Зөвхөн гаднын нэг дэлгэц дээр төхөөрөмжийг харуулах"</item> + <item msgid="5280431949814340475">"Сүүлд төвлөрсөн дэлгэц дээр төхөөрөмжийг харуулах"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 0e3408e1c5de..c61bcde5e3df 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Идэвхтэй (зөвхөн зүүн тал)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Идэвхтэй (зөвхөн баруун тал)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Идэвхтэй (зүүн, баруун тал)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Идэвхтэй (зөвхөн медиа). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батарей."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Идэвхтэй (зөвхөн медиа). З: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Б: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батарей."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Холбогдсон (аудио хуваалцахыг дэмждэг). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батарей."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Шилжилтийн анимацийн масштаб"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Анимацийн хугацааны масштаб"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Хоёр дахь дэлгэцийн симуляци хийх"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Сүүдрийн дэлгэцийн байрлал"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Апп"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Үйлдлүүдийг хадгалахгүй"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Үйлдэл бүрийг хэрэглэгч орхимогц нь устгах"</string> diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml index 9286e77891c6..2fd20581b248 100644 --- a/packages/SettingsLib/res/values-mr/arrays.xml +++ b/packages/SettingsLib/res/values-mr/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"फक्त डिव्हाइस डिस्प्ले (डीफॉल्ट)"</item> + <item msgid="9161645858025071955">"बाह्य डिस्प्ले"</item> + <item msgid="114384731934682483">"फोकसवर आधारित"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"फक्त डिव्हाइस डिस्प्लेवर शेड दाखवा"</item> + <item msgid="7795034287069726554">"एकल बाह्य डिस्प्लेवर डिव्हाइस दाखवा"</item> + <item msgid="5280431949814340475">"शेवटच्या फोकस केलेल्या डिस्प्लेवर डिव्हाइस दाखवा"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 9b7c99c7fd61..654b447f89cd 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"अॅक्टिव्ह आहे (फक्त डावे)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"अॅक्टिव्ह आहे (फक्त उजवे)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"अॅक्टिव्ह आहे (डावे आणि उजवे)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"अॅक्टिव्ह आहे (फक्त मीडिया). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"ॲक्टिव्ह आहे (फक्त मीडिया). डावीकडे: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, उजवीकडे: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ट्रांझिशन ॲनिमेशन स्केल"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ॲनिमेटर कालावधी स्केल"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"दुय्यम डिस्प्ले सिम्युलेट करा"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"शेड डिस्प्लेशी संबंधित स्थिती"</string> <string name="debug_applications_category" msgid="5394089406638954196">"अॅप्स"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ॲक्टिव्हिटी ठेवू नका"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"वापरकर्त्याने प्रत्येक ॲक्टिव्हिटी सोडताच ती नष्ट करा"</string> diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml index a159282214c4..7b6cbe17b5d0 100644 --- a/packages/SettingsLib/res/values-ms/arrays.xml +++ b/packages/SettingsLib/res/values-ms/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Paparan peranti sahaja (Lalai)"</item> + <item msgid="9161645858025071955">"Paparan luaran"</item> + <item msgid="114384731934682483">"Berasaskan fokus"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Tunjukkan rona warna pada paparan peranti sahaja"</item> + <item msgid="7795034287069726554">"Tunjukkan peranti pada satu paparan luaran"</item> + <item msgid="5280431949814340475">"Tunjukkan peranti pada paparan terakhir yang difokuskan"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 7c5d3f7599b9..fcb5d6ef7ebb 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktif (kiri sahaja)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktif (kanan sahaja)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktif (kiri dan kanan)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktif (media sahaja). Bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktif (media sahaja), L: Bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: Bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Disambungkan (menyokong perkongsian audio). Bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animasi peralihan"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala tempoh juruanimasi"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulasikan paparan kedua"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Kedudukan paparan rona warna"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikasi"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Jangan simpan aktiviti"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Hapus aktiviti selepas ditinggalkan oleh pengguna"</string> diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml index e795689b1dc8..71a1c7c5649b 100644 --- a/packages/SettingsLib/res/values-my/arrays.xml +++ b/packages/SettingsLib/res/values-my/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"စက်ဖန်သားပြင် သီးသန့် (မူရင်း)"</item> + <item msgid="9161645858025071955">"ပြင်ပဖန်သားပြင်"</item> + <item msgid="114384731934682483">"ပြသမှုအခြေပြု"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"စက်ဖန်သားပြင်တွင်သာ အရိပ်ပြပါ"</item> + <item msgid="7795034287069726554">"ပြင်ပဖန်သားပြင်တစ်ခုတွင် စက်ကိုပြပါ"</item> + <item msgid="5280431949814340475">"နောက်ဆုံးပြသထားသော ဖန်သားပြင်တွင် စက်ကိုပြပါ"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"မူရင်းဖန်သားပြင်"</item> + <item msgid="774789415968826925">"မည်သည့်ပြင်ပဖန်သားပြင်မဆို"</item> + <item msgid="7880769915418638436">"အခြေအနေပြဘား နောက်ဆုံးထိတွေ့မှု"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 0bd6ca6c2b27..4826c49679e6 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"သုံးနေသည် (ဘယ်ဘက်သီးသန့်)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"သုံးနေသည် (ညာဘက်သီးသန့်)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"သုံးနေသည် (ဘယ်နှင့်ညာ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"အသုံးပြုနေသည် (မီဒီယာသီးသန့်)။ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>။"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"အသုံးပြုနေသည် (မီဒီယာသီးသန့်)။ ဘက်ထရီ L- <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>၊ R- <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>။"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)။ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>။"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"သက်ဝင်အသွင်ပြောင်းခြင်း"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"လှုပ်ရှားမှုကြာချိန်စကေး"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ဆင့်ပွားမျက်နှာပြင် အသွင်ဆောင်ခြင်း"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"အရိပ်ပြကွက် တည်နေရာ"</string> <string name="debug_applications_category" msgid="5394089406638954196">"အက်ပ်များ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ဆောင်ရွက်မှုများကို သိမ်းမထားပါနှင့်"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"သုံးသူထွက်သွားသည်နှင့် လုပ်ဆောင်ချက်များ ဖျက်ရန်"</string> diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml index c456ae186c02..8d52693a5f16 100644 --- a/packages/SettingsLib/res/values-nb/arrays.xml +++ b/packages/SettingsLib/res/values-nb/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Bare enhetsskjermen (standard)"</item> + <item msgid="9161645858025071955">"Ekstern skjerm"</item> + <item msgid="114384731934682483">"Fokusbasert"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Vis skyggen bare på enhetsskjermen"</item> + <item msgid="7795034287069726554">"Vis enheten på én ekstern skjerm"</item> + <item msgid="5280431949814340475">"Vis enheten på den sist fokuserte skjermen"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"Standardskjerm"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index ab14606b695c..e7be3c942de9 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktiv (bare venstre)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktiv (bare høyre)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktiv (venstre og høyre)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktiv (bare medieinnhold) <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiv (bare medieinnhold). V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batteri, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Tilkoblet (støtter lyddeling). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Animasjonsskala for overgang"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Varighetsskala for animasjoner"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulering av sekundærskjermer"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Plassering av skyggeskjermen"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apper"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ikke behold aktiviteter"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Fjern hver aktivitet så fort brukeren forlater den"</string> diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml index d2c3729ea9c1..cd8448f684dd 100644 --- a/packages/SettingsLib/res/values-ne/arrays.xml +++ b/packages/SettingsLib/res/values-ne/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"२"</item> <item msgid="4779928470672877922">"३"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"डिभाइसको डिस्प्ले मात्र (डिफल्ट)"</item> + <item msgid="9161645858025071955">"बाह्य डिस्प्ले"</item> + <item msgid="114384731934682483">"फोकसमा आधारित"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"यो सेड डिभाइसकै डिस्प्लेमा मात्र देखाउनुहोस्"</item> + <item msgid="7795034287069726554">"यो डिभाइस एकल बाह्य डिस्प्लेमा देखाउनुहोस्"</item> + <item msgid="5280431949814340475">"यो डिभाइस पछिल्लो पटक फोकस गरिएको डिस्प्लेमा देखाउनुहोस्"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 50665f6f7897..0478d9c8a923 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"सक्रिय छ (बायाँ मात्र)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"सक्रिय छ (दायाँ मात्र)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"सक्रिय छ (दायाँ र बायाँ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"सक्रिय छ (मिडिया मात्र)। <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ब्याट्री।"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"सक्रिय छ (मिडिया मात्र)। बायाँ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, दायाँ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ब्याट्री।"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ)। <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ब्याट्री।"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"संक्रमण एनिमेसन स्केल"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"एनिमेसनको अवधि मापन"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"सहायक डिस्प्लेको नक्कल गर्नुहोस्"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"सेड देखाइने स्थिति"</string> <string name="debug_applications_category" msgid="5394089406638954196">"एपहरू"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"गतिविधि नराखियोस्"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"प्रयोगकर्ता कुनै गतिविधिबाट बाहिरिने बित्तिकै उक्त गतिविधि अन्त्य गर्नुहोस्"</string> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index 4451c93c86dd..d92b806acf49 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Alleen apparaatscherm (standaard)"</item> + <item msgid="9161645858025071955">"Extern scherm"</item> + <item msgid="114384731934682483">"Op focus gebaseerd"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Alleen paneel tonen op apparaatscherm"</item> + <item msgid="7795034287069726554">"Apparaat tonen op één extern scherm"</item> + <item msgid="5280431949814340475">"Apparaat tonen op laatste gefocuste scherm"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 035c2d9e759d..bae7bb9ffda0 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Actief (alleen links)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Actief (alleen rechts)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Actief (links en rechts)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Actief (alleen media). Batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Actief (alleen media), L: batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Verbonden (ondersteunt audio delen), batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Overgangsanimatieschaal"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Duur van animatieschaal"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Secundaire displays simuleren"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Positie van paneelweergave"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Activiteiten niet opslaan"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Wis activiteit zodra de gebruiker ermee stopt"</string> diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml index 37e5071fa85f..f9beb8afd4d0 100644 --- a/packages/SettingsLib/res/values-or/arrays.xml +++ b/packages/SettingsLib/res/values-or/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"କେବଳ ଡିଭାଇସ ଡିସପ୍ଲେ (ଡିଫଲ୍ଟ)"</item> + <item msgid="9161645858025071955">"ଏକ୍ସଟର୍ନଲ ଡିସପ୍ଲେ"</item> + <item msgid="114384731934682483">"ଫୋକସ-ଆଧାରିତ"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"କେବଳ ଡିଭାଇସରେ ଡିସପ୍ଲେ ସେଡ ଦେଖାନ୍ତୁ"</item> + <item msgid="7795034287069726554">"ସିଙ୍ଗଲ ଏକ୍ସଟର୍ନଲ ଡିସପ୍ଲେରେ ଡିଭାଇସ ଦେଖାନ୍ତୁ"</item> + <item msgid="5280431949814340475">"ଫୋକସ କରାଯାଇଥିବା ଗତ ଡିସପ୍ଲେରେ ଡିଭାଇସ ଦେଖାନ୍ତୁ"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 894273703dca..7b8f3ccce52d 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ସକ୍ରିୟ (କେବଳ ବାମ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ସକ୍ରିୟ (କେବଳ ଡାହାଣ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ସକ୍ରିୟ (ବାମ ଏବଂ ଡାହାଣ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"ସକ୍ରିୟ (କେବଳ ମିଡିଆ)। <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବେଟେରୀ।"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"ସକ୍ରିୟ (କେବଳ ମିଡିଆ)। ବାମ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ଡାହାଣ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ବେଟେରୀ।"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"କନେକ୍ଟ କରାଯାଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସପୋର୍ଟ କରେ)। <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବେଟେରୀ।"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ଟ୍ରାଞ୍ଜିସନ୍ ଆନିମେସନ୍ ସ୍କେଲ୍"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ଆନିମେଟର୍ ଅବଧି ସ୍କେଲ୍"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ସେକେଣ୍ଡାରୀ ଡିସ୍ପ୍ଲେ ସିମୁଲେଟ୍ କରନ୍ତୁ"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ସେଡ ଡିସପ୍ଲେ ସ୍ଥିତି"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ଆପ୍ସ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"କାର୍ଯ୍ୟକଳାପଗୁଡ଼ିକୁ ରଖନ୍ତୁ ନାହିଁ"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ୟୁଜର୍ ଏହାକୁ ଛାଡ଼ିବା କ୍ଷଣି ସମସ୍ତ କାର୍ଯ୍ୟକଳାପ ନଷ୍ଟ କରିଦିଅନ୍ତୁ"</string> diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml index 3cb0f50cce2b..1e7f05512d33 100644 --- a/packages/SettingsLib/res/values-pa/arrays.xml +++ b/packages/SettingsLib/res/values-pa/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"ਸਿਰਫ਼ ਡੀਵਾਈਸ ਦੀ ਡਿਸਪਲੇ (ਪੂਰਵ-ਨਿਰਧਾਰਿਤ)"</item> + <item msgid="9161645858025071955">"ਬਾਹਰੀ ਡਿਸਪਲੇ"</item> + <item msgid="114384731934682483">"ਫੋਕਸ-ਆਧਾਰਿਤ"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"ਸਿਰਫ਼ ਡੀਵਾਈਸ ਦੀ ਡਿਸਪਲੇ \'ਤੇ ਸ਼ੇਡ ਦਿਖਾਓ"</item> + <item msgid="7795034287069726554">"ਇਕਹਿਰੀ ਬਾਹਰੀ ਡਿਸਪਲੇ \'ਤੇ ਡੀਵਾਈਸ ਦਿਖਾਓ"</item> + <item msgid="5280431949814340475">"ਫੋਕਸ ਕੀਤੀ ਗਈ ਪਿਛਲੀ ਡਿਸਪਲੇ \'ਤੇ ਡੀਵਾਈਸ ਦਿਖਾਓ"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 14e87aa68f04..7e2a50f96a7b 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਖੱਬਾ)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਸੱਜਾ)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ਕਿਰਿਆਸ਼ੀਲ (ਖੱਬਾ ਅਤੇ ਸੱਜਾ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ)। <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ਬੈਟਰੀ।"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ)। ਖੱਬੇ ਪਾਸੇ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ਸੱਜੇ ਪਾਸੇ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ਬੈਟਰੀ।"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)। <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ਬੈਟਰੀ।"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ਟ੍ਰਾਂਜ਼ਿਸ਼ਨ ਐਨੀਮੇਸ਼ਨ ਸਕੇਲ"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"ਐਨੀਮੇਟਰ ਮਿਆਦ ਸਕੇਲ"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ ਨੂੰ ਸਿਮੂਲੇਟ ਕਰੋ"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ਸ਼ੇਡ ਦਿਖਣ ਦੀ ਸਥਿਤੀ"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ਐਪਾਂ"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ਸਰਗਰਮੀਆਂ ਨਾ ਰੱਖੋ"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ਹਰੇਕ ਸਰਗਰਮੀ ਨਸ਼ਟ ਕਰੋ, ਜਿਵੇਂ ਹੀ ਵਰਤੋਂਕਾਰ ਇਸਨੂੰ ਛੱਡੇ"</string> diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml index 9c25aaa41b63..a9892b3688c8 100644 --- a/packages/SettingsLib/res/values-pl/arrays.xml +++ b/packages/SettingsLib/res/values-pl/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Tylko wyświetlanie na urządzeniu (domyślnie)"</item> + <item msgid="9161645858025071955">"Wyświetlacz zewnętrzny"</item> + <item msgid="114384731934682483">"Na podstawie zaznaczenia"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Pokaż cień tylko na wyświetlaczu urządzenia"</item> + <item msgid="7795034287069726554">"Pokaż urządzenie na pojedynczym wyświetlaczu zewnętrznym"</item> + <item msgid="5280431949814340475">"Pokaż urządzenie na ostatnim aktywnym wyświetlaczu"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index eaa12bd004a0..397cb82061cd 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktywne (tylko lewa strona)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktywne (tylko prawa strona)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktywne (lewa i prawa strona)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktywne (tylko multimedia). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naładowania baterii."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktywne (tylko multimedia), lewa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, prawa: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> naładowania baterii."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Połączone (obsługa udostępniania dźwięku), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naładowania baterii."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala animacji przejścia"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Skala długości animacji"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Symuluj ekrany dodatkowe"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Pozycja wyświetlania cienia"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikacje"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Nie zachowuj działań"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Przerwij każde działanie, gdy użytkownik je porzuci"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml index bb18c4719c72..35aa3b0834c3 100644 --- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Somente a tela do dispositivo (padrão)"</item> + <item msgid="9161645858025071955">"Tela externa"</item> + <item msgid="114384731934682483">"Com base no foco"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Mostrar sombra apenas na tela do dispositivo"</item> + <item msgid="7795034287069726554">"Mostrar o dispositivo em uma única tela externa"</item> + <item msgid="5280431949814340475">"Mostrar o dispositivo na última tela focada"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index afa7129db3b7..273c84d66824 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Ativo (apenas o esquerdo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Ativo (apenas o direito)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Ativo (esquerdo e direito)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Ativo (apenas mídia). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Ativo (apenas mídia). Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria. Lado direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Conectado (aceita compartilhamento de áudio). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala anim. de transição"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala duração Animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simular telas secundárias"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posição da sombra do dispositivo"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Não manter atividades"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destruir todas as atividades quando o usuário sair"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index 50a90ebdd7bd..2f870bfac3d8 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Apenas no ecrã do dispositivo (predefinição)"</item> + <item msgid="9161645858025071955">"Ecrã externo"</item> + <item msgid="114384731934682483">"Com base no foco"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Mostrar a sombra apenas no ecrã do dispositivo"</item> + <item msgid="7795034287069726554">"Mostrar o dispositivo num único ecrã externo"</item> + <item msgid="5280431949814340475">"Mostrar o dispositivo no último ecrã focado"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 986467a5df9c..9d56b4330985 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -110,6 +110,7 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Ativo (apenas esquerdo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Ativo (apenas direito)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Ativo (esquerdo e direito)"</string> + <string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"Não foi possível atualizar o ambiente"</string> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Ativo (apenas para multimédia). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Ativo (apenas para multimédia). E: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria. D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Ligado (suporta partilha de áudio). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria."</string> @@ -423,6 +424,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala de animação de transição"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala de duração de animação"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simular apresentações secundárias"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posição da sombra no ecrã"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Não manter atividades"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destruir atividades assim que o utilizador sair"</string> diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml index bb18c4719c72..35aa3b0834c3 100644 --- a/packages/SettingsLib/res/values-pt/arrays.xml +++ b/packages/SettingsLib/res/values-pt/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Somente a tela do dispositivo (padrão)"</item> + <item msgid="9161645858025071955">"Tela externa"</item> + <item msgid="114384731934682483">"Com base no foco"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Mostrar sombra apenas na tela do dispositivo"</item> + <item msgid="7795034287069726554">"Mostrar o dispositivo em uma única tela externa"</item> + <item msgid="5280431949814340475">"Mostrar o dispositivo na última tela focada"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index afa7129db3b7..273c84d66824 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Ativo (apenas o esquerdo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Ativo (apenas o direito)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Ativo (esquerdo e direito)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Ativo (apenas mídia). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Ativo (apenas mídia). Lado esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> de bateria. Lado direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> de bateria."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Conectado (aceita compartilhamento de áudio). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Escala anim. de transição"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Escala duração Animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simular telas secundárias"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posição da sombra do dispositivo"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Não manter atividades"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Destruir todas as atividades quando o usuário sair"</string> diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index c29a75284aea..dba734c588aa 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Numai pe ecranul dispozitivului (prestabilit)"</item> + <item msgid="9161645858025071955">"Ecran extern"</item> + <item msgid="114384731934682483">"În funcție de focalizare"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Afișează umbra doar pe ecranul dispozitivului"</item> + <item msgid="7795034287069726554">"Afișează dispozitivul pe un singur ecran extern"</item> + <item msgid="5280431949814340475">"Afișează dispozitivul pe ultimul ecran focalizat"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index b64047c5e13b..1d77583d02e2 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Activ (numai stânga)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Activ (numai dreapta)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Activ (stânga și dreapta)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Activ (numai pentru conținut media). Nivelul bateriei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Activ (numai pentru conținut media): nivelul bateriei din stânga: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, nivelul bateriei din dreapta: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Conectat (acceptă permiterea accesului la audio). Nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Scară tranziție animații"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Scară durată Animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulează afișaje secundare"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Poziția de afișare a umbrei"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplicații"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Nu păstra activitățile"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Elimină activitățile imediat ce utilizatorul le închide"</string> diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml index e26b1a623bcb..f0782eb04b7e 100644 --- a/packages/SettingsLib/res/values-ru/arrays.xml +++ b/packages/SettingsLib/res/values-ru/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Только экран устройства (по умолчанию)"</item> + <item msgid="9161645858025071955">"Внешний дисплей"</item> + <item msgid="114384731934682483">"Активный дисплей"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Показывать тень только на экране устройства"</item> + <item msgid="7795034287069726554">"Показывать устройство на одном внешнем дисплее"</item> + <item msgid="5280431949814340475">"Показывать устройство на последнем активном дисплее"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 8c9ecb11b086..d69778034323 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Используется (только левый)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Используется (только правый)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Используется (левый и правый)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Используется (только для медиа), заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Используется (только для медиа), заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (Л), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (П)."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Подключено (поддерживается отправка аудио), заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Анимация переходов"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Длительность анимации"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Эмуляция доп. экранов"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Положение тени"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Приложения"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Вытеснение фоновых Activity"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Удалять все Activity после выхода пользователя"</string> diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml index dea89e5de1b0..855bbc9842a8 100644 --- a/packages/SettingsLib/res/values-si/arrays.xml +++ b/packages/SettingsLib/res/values-si/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"උපාංග සංදර්ශකය පමණි (පෙරනිමි)"</item> + <item msgid="9161645858025071955">"බාහිර සංදර්ශකය"</item> + <item msgid="114384731934682483">"නාභිගත කිරීම-පාදක"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"උපාංග සංදර්ශකයේ පමණක් සෙවන පෙන්වන්න"</item> + <item msgid="7795034287069726554">"උපාංගය තනි බාහිර සංදර්ශකයක පෙන්වන්න"</item> + <item msgid="5280431949814340475">"අවසන් වරට නාභිගත කළ සංදර්ශකයේ උපාංගය පෙන්වන්න"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 6c9abfb949f5..df22ba72518d 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"සක්රිය (වම පමණි)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"සක්රිය (දකුණ පමණි)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"සක්රිය (වම සහ දකුණ)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"ක්රියාත්මකයි (මාධ්ය පමණයි). බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"ක්රියාත්මකයි (මාධ්ය පමණයි), බැටරිය ව: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ද: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීමට සහය දක්වයි). බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"සංක්රමණ සජීවන පරිමාණය"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"සජීවක කාල පරාස පරිමාණය"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ද්විතියික දර්ශනය අඟවන්න"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"සෙවන සංදර්ශක ස්ථානය"</string> <string name="debug_applications_category" msgid="5394089406638954196">"යෙදුම්"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ක්රියාකාරකම් තබාගන්න එපා"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"පරිශීලකයා ඉවත් වුන විගසම සෑම ක්රියාකාරකමක්ම විනාශ කරන්න"</string> diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml index 12adda5234af..3473e282e59c 100644 --- a/packages/SettingsLib/res/values-sk/arrays.xml +++ b/packages/SettingsLib/res/values-sk/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Iba obrazovka zariadenia (predvolené)"</item> + <item msgid="9161645858025071955">"Externá obrazovka"</item> + <item msgid="114384731934682483">"Na základe označenia"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Zobraziť panel iba na obrazovke zariadenia"</item> + <item msgid="7795034287069726554">"Zobraziť zariadenie na jednej externej obrazovke"</item> + <item msgid="5280431949814340475">"Zobraziť zariadenie na poslednej označenej obrazovke"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 05c744234204..7af38252c8f9 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktívne (iba ľavé)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktívne (iba pravé)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktívne (ľavé aj pravé)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktívne (iba médiá). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktívne (iba médiá). Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Pripojené (podporuje zdieľanie zvuku). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Mierka animácie premeny"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Mierka dĺžky animácie"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulovať sekundárne obrazovky"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Umiestnenie zobrazenia panela"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikácie"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Neuchovávať aktivity"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Zničiť každú aktivitu, hneď ako ju používateľ ukončí"</string> diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml index bd35c825e138..c3bf79c34ea6 100644 --- a/packages/SettingsLib/res/values-sl/arrays.xml +++ b/packages/SettingsLib/res/values-sl/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Prikaz samo v napravi (privzeto)"</item> + <item msgid="9161645858025071955">"Zunanji zaslon"</item> + <item msgid="114384731934682483">"Na podlagi fokusa"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Prikaz podokna samo na zaslonu naprave"</item> + <item msgid="7795034287069726554">"Prikaz naprave na enem zunanjem zaslonu"</item> + <item msgid="5280431949814340475">"Prikaz naprave na zadnjem zaslonu s fokusom"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index c0e4f811bd54..e82feb4674d9 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktivno (samo levo)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktivno (samo desno)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktivno (levo in desno)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktivno (samo predstavnost). Baterija: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktivno (samo predstavnost), baterija – L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Povezano (podpira deljenje zvoka), baterija: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Merilo animacije prehoda"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Merilo trajanja animacije"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuliraj sekundarne zaslone"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Položaj prikaza podokna"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikacije"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ne obdrži dejavnosti"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Uniči vsako dejavnost, ko uporabnik preneha z njo."</string> diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml index bd03199ff6d1..7136bf75eaee 100644 --- a/packages/SettingsLib/res/values-sq/arrays.xml +++ b/packages/SettingsLib/res/values-sq/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Vetëm ekrani i pajisjes (parazgjedhja)"</item> + <item msgid="9161645858025071955">"Ekrani i jashtëm"</item> + <item msgid="114384731934682483">"Bazuar te fokusi"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Shfaq hijen vetëm në ekranin e pajisjes"</item> + <item msgid="7795034287069726554">"Shfaq pajisjen në një ekran të vetëm të jashtëm"</item> + <item msgid="5280431949814340475">"Shfaq pajisjen në ekranin e fundit të fokusuar"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 2676d0ee083c..f8573098175f 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktive (vetëm majtas)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktive (vetëm djathtas)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktive (majtas dhe djathtas)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktiv (vetëm për media). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiv (vetëm për media). Majtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> bateri, djathtas: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> bateri."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Lidhur (mbështet ndarjen e audios). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> bateri."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Animacioni kalimtar"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Kohëzgjatja e animatorit"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulo ekranet dytësore"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Pozicioni i shfaqjes së hijes"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Aplikacionet"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Mos i ruaj aktivitetet"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Fshi çdo aktivitet sapo të largohet përdoruesi"</string> diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml index 1ee7fc09f5e6..84d0a7e055c1 100644 --- a/packages/SettingsLib/res/values-sr/arrays.xml +++ b/packages/SettingsLib/res/values-sr/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Приказ само на уређају (подразумевано)"</item> + <item msgid="9161645858025071955">"Спољни екран"</item> + <item msgid="114384731934682483">"Засновано на фокусу"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Прикажи сенку само на екрану уређаја"</item> + <item msgid="7795034287069726554">"Прикажи уређај на једном спољном екрану"</item> + <item msgid="5280431949814340475">"Прикажи уређај на последњем екрану у фокусу"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 8fce0a0bc6c7..ad15dd4eda3c 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Активно (само лево)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Активно (само десно)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Активно (лево и десно)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Активно (само за медије). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерије."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Активно (само за медије). Лево: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, десно: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерије."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Повезано (подржава дељење звука), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерије."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Размера анимације прелаза"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Аниматорова размера трајања"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Симулирај секундарне екране"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Положај сенке на екрану"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Апликације"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Не чувај активности"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Уништава сваку активност чим је корисник напусти"</string> diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml index 3a344ce2325b..c69f01e8691c 100644 --- a/packages/SettingsLib/res/values-sv/arrays.xml +++ b/packages/SettingsLib/res/values-sv/arrays.xml @@ -288,4 +288,15 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <!-- no translation found for shade_display_awareness_entries:0 (816770658383209617) --> + <!-- no translation found for shade_display_awareness_entries:1 (9161645858025071955) --> + <!-- no translation found for shade_display_awareness_entries:2 (114384731934682483) --> + <!-- no translation found for shade_display_awareness_summaries:0 (2964753205732912921) --> + <!-- no translation found for shade_display_awareness_summaries:1 (7795034287069726554) --> + <!-- no translation found for shade_display_awareness_summaries:2 (5280431949814340475) --> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index c7ce0f8b4c2a..7f172dbefe7c 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktiv (endast vänster)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktiv (endast höger)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktiv (vänster och höger)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktiv (endast media). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktiv (endast media). V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, H: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batteri."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Ansluten (ljuddelning stöds). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri."</string> @@ -423,6 +425,8 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala – övergångsanimering"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Längdskala för Animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulera sekundär skärm"</string> + <!-- no translation found for shade_display_awareness_title (8000009404669495876) --> + <skip /> <string name="debug_applications_category" msgid="5394089406638954196">"Appar"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Behåll inte aktiviteter"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Förstör aktiviteter så fort användaren lämnar dem"</string> diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml index a75c6f907da9..145b56c354cf 100644 --- a/packages/SettingsLib/res/values-sw/arrays.xml +++ b/packages/SettingsLib/res/values-sw/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Kwenye skrini ya kifaa pekee (Chaguomsingi)"</item> + <item msgid="9161645858025071955">"Skrini ya nje"</item> + <item msgid="114384731934682483">"Inayoangaziwa"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Onyesha kiwango kwenye skrini ya kifaa pekee"</item> + <item msgid="7795034287069726554">"Onyesha kifaa kwenye skrini moja ya nje"</item> + <item msgid="5280431949814340475">"Onyesha kifaa kwenye skrini ya mwisho iliyoangaziwa"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 3bee28aae4ee..bf95f4e0e8f7 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Inatumika (kushoto pekee)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Inatumika (kulia pekee)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Inatumika (kushoto na kulia)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Inatumika (maudhui pekee). Chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Inatumika (maudhui pekee), Kushoto: chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Kulia: chaji ya betri imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja). Chaji imefika <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Mageuzi ya kipimo cha uhuishaji"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Mizani ya muda wa uhuishaji"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Iga maonyesho mbadala"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Nafasi ya kiwango kwenye skrini"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Programu"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Usihifadhi shughuli"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Haribu kila shughuli pindi tu mtumiaji anapoondoka"</string> diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml index ade1db0a9398..68812894386b 100644 --- a/packages/SettingsLib/res/values-ta/arrays.xml +++ b/packages/SettingsLib/res/values-ta/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"சாதனக் காட்சி மட்டும் (இயல்பு)"</item> + <item msgid="9161645858025071955">"வெளிப்புறக் காட்சி"</item> + <item msgid="114384731934682483">"ஃபோகஸ் அடிப்படையிலானது"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"சாதனக் காட்சியில் மட்டும் ஷேடைக் காட்டும்"</item> + <item msgid="7795034287069726554">"ஒற்றை வெளிப்புறக் காட்சியில் சாதனத்தைக் காட்டும்"</item> + <item msgid="5280431949814340475">"கடைசியாக ஃபோகஸ் செய்யப்பட்ட காட்சியில் சாதனத்தைக் காட்டும்"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 289947ee2e77..24c2244f6052 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"செயலில் உள்ளது (இடதுபுறம் மட்டும்)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"செயலில் உள்ளது (வலதுபுறம் மட்டும்)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"செயலில் உள்ளது (இடது மற்றும் வலதுபுறம்)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"செயலிலுள்ளது (மீடியா மட்டும்). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> பேட்டரி."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"செயலிலுள்ளது (மீடியா மட்டும்). இடது பேட்டரி: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, வலது பேட்டரி: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> பேட்டரி."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"அனிமேஷன் மாற்றத்தின் வேகம்"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"அனிமேட்டர் கால அளவு"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"இரண்டாம்நிலைக் காட்சிகளை உருவகப்படுத்து"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ஷேட் காட்சியின் நிலை"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ஆப்ஸ்"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"செயல்பாடுகளை வைத்திருக்காதே"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"பயனர் வெளியேறியதும் செயல்பாடுகளை நீக்கும்"</string> diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml index fd125b2bf701..c18d771e9399 100644 --- a/packages/SettingsLib/res/values-te/arrays.xml +++ b/packages/SettingsLib/res/values-te/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"పరికర డిస్ప్లేలో మాత్రమే (ఆటోమేటిక్ సెట్టింగ్)"</item> + <item msgid="9161645858025071955">"ఎక్స్టర్నల్ డిస్ప్లే"</item> + <item msgid="114384731934682483">"ఫోకస్-ఆధారిత"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"షేడ్ను పరికర డిస్ప్లేలో మాత్రమే చూపండి"</item> + <item msgid="7795034287069726554">"పరికరాన్ని ఒక ఎక్స్టర్నల్ డిస్ప్లేలో మాత్రమే చూపండి"</item> + <item msgid="5280431949814340475">"పరికరాన్ని ఫోకస్ చేసిన చివరి డిస్ప్లేలో మాత్రమే చూపండి"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index d6683bb293c1..abee83647fea 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"యాక్టివ్గా ఉంది (ఎడమ వైపు మాత్రమే)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"యాక్టివ్గా ఉంది (కుడి వైపు మాత్రమే)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"యాక్టివ్గా ఉంది (ఎడమ వైపు, కుడి వైపు)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"యాక్టివ్ (మీడియా మాత్రమే). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> బ్యాటరీ."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"యాక్టివ్ (మీడియా మాత్రమే). ఎడమ వైపు: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> బ్యాటరీ, కుడివైపు: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> బ్యాటరీ."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> బ్యాటరీ."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ట్రాన్సిషన్ యానిమేషన్ స్కేల్"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"యానిమేటర్ వ్యవధి స్కేల్"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ఇతర డిస్ప్లేలను సిమ్యులేట్ చేయండి"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"షేడ్ డిస్ప్లే స్థానం"</string> <string name="debug_applications_category" msgid="5394089406638954196">"యాప్లు"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"యాక్టివిటీస్ను ఉంచవద్దు"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"యూజర్ నిష్క్రమించాక పూర్తి యాక్టివిటీని తొలగించండి"</string> diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml index bf73a22b1b72..11cb2ec4e161 100644 --- a/packages/SettingsLib/res/values-th/arrays.xml +++ b/packages/SettingsLib/res/values-th/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"จอแสดงผลของอุปกรณ์เท่านั้น (ค่าเริ่มต้น)"</item> + <item msgid="9161645858025071955">"จอแสดงผลภายนอก"</item> + <item msgid="114384731934682483">"Focus-based"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"แสดงเฉดสีในจอแสดงผลของอุปกรณ์เท่านั้น"</item> + <item msgid="7795034287069726554">"แสดงอุปกรณ์ในจอแสดงผลภายนอกเครื่องเดียว"</item> + <item msgid="5280431949814340475">"แสดงอุปกรณ์ในจอแสดงผลที่โฟกัสล่าสุด"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 6095c5009ef5..f8f6af2a5c50 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ใช้งานอยู่ (เฉพาะข้างซ้าย)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ใช้งานอยู่ (เฉพาะข้างขวา)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ใช้งานอยู่ (ข้างซ้ายและขวา)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"ใช้งานอยู่ (สื่อเท่านั้น) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"ใช้งานอยู่ (สื่อเท่านั้น) แบตเตอรี่ข้างซ้าย: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, ข้างขวา: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"เชื่อมต่อแล้ว (รองรับการแชร์เสียง) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"อัตราการเคลื่อนไหวของการเปลี่ยนภาพ"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"อัตราความเร็วตามตัวสร้างภาพเคลื่อนไหว"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"จำลองจอแสดงผลรอง"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"ตำแหน่งการแสดงผลของเฉดสี"</string> <string name="debug_applications_category" msgid="5394089406638954196">"แอปพลิเคชัน"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"ไม่เก็บกิจกรรม"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ล้างทุกกิจกรรมทันทีที่ผู้ใช้ออกไป"</string> diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml index 94436aa3f6d3..eae269cc4972 100644 --- a/packages/SettingsLib/res/values-tl/arrays.xml +++ b/packages/SettingsLib/res/values-tl/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Display ng device lang (Default)"</item> + <item msgid="9161645858025071955">"External na display"</item> + <item msgid="114384731934682483">"Focus-based"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Ipakita ang shade sa display ng device lang"</item> + <item msgid="7795034287069726554">"Ipakita ang device sa isang external na display"</item> + <item msgid="5280431949814340475">"Ipakita ang device sa huling na-focus na display"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 4eb5c1e428bf..853621904d48 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Aktibo (kaliwa lang)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Aktibo (kanan lang)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Aktibo (kaliwa at kanan)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Aktibo (media lang). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Aktibo (media lang). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> baterya."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Nakakonekta (sinusuportahan ang pag-share ng audio), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Scale ng transition animation"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Scale ng tagal ng animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"I-simulate, ika-2 display"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Posisyon ng display ng shade"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Mga App"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Huwag magtago ng mga aktibidad"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Burahin ang aktibidad kapag iniwan na ito ng user"</string> diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml index 27591bee7e3d..fdb9d217e611 100644 --- a/packages/SettingsLib/res/values-tr/arrays.xml +++ b/packages/SettingsLib/res/values-tr/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Yalnızca cihaz ekranı (Varsayılan)"</item> + <item msgid="9161645858025071955">"Harici ekran"</item> + <item msgid="114384731934682483">"Odaklanmaya dayalı"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Gölgeyi yalnızca cihaz ekranında göster"</item> + <item msgid="7795034287069726554">"Cihazı tek bir harici ekranda göster"</item> + <item msgid="5280431949814340475">"Cihazı son odaklanılan ekranda göster"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 705b71453856..8168d534d057 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Etkin (yalnızca sol taraf)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Etkin (yalnızca sağ taraf)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Etkin (sol ve sağ taraf)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Etkin (yalnızca medya). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pil seviyesi."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Etkin (yalnızca medya). Sol: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Sağ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pil seviyesi."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Bağlı (ses paylaşımını destekler). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pil seviyesi."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Geçiş animasyonu ölçeği"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatör süre ölçeği"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"İkincil ekranları simüle et"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Gölge ekran konumu"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Uygulamalar"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Etkinlikleri saklama"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Kullanıcının ayrıldığı her etkinliği hemen yok et"</string> diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml index 234af3680512..29494716bbb9 100644 --- a/packages/SettingsLib/res/values-uk/arrays.xml +++ b/packages/SettingsLib/res/values-uk/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Лише екран пристрою (за умовчанням)"</item> + <item msgid="9161645858025071955">"Зовнішній дисплей"</item> + <item msgid="114384731934682483">"На основі фокусування"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Показувати панель лише на екрані пристрою"</item> + <item msgid="7795034287069726554">"Показувати панель на одному зовнішньому дисплеї"</item> + <item msgid="5280431949814340475">"Показувати панель на останньому активному дисплеї"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index dda905ececa4..3167290603a4 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Активовано (лише лівий)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Активовано (лише правий)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Активовано (лівий і правий)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Активне з’єднання (лише для мультимедіа). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Активне з’єднання (лише для мультимедіа). Рівень заряду: лівий <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, правий: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Підключено (підтримує надсилання аудіо). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Анімація переходів"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Тривалість анімації"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Імітувати додаткові екрани"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Місце відображення панелі"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Додатки"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Не зберігати дії"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Видаляти зведення дій після їх завершення"</string> diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml index df0e56e2a4b9..a9eadb83bbfa 100644 --- a/packages/SettingsLib/res/values-ur/arrays.xml +++ b/packages/SettingsLib/res/values-ur/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"صرف آلے کا ڈسپلے (ڈیفالٹ)"</item> + <item msgid="9161645858025071955">"بیرونی ڈسپلے"</item> + <item msgid="114384731934682483">"فوکس پر مبنی"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"صرف آلے کے ڈسپلے پر شیڈ دکھائیں"</item> + <item msgid="7795034287069726554">"آلے کو واحد بیرونی ڈسپلے پر دکھائیں"</item> + <item msgid="5280431949814340475">"آلے کو آخری فوکس کردہ ڈسپلے پر دکھائیں"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 204663da79d0..fe3dc059eab7 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"فعال ہے (صرف بایاں)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"فعال ہے (صرف دایاں)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"فعال ہے (بایاں اور دایاں)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"فعال (صرف میڈیا)۔ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> بیٹری۔"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"فعال (صرف میڈیا)۔ L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>، R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> بیٹری۔"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)۔ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> بیٹری۔"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"ٹرانزیشن اینیمیشن اسکیل"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"اینیمیٹر دورانیے کا اسکیل"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"ثانوی ڈسپلیز کو تحریک دیں"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"شیڈ ڈسپلے کی پوزیشن"</string> <string name="debug_applications_category" msgid="5394089406638954196">"ایپس"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"سرگرمیوں کو نہ رکھیں"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"صارف کی ہر سرگرمی صارف کے چھوڑنے پر حذف کر دیں"</string> diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml index 3c9653002e55..f3cae4192180 100644 --- a/packages/SettingsLib/res/values-uz/arrays.xml +++ b/packages/SettingsLib/res/values-uz/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Faqat qurilma displeyi (birlamchi)"</item> + <item msgid="9161645858025071955">"Tashqi displey"</item> + <item msgid="114384731934682483">"Fokusga asoslangan"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Faqat qurilma displeyida soyani koʻrsatish"</item> + <item msgid="7795034287069726554">"Qurilmani alohida tashqi displeyda koʻrsatish"</item> + <item msgid="5280431949814340475">"Qurilmani oxirgi fokuslangan displeyda koʻrsatish"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index a7500a36e6fc..d046effa4e7b 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Faol (faqat chap)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Faol (faqat oʻng)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Faol (chap va oʻng)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Faol (faqat media uchun) Quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Faol (faqat media uchun), quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> (L), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> (R)"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Ulangan (audio yuborish mumkin), quvvat: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"O‘tish animatsiyasi"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animatsiya tezligi"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Qo‘shimcha ekran simulyatsiyasi"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Soya displeyi holati"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Ilovalar"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Faollik ma’lumoti saqlanmasin"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Amal tugagach, uning tarixi tozalansin"</string> diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml index 9f7768cfc4f4..e0ebc9faab9c 100644 --- a/packages/SettingsLib/res/values-vi/arrays.xml +++ b/packages/SettingsLib/res/values-vi/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Chỉ hiển thị trên thiết bị (Mặc định)"</item> + <item msgid="9161645858025071955">"Màn hình ngoài"</item> + <item msgid="114384731934682483">"Theo tiêu điểm"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Chỉ hiện ngăn thông báo trên màn hình thiết bị"</item> + <item msgid="7795034287069726554">"Hiện thiết bị trên một màn hình ngoài"</item> + <item msgid="5280431949814340475">"Hiện thiết bị trên màn hình được lấy tiêu điểm gần đây nhất"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 5d620e62d772..b9617f7fd3f8 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Đang hoạt động (chỉ tai trái)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Đang hoạt động (chỉ tai phải)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Đang hoạt động (cả tai phải và tai trái)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Đang hoạt động (chỉ phát nội dung đa phương tiện). Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Đang hoạt động (chỉ phát nội dung đa phương tiện). Bên trái: Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> pin. Bên phải: Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> pin."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh). Còn <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> pin."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Tỷ lệ hình động chuyển tiếp"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Tỷ lệ thời lượng của trình tạo hình động"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Mô phỏng màn hình phụ"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Vị trí hiển thị ngăn thông báo"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Ứng dụng"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Không lưu hoạt động"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Xoá mọi hoạt động ngay khi người dùng rời khỏi"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml index 939b4ec5f09f..c2147c7aba70 100644 --- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"仅设备显示屏(默认)"</item> + <item msgid="9161645858025071955">"外接显示屏"</item> + <item msgid="114384731934682483">"基于焦点"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"仅在设备显示屏上显示通知栏"</item> + <item msgid="7795034287069726554">"在单个外接显示屏上显示设备"</item> + <item msgid="5280431949814340475">"在最近一次获得焦点的显示屏上显示设备"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 87e03dc7ca19..905b221d90e3 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"使用中(仅左耳助听器)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"使用中(仅右耳助听器)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"使用中(左右耳助听器)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"使用中(仅限媒体)。电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"使用中(仅限媒体)。左侧电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右侧电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>。"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"已连接(支持音频分享)。电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"过渡动画缩放"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator 时长缩放"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"模拟辅助显示设备"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"通知栏显示位置"</string> <string name="debug_applications_category" msgid="5394089406638954196">"应用"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"不保留 activity"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"用户离开后即销毁每个 activity"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml index 13702632169c..37d7b2930d3e 100644 --- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"只限裝置顯示屏 (預設)"</item> + <item msgid="9161645858025071955">"外部顯示屏"</item> + <item msgid="114384731934682483">"突顯"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"只在裝置顯示屏上顯示陰影"</item> + <item msgid="7795034287069726554">"在單獨外部顯示屏上顯示裝置"</item> + <item msgid="5280431949814340475">"在上一次突顯的顯示屏上顯示裝置"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 6a8d6d5c2835..ccac068bbab4 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"使用中 (僅左側)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"使用中 (僅右側)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"使用中 (左右兩側)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"啟用 (只限媒體)。<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 電量。"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"啟用 (只限媒體),左側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> 電量,右側:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> 電量。"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"已連線 (支援音訊分享功能),<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 電量。"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"轉場動畫比例"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator 片長比例"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"模擬次要顯示器"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"陰影顯示位置"</string> <string name="debug_applications_category" msgid="5394089406638954196">"應用程式"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"不要保留活動"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"使用者離開活動後隨即銷毀活動"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml index bbddf6112316..b851f46016d0 100644 --- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"僅裝置螢幕 (預設)"</item> + <item msgid="9161645858025071955">"外接螢幕"</item> + <item msgid="114384731934682483">"使用中的螢幕"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"只在裝置螢幕顯示通知欄"</item> + <item msgid="7795034287069726554">"在單一外接螢幕顯示通知欄"</item> + <item msgid="5280431949814340475">"在上一次使用的螢幕顯示通知欄"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"預設螢幕"</item> + <item msgid="774789415968826925">"任何外接螢幕"</item> + <item msgid="7880769915418638436">"最新觸控狀態列"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index c5eb0bb268b7..3bd35648bd5d 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"使用中 (僅左側)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"使用中 (僅右側)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"使用中 (左右兩側)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"已啟用 (僅限媒體)。電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"已啟用 (僅限媒體)。左側電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>,右側電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>。"</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"已連線 (支援音訊分享)。電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>。"</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"轉場動畫比例"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"動畫影片長度比例"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"模擬次要顯示器"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"通知欄顯示位置"</string> <string name="debug_applications_category" msgid="5394089406638954196">"應用程式"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"不要保留活動"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"使用者離開活動後立刻刪除所有活動內容"</string> diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml index c202896e7a28..27ca40c4a66b 100644 --- a/packages/SettingsLib/res/values-zu/arrays.xml +++ b/packages/SettingsLib/res/values-zu/arrays.xml @@ -288,4 +288,19 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Ukuboniswa kwedivayisi kuphela (Okuzenzakalelayo)"</item> + <item msgid="9161645858025071955">"Ukubonisa Kwangaphandle"</item> + <item msgid="114384731934682483">"Kusekelwe ekugxileni"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Bonisa umthunzi esibonisini sedivayisi kuphela"</item> + <item msgid="7795034287069726554">"Bonisa idivayisi esibonisini sangaphandle esisodwa"</item> + <item msgid="5280431949814340475">"Bonisa idivayisi esibonisini sokugcina esigxilile"</item> + </string-array> + <string-array name="shade_display_awareness_values"> + <item msgid="3055776101992426514">"default_display"</item> + <item msgid="774789415968826925">"any_external_display"</item> + <item msgid="7880769915418638436">"status_bar_latest_touch"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index f467a3a46921..7d964232485d 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -110,6 +110,8 @@ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Iyasebenza (ngakwesokunxele kuphela)"</string> <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Iyasebenza (ngakwesokudla kuphela)"</string> <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Iyasebenza (ngakwesokunxele nakwesokudla)"</string> + <!-- no translation found for bluetooth_hearing_device_ambient_error (6035857289108813878) --> + <skip /> <string name="bluetooth_active_media_only_battery_level" msgid="7772517511061834073">"Iyasebenza (imidiya kuphela). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri."</string> <string name="bluetooth_active_media_only_battery_level_untethered" msgid="7444753133664620926">"Iyasebenza (imidiya kuphela). L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ibhethri."</string> <string name="bluetooth_battery_level_lea_support" msgid="5968584103507988820">"Ixhunyiwe (isekela ukwabelana ngokuqoshiwe). <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri."</string> @@ -423,6 +425,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Isilinganiso sesithombe soku"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Isilinganiso sobude besikhathi somenzi womfanekiso onyakazayo"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Hlalisa kahle ukubukwa kwesibili"</string> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Indawo yokubonisa umthunzi"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Izinhlelo zokusebenza"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Ungagcini imisibenzi"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Phihliza zonke izenzo ngokushesha ngemva kokuna umsebenzisi awuyeka"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index b4afb7d8cd4c..7374f80fd9db 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -444,12 +444,23 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** - * @return {@code true} if {@code cachedBluetoothDevice} is hearing aid device + * @return {@code true} if {@code cachedBluetoothDevice} is hearing aid device. + * @deprecated use {@link #isHearingDevice() } + * // TODO: b/385679160 - Target to deprecate it and replace with #isHearingDevice() */ + @Deprecated public boolean isHearingAidDevice() { return mHearingAidInfo != null; } + /** + * @return {@code true} if {@code cachedBluetoothDevice} support any of hearing device profile. + */ + public boolean isHearingDevice() { + return getProfiles().stream().anyMatch( + p -> (p instanceof HearingAidProfile || p instanceof HapClientProfile)); + } + public int getDeviceSide() { return mHearingAidInfo != null ? mHearingAidInfo.getSide() : HearingAidInfo.DeviceSide.SIDE_INVALID; @@ -910,12 +921,33 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } } + /** + * Checks if the device is connected to the specified Bluetooth profile. + * + * @param profile The Bluetooth profile to check. + * @return {@code true} if the device is connected to the profile. + */ public boolean isConnectedProfile(LocalBluetoothProfile profile) { int status = getProfileConnectionState(profile); return status == BluetoothProfile.STATE_CONNECTED; } + /** + * Checks if the device is connected to the Bluetooth profile with the given ID. + * + * @param profileId The ID of the Bluetooth profile to check. + * @return {@code true} if the device is connected to the profile. + */ + public boolean isConnectedProfile(int profileId) { + for (LocalBluetoothProfile profile : getProfiles()) { + if (profile.getProfileId() == profileId) { + return isConnectedProfile(profile); + } + } + return false; + } + public boolean isBusy() { synchronized (mProfileLock) { for (LocalBluetoothProfile profile : mProfiles) { @@ -1891,13 +1923,6 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** - * @return {@code true} if {@code cachedBluetoothDevice} is LeAudio hearing aid device - */ - public boolean isConnectedLeAudioHearingAidDevice() { - return isConnectedHapClientDevice() && isConnectedLeAudioDevice(); - } - - /** * @return {@code true} if {@code cachedBluetoothDevice} is hearing aid device * * The device may be an ASHA hearing aid that supports {@link HearingAidProfile} or a LeAudio @@ -1908,6 +1933,13 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** + * @return {@code true} if {@code cachedBluetoothDevice} is LeAudio hearing aid device + */ + public boolean isConnectedLeAudioHearingAidDevice() { + return isConnectedHapClientDevice() && isConnectedLeAudioDevice(); + } + + /** * @return {@code true} if {@code cachedBluetoothDevice} is LeAudio device */ public boolean isConnectedLeAudioDevice() { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index b754706fb9a1..313013cdcf79 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -24,7 +24,10 @@ import android.bluetooth.le.ScanFilter; import android.content.Context; import android.util.Log; +import androidx.annotation.NonNull; + import com.android.internal.annotations.VisibleForTesting; +import com.android.settingslib.flags.Flags; import java.sql.Timestamp; import java.util.ArrayList; @@ -46,7 +49,7 @@ public class CachedBluetoothDeviceManager { private final LocalBluetoothManager mBtManager; @VisibleForTesting - final List<CachedBluetoothDevice> mCachedDevices = new ArrayList<CachedBluetoothDevice>(); + final List<CachedBluetoothDevice> mCachedDevices = new ArrayList<>(); @VisibleForTesting HearingAidDeviceManager mHearingAidDeviceManager; @VisibleForTesting @@ -192,6 +195,20 @@ public class CachedBluetoothDeviceManager { } /** + * Notifies the connection status if device is hearing device. + * + * @param device The {@link CachedBluetoothDevice} need to be hearing device + */ + public synchronized void notifyHearingDevicesConnectionStatusChangedIfNeeded( + @NonNull CachedBluetoothDevice device) { + if (!device.isHearingDevice()) { + return; + } + + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + } + + /** * Search for existing sub device {@link CachedBluetoothDevice}. * * @param device the address of the Bluetooth device @@ -388,8 +405,14 @@ public class CachedBluetoothDeviceManager { /** Handles when the device been set as active/inactive. */ public synchronized void onActiveDeviceChanged(CachedBluetoothDevice cachedBluetoothDevice) { - if (cachedBluetoothDevice.isHearingAidDevice()) { + if (cachedBluetoothDevice == null) { + return; + } + if (cachedBluetoothDevice.isHearingDevice()) { mHearingAidDeviceManager.onActiveDeviceChanged(cachedBluetoothDevice); + if (Flags.hearingDeviceSetConnectionStatusReport()) { + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + } } } @@ -421,6 +444,14 @@ public class CachedBluetoothDeviceManager { mainDevice.unpair(); mainDevice.setSubDevice(null); } + + // TODO: b/386121967 - Should change to use isHearingDevice but mProfile get clear here. + // Need to consider where to put this logic when using isHearingDevice() + if (device.isHearingAidDevice()) { + if (Flags.hearingDeviceSetConnectionStatusReport()) { + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + } + } } /** @@ -579,6 +610,11 @@ public class CachedBluetoothDeviceManager { return mOngoingSetMemberPair != null && mOngoingSetMemberPair.equals(device); } + @NonNull + public HearingAidDeviceManager getHearingAidDeviceManager() { + return mHearingAidDeviceManager; + } + private void log(String msg) { if (DEBUG) { Log.d(TAG, msg); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingConstants.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingConstants.java index ca0cad759a08..7d91050d4289 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingConstants.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingConstants.java @@ -19,6 +19,7 @@ package com.android.settingslib.bluetooth; import android.media.AudioAttributes; import android.media.AudioDeviceAttributes; import android.media.AudioDeviceInfo; +import android.media.MediaRecorder; import androidx.annotation.IntDef; @@ -61,15 +62,20 @@ public final class HearingAidAudioRoutingConstants { @IntDef({ RoutingValue.AUTO, RoutingValue.HEARING_DEVICE, - RoutingValue.DEVICE_SPEAKER, + RoutingValue.BUILTIN_DEVICE, }) public @interface RoutingValue { int AUTO = 0; int HEARING_DEVICE = 1; - int DEVICE_SPEAKER = 2; + int BUILTIN_DEVICE = 2; } - public static final AudioDeviceAttributes DEVICE_SPEAKER_OUT = new AudioDeviceAttributes( + public static final AudioDeviceAttributes BUILTIN_SPEAKER = new AudioDeviceAttributes( AudioDeviceAttributes.ROLE_OUTPUT, AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, ""); + public static final AudioDeviceAttributes BUILTIN_MIC = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_INPUT, AudioDeviceInfo.TYPE_BUILTIN_MIC, ""); + + public static final int MICROPHONE_SOURCE_VOICE_COMMUNICATION = + MediaRecorder.AudioSource.VOICE_COMMUNICATION; } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingHelper.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingHelper.java index 8eaea0e3561b..1f727259db7e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingHelper.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingHelper.java @@ -16,26 +16,34 @@ package com.android.settingslib.bluetooth; +import static com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants.BUILTIN_MIC; +import static com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants.MICROPHONE_SOURCE_VOICE_COMMUNICATION; + import android.content.Context; import android.media.AudioAttributes; import android.media.AudioDeviceAttributes; import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.media.audiopolicy.AudioProductStrategy; +import android.util.Log; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants.RoutingValue; + import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** - * A helper class to configure the routing strategy for hearing aids. + * A helper class to configure the audio routing for hearing aids. */ public class HearingAidAudioRoutingHelper { + private static final String TAG = "HearingAidAudioRoutingHelper"; + private final AudioManager mAudioManager; public HearingAidAudioRoutingHelper(Context context) { @@ -73,26 +81,26 @@ public class HearingAidAudioRoutingHelper { * @param hearingDevice {@link AudioDeviceAttributes} of the device to be changed in audio * routing * @param routingValue one of value defined in - * {@link HearingAidAudioRoutingConstants.RoutingValue}, denotes routing + * {@link RoutingValue}, denotes routing * destination. * @return {code true} if the routing value successfully configure */ public boolean setPreferredDeviceRoutingStrategies( List<AudioProductStrategy> supportedStrategies, AudioDeviceAttributes hearingDevice, - @HearingAidAudioRoutingConstants.RoutingValue int routingValue) { + @RoutingValue int routingValue) { boolean status; switch (routingValue) { - case HearingAidAudioRoutingConstants.RoutingValue.AUTO: + case RoutingValue.AUTO: status = removePreferredDeviceForStrategies(supportedStrategies); return status; - case HearingAidAudioRoutingConstants.RoutingValue.HEARING_DEVICE: + case RoutingValue.HEARING_DEVICE: status = removePreferredDeviceForStrategies(supportedStrategies); status &= setPreferredDeviceForStrategies(supportedStrategies, hearingDevice); return status; - case HearingAidAudioRoutingConstants.RoutingValue.DEVICE_SPEAKER: + case RoutingValue.BUILTIN_DEVICE: status = removePreferredDeviceForStrategies(supportedStrategies); status &= setPreferredDeviceForStrategies(supportedStrategies, - HearingAidAudioRoutingConstants.DEVICE_SPEAKER_OUT); + HearingAidAudioRoutingConstants.BUILTIN_SPEAKER); return status; default: throw new IllegalArgumentException("Unexpected routingValue: " + routingValue); @@ -100,21 +108,76 @@ public class HearingAidAudioRoutingHelper { } /** - * Gets the matched hearing device {@link AudioDeviceAttributes} for {@code device}. + * Set the preferred input device for calls. * - * <p>Will also try to match the {@link CachedBluetoothDevice#getSubDevice()} of {@code device} + * <p>Note that hearing device needs to be valid input device to be found in AudioManager. + * <p>Routing value can be: + * <ul> + * <li> {@link RoutingValue#AUTO} - Allow the system to automatically select the appropriate + * audio routing for calls.</li> + * <li> {@link RoutingValue#HEARING_DEVICE} - Set input device to this hearing device.</li> + * <li> {@link RoutingValue#BUILTIN_DEVICE} - Set input device to builtin microphone. </li> + * </ul> + * @param routingValue The desired routing value for calls + * @return {@code true} if the operation was successful + */ + public boolean setPreferredInputDeviceForCalls(@Nullable CachedBluetoothDevice hearingDevice, + @RoutingValue int routingValue) { + AudioDeviceAttributes hearingDeviceAttributes = getMatchedHearingDeviceAttributesInput( + hearingDevice); + if (hearingDeviceAttributes == null) { + Log.w(TAG, "Can not find expected input AudioDeviceAttributes for hearing device: " + + hearingDevice.getDevice().getAnonymizedAddress()); + return false; + } + + final int audioSource = MICROPHONE_SOURCE_VOICE_COMMUNICATION; + return switch (routingValue) { + case RoutingValue.AUTO -> + mAudioManager.clearPreferredDevicesForCapturePreset(audioSource); + case RoutingValue.HEARING_DEVICE -> { + mAudioManager.clearPreferredDevicesForCapturePreset(audioSource); + yield mAudioManager.setPreferredDeviceForCapturePreset(audioSource, + hearingDeviceAttributes); + } + case RoutingValue.BUILTIN_DEVICE -> { + mAudioManager.clearPreferredDevicesForCapturePreset(audioSource); + yield mAudioManager.setPreferredDeviceForCapturePreset(audioSource, BUILTIN_MIC); + } + default -> throw new IllegalArgumentException( + "Unexpected routingValue: " + routingValue); + }; + } + + /** + * Clears the preferred input device for calls. + * + * {@code true} if the operation was successful + */ + public boolean clearPreferredInputDeviceForCalls() { + return mAudioManager.clearPreferredDevicesForCapturePreset( + MICROPHONE_SOURCE_VOICE_COMMUNICATION); + } + + /** + * Gets the matched output hearing device {@link AudioDeviceAttributes} for {@code device}. + * + * <p>Will also try to match the {@link CachedBluetoothDevice#getSubDevice()} and + * {@link CachedBluetoothDevice#getMemberDevice()} of {@code device} * * @param device the {@link CachedBluetoothDevice} need to be hearing aid device * @return the requested AudioDeviceAttributes or {@code null} if not match */ @Nullable - public AudioDeviceAttributes getMatchedHearingDeviceAttributes(CachedBluetoothDevice device) { + public AudioDeviceAttributes getMatchedHearingDeviceAttributesForOutput( + @Nullable CachedBluetoothDevice device) { if (device == null || !device.isHearingAidDevice()) { return null; } AudioDeviceInfo[] audioDevices = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS); for (AudioDeviceInfo audioDevice : audioDevices) { + //TODO: b/370812132 - Need to update if TYPE_LEA_HEARING_AID is added // ASHA for TYPE_HEARING_AID, HAP for TYPE_BLE_HEADSET if (audioDevice.getType() == AudioDeviceInfo.TYPE_HEARING_AID || audioDevice.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) { @@ -126,6 +189,35 @@ public class HearingAidAudioRoutingHelper { return null; } + /** + * Gets the matched input hearing device {@link AudioDeviceAttributes} for {@code device}. + * + * <p>Will also try to match the {@link CachedBluetoothDevice#getSubDevice()} and + * {@link CachedBluetoothDevice#getMemberDevice()} of {@code device} + * + * @param device the {@link CachedBluetoothDevice} need to be hearing aid device + * @return the requested AudioDeviceAttributes or {@code null} if not match + */ + @Nullable + private AudioDeviceAttributes getMatchedHearingDeviceAttributesInput( + @Nullable CachedBluetoothDevice device) { + if (device == null || !device.isHearingAidDevice()) { + return null; + } + + AudioDeviceInfo[] audioDevices = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS); + for (AudioDeviceInfo audioDevice : audioDevices) { + //TODO: b/370812132 - Need to update if TYPE_LEA_HEARING_AID is added + // HAP for TYPE_BLE_HEADSET + if (audioDevice.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) { + if (matchAddress(device, audioDevice)) { + return new AudioDeviceAttributes(audioDevice); + } + } + } + return null; + } + private boolean matchAddress(CachedBluetoothDevice device, AudioDeviceInfo audioDevice) { final String audioDeviceAddress = audioDevice.getAddress(); final CachedBluetoothDevice subDevice = device.getSubDevice(); @@ -142,7 +234,6 @@ public class HearingAidAudioRoutingHelper { boolean status = true; for (AudioProductStrategy strategy : strategies) { status &= mAudioManager.setPreferredDeviceForStrategy(strategy, audioDevice); - } return status; diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java index 1ca4c2b39a70..b2c279466ee4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java @@ -15,7 +15,11 @@ */ package com.android.settingslib.bluetooth; +import static android.bluetooth.BluetoothDevice.BOND_BONDED; + +import android.annotation.CallbackExecutor; import android.bluetooth.BluetoothCsipSetCoordinator; +import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHapClient; import android.bluetooth.BluetoothHearingAid; import android.bluetooth.BluetoothProfile; @@ -30,14 +34,25 @@ import android.provider.Settings; import android.util.FeatureFlagUtils; import android.util.Log; +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.collection.ArraySet; + import com.android.internal.annotations.VisibleForTesting; +import com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants.RoutingValue; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.stream.Collectors; /** - * HearingAidDeviceManager manages the set of remote HearingAid(ASHA) Bluetooth devices. + * HearingAidDeviceManager manages the set of remote bluetooth hearing devices. */ public class HearingAidDeviceManager { private static final String TAG = "HearingAidDeviceManager"; @@ -48,6 +63,12 @@ public class HearingAidDeviceManager { private final LocalBluetoothManager mBtManager; private final List<CachedBluetoothDevice> mCachedDevices; private final HearingAidAudioRoutingHelper mRoutingHelper; + private static final Map<ConnectionStatusListener, Executor> + mConnectionStatusListeners = new ConcurrentHashMap<>(); + @ConnectionStatus + private int mDevicesConnectionStatus = ConnectionStatus.NO_DEVICE_BONDED; + private boolean mInitialDevicesConnectionStatusUpdate = false; + HearingAidDeviceManager(Context context, LocalBluetoothManager localBtManager, List<CachedBluetoothDevice> CachedDevices) { mContext = context; @@ -67,6 +88,191 @@ public class HearingAidDeviceManager { mRoutingHelper = routingHelper; } + /** + * Defines the connection status for hearing devices. + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + ConnectionStatus.NO_DEVICE_BONDED, + ConnectionStatus.DISCONNECTED, + ConnectionStatus.CONNECTED, + ConnectionStatus.CONNECTING_OR_DISCONNECTING, + ConnectionStatus.ACTIVE + }) + public @interface ConnectionStatus { + int NO_DEVICE_BONDED = -1; + int DISCONNECTED = 0; + int CONNECTED = 1; + int CONNECTING_OR_DISCONNECTING = 2; + int ACTIVE = 3; + } + /** + * Interface for connection status listener. + */ + public interface ConnectionStatusListener { + /** + * Callback when hearing devices connection status change. + * + * <p>devices here means singular device or binaural device. + * E.g. One of hearing device is in CONNECTED status and another is in DISCONNECTED, + * it will callback CONNECTED status. + * + * @param status Updated {@link ConnectionStatus} + */ + void onDevicesConnectionStatusChanged(@ConnectionStatus int status); + } + + /** + * Registers a listener to be notified of connection status changes. + * + * @param listener The listener to register. + * @param executor The executor on which the listener's callback will be run. + */ + public void registerConnectionStatusListener( + @NonNull ConnectionStatusListener listener, + @NonNull @CallbackExecutor Executor executor) { + mConnectionStatusListeners.put(listener, executor); + } + + /** + * Unregisters a listener previously registered with + * {@link #registerConnectionStatusListener(ConnectionStatusListener, Executor)}. + * + * @param listener The listener to unregister. + */ + public void unregisterConnectionStatusListener( + @NonNull ConnectionStatusListener listener) { + mConnectionStatusListeners.remove(listener); + } + + private void notifyDevicesConnectionStatusChanged(int status) { + mConnectionStatusListeners.forEach((listener, executor) -> + executor.execute(() -> listener.onDevicesConnectionStatusChanged(status))); + } + + /** + * Updates the connection status of the hearing devices based on the currently bonded + * hearing aid devices. + */ + synchronized void notifyDevicesConnectionStatusChanged() { + final int prevVal = mDevicesConnectionStatus; + updateDevicesConnectionStatus(); + if (mDevicesConnectionStatus != prevVal) { + notifyDevicesConnectionStatusChanged(mDevicesConnectionStatus); + } + } + + private void updateDevicesConnectionStatus() { + mInitialDevicesConnectionStatusUpdate = true; + // Add all hearing devices including sub and member into a set. + Set<CachedBluetoothDevice> allHearingDevices = mCachedDevices.stream() + .filter(d -> d.getBondState() == BluetoothDevice.BOND_BONDED + && d.isHearingDevice()) + .flatMap(d -> getAssociatedCachedDevice(d).stream()) + .collect(Collectors.toSet()); + + // Status sequence matters here. If one of the hearing devices is in previous + // ConnectionStatus, we will treat whole hearing devices is in this status. + // E.g. One of hearing device is in CONNECTED status and another is in DISCONNECTED + // status, the hearing devices connection status will notify CONNECTED status. + if (isConnectingOrDisconnectingConnectionStatus(allHearingDevices)) { + mDevicesConnectionStatus = ConnectionStatus.CONNECTING_OR_DISCONNECTING; + } else if (isActiveConnectionStatus(allHearingDevices)) { + mDevicesConnectionStatus = ConnectionStatus.ACTIVE; + } else if (isConnectedStatus(allHearingDevices)) { + mDevicesConnectionStatus = ConnectionStatus.CONNECTED; + } else if (isDisconnectedStatus(allHearingDevices)) { + mDevicesConnectionStatus = ConnectionStatus.DISCONNECTED; + } else { + mDevicesConnectionStatus = ConnectionStatus.NO_DEVICE_BONDED; + } + + if (DEBUG) { + Log.d(TAG, "updateDevicesConnectionStatus: " + mDevicesConnectionStatus); + } + } + + /** + * @return all the related CachedBluetoothDevices for this device. + */ + @NonNull + public Set<CachedBluetoothDevice> getAssociatedCachedDevice( + @NonNull CachedBluetoothDevice device) { + ArraySet<CachedBluetoothDevice> cachedDeviceSet = new ArraySet<>(); + cachedDeviceSet.add(device); + // Associated device should be added into memberDevice if it support CSIP profile. + Set<CachedBluetoothDevice> memberDevices = device.getMemberDevice(); + if (!memberDevices.isEmpty()) { + cachedDeviceSet.addAll(memberDevices); + return cachedDeviceSet; + } + // If not support CSIP profile, it should be ASHA hearing device and added into subDevice. + CachedBluetoothDevice subDevice = device.getSubDevice(); + if (subDevice != null) { + cachedDeviceSet.add(subDevice); + return cachedDeviceSet; + } + + return cachedDeviceSet; + } + + private boolean isConnectingOrDisconnectingConnectionStatus( + Set<CachedBluetoothDevice> devices) { + HearingAidProfile hearingAidProfile = mBtManager.getProfileManager().getHearingAidProfile(); + HapClientProfile hapClientProfile = mBtManager.getProfileManager().getHapClientProfile(); + + for (CachedBluetoothDevice device : devices) { + if (hearingAidProfile != null) { + int status = device.getProfileConnectionState(hearingAidProfile); + if (status == BluetoothProfile.STATE_DISCONNECTING + || status == BluetoothProfile.STATE_CONNECTING) { + return true; + } + } + if (hapClientProfile != null) { + int status = device.getProfileConnectionState(hapClientProfile); + if (status == BluetoothProfile.STATE_DISCONNECTING + || status == BluetoothProfile.STATE_CONNECTING) { + return true; + } + } + } + return false; + } + + private boolean isActiveConnectionStatus(Set<CachedBluetoothDevice> devices) { + for (CachedBluetoothDevice device : devices) { + if ((device.isActiveDevice(BluetoothProfile.HEARING_AID) + && device.isConnectedProfile(BluetoothProfile.HEARING_AID)) + || (device.isActiveDevice(BluetoothProfile.LE_AUDIO) + && device.isConnectedProfile(BluetoothProfile.LE_AUDIO))) { + return true; + } + } + return false; + } + + private boolean isConnectedStatus(Set<CachedBluetoothDevice> devices) { + return devices.stream().anyMatch(CachedBluetoothDevice::isConnected); + } + + private boolean isDisconnectedStatus(Set<CachedBluetoothDevice> devices) { + return devices.stream().anyMatch( + d -> (!d.isConnected() && d.getBondState() == BOND_BONDED)); + } + + /** + * Gets the connection status for hearing device set. Will update connection status first if + * never updated. + */ + @ConnectionStatus + public int getDevicesConnectionStatus() { + if (!mInitialDevicesConnectionStatusUpdate) { + updateDevicesConnectionStatus(); + } + return mDevicesConnectionStatus; + } + void initHearingAidDeviceIfNeeded(CachedBluetoothDevice newDevice, List<ScanFilter> leScanFilters) { HearingAidInfo info = generateHearingAidInfo(newDevice); @@ -277,13 +483,19 @@ public class HearingAidDeviceManager { void onActiveDeviceChanged(CachedBluetoothDevice device) { if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_AUDIO_ROUTING)) { - if (device.isActiveDevice(BluetoothProfile.HEARING_AID) || device.isActiveDevice( - BluetoothProfile.LE_AUDIO)) { + if (device.isConnectedHearingAidDevice()) { setAudioRoutingConfig(device); } else { clearAudioRoutingConfig(); } } + if (com.android.settingslib.flags.Flags.hearingDevicesInputRoutingControl()) { + if (device.isConnectedHearingAidDevice()) { + setMicrophoneForCalls(device); + } else { + clearMicrophoneForCalls(); + } + } } void syncDeviceIfNeeded(CachedBluetoothDevice device) { @@ -311,9 +523,25 @@ public class HearingAidDeviceManager { HearingDeviceLocalDataManager.clear(mContext, device.getDevice()); } + private void setMicrophoneForCalls(CachedBluetoothDevice device) { + boolean useRemoteMicrophone = device.getDevice().isMicrophonePreferredForCalls(); + boolean status = mRoutingHelper.setPreferredInputDeviceForCalls(device, + useRemoteMicrophone ? RoutingValue.AUTO : RoutingValue.BUILTIN_DEVICE); + if (!status) { + Log.d(TAG, "Fail to configure setPreferredInputDeviceForCalls"); + } + } + + private void clearMicrophoneForCalls() { + boolean status = mRoutingHelper.clearPreferredInputDeviceForCalls(); + if (!status) { + Log.d(TAG, "Fail to configure clearMicrophoneForCalls"); + } + } + private void setAudioRoutingConfig(CachedBluetoothDevice device) { AudioDeviceAttributes hearingDeviceAttributes = - mRoutingHelper.getMatchedHearingDeviceAttributes(device); + mRoutingHelper.getMatchedHearingDeviceAttributesForOutput(device); if (hearingDeviceAttributes == null) { Log.w(TAG, "Can not find expected AudioDeviceAttributes for hearing device: " + device.getDevice().getAnonymizedAddress()); @@ -321,17 +549,13 @@ public class HearingAidDeviceManager { } final int callRoutingValue = Settings.Secure.getInt(mContentResolver, - Settings.Secure.HEARING_AID_CALL_ROUTING, - HearingAidAudioRoutingConstants.RoutingValue.AUTO); + Settings.Secure.HEARING_AID_CALL_ROUTING, RoutingValue.AUTO); final int mediaRoutingValue = Settings.Secure.getInt(mContentResolver, - Settings.Secure.HEARING_AID_MEDIA_ROUTING, - HearingAidAudioRoutingConstants.RoutingValue.AUTO); + Settings.Secure.HEARING_AID_MEDIA_ROUTING, RoutingValue.AUTO); final int ringtoneRoutingValue = Settings.Secure.getInt(mContentResolver, - Settings.Secure.HEARING_AID_RINGTONE_ROUTING, - HearingAidAudioRoutingConstants.RoutingValue.AUTO); + Settings.Secure.HEARING_AID_RINGTONE_ROUTING, RoutingValue.AUTO); final int systemSoundsRoutingValue = Settings.Secure.getInt(mContentResolver, - Settings.Secure.HEARING_AID_NOTIFICATION_ROUTING, - HearingAidAudioRoutingConstants.RoutingValue.AUTO); + Settings.Secure.HEARING_AID_NOTIFICATION_ROUTING, RoutingValue.AUTO); setPreferredDeviceRoutingStrategies( HearingAidAudioRoutingConstants.CALL_ROUTING_ATTRIBUTES, @@ -351,21 +575,21 @@ public class HearingAidDeviceManager { // Don't need to pass hearingDevice when we want to reset it (set to AUTO). setPreferredDeviceRoutingStrategies( HearingAidAudioRoutingConstants.CALL_ROUTING_ATTRIBUTES, - /* hearingDevice = */ null, HearingAidAudioRoutingConstants.RoutingValue.AUTO); + /* hearingDevice = */ null, RoutingValue.AUTO); setPreferredDeviceRoutingStrategies( HearingAidAudioRoutingConstants.MEDIA_ROUTING_ATTRIBUTES, - /* hearingDevice = */ null, HearingAidAudioRoutingConstants.RoutingValue.AUTO); + /* hearingDevice = */ null, RoutingValue.AUTO); setPreferredDeviceRoutingStrategies( HearingAidAudioRoutingConstants.RINGTONE_ROUTING_ATTRIBUTES, - /* hearingDevice = */ null, HearingAidAudioRoutingConstants.RoutingValue.AUTO); + /* hearingDevice = */ null, RoutingValue.AUTO); setPreferredDeviceRoutingStrategies( HearingAidAudioRoutingConstants.NOTIFICATION_ROUTING_ATTRIBUTES, - /* hearingDevice = */ null, HearingAidAudioRoutingConstants.RoutingValue.AUTO); + /* hearingDevice = */ null, RoutingValue.AUTO); } private void setPreferredDeviceRoutingStrategies(int[] attributeSdkUsageList, AudioDeviceAttributes hearingDevice, - @HearingAidAudioRoutingConstants.RoutingValue int routingValue) { + @RoutingValue int routingValue) { final List<AudioProductStrategy> supportedStrategies = mRoutingHelper.getSupportedStrategies(attributeSdkUsageList); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 8dfeb559a8b5..7c24df9e9019 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -47,12 +47,14 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; +import com.android.settingslib.flags.Flags; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; @@ -345,11 +347,17 @@ public class LocalBluetoothProfileManager { oldState == BluetoothProfile.STATE_CONNECTING) { Log.i(TAG, "Failed to connect " + mProfile + " device"); } + final boolean isAshaProfile = getHearingAidProfile() != null + && mProfile instanceof HearingAidProfile; + final boolean isHapClientProfile = getHapClientProfile() != null + && mProfile instanceof HapClientProfile; + final boolean isLeAudioProfile = getLeAudioProfile() != null + && mProfile instanceof LeAudioProfile; + final boolean isHapClientOrLeAudioProfile = isHapClientProfile || isLeAudioProfile; + final boolean isCsipProfile = getCsipSetCoordinatorProfile() != null + && mProfile instanceof CsipSetCoordinatorProfile; - if (getHearingAidProfile() != null - && mProfile instanceof HearingAidProfile - && (newState == BluetoothProfile.STATE_CONNECTED)) { - + if (isAshaProfile && (newState == BluetoothProfile.STATE_CONNECTED)) { // Check if the HiSyncID has being initialized if (cachedDevice.getHiSyncId() == BluetoothHearingAid.HI_SYNC_ID_INVALID) { long newHiSyncId = getHearingAidProfile().getHiSyncId(cachedDevice.getDevice()); @@ -366,11 +374,6 @@ public class LocalBluetoothProfileManager { HearingAidStatsLogUtils.logHearingAidInfo(cachedDevice); } - final boolean isHapClientProfile = getHapClientProfile() != null - && mProfile instanceof HapClientProfile; - final boolean isLeAudioProfile = getLeAudioProfile() != null - && mProfile instanceof LeAudioProfile; - final boolean isHapClientOrLeAudioProfile = isHapClientProfile || isLeAudioProfile; if (isHapClientOrLeAudioProfile && newState == BluetoothProfile.STATE_CONNECTED) { // Checks if both profiles are connected to the device. Hearing aid info need @@ -385,9 +388,7 @@ public class LocalBluetoothProfileManager { } } - if (getCsipSetCoordinatorProfile() != null - && mProfile instanceof CsipSetCoordinatorProfile - && newState == BluetoothProfile.STATE_CONNECTED) { + if (isCsipProfile && (newState == BluetoothProfile.STATE_CONNECTED)) { // Check if the GroupID has being initialized if (cachedDevice.getGroupId() == BluetoothCsipSetCoordinator.GROUP_ID_INVALID) { final Map<Integer, ParcelUuid> groupIdMap = getCsipSetCoordinatorProfile() @@ -403,6 +404,21 @@ public class LocalBluetoothProfileManager { } } + // LE_AUDIO, CSIP_SET_COORDINATOR profiles will also impact the connection status + // change, e.g. device need to active on LE_AUDIO to become active connection status. + final Set<Integer> hearingDeviceConnectionStatusProfileId = Set.of( + BluetoothProfile.HEARING_AID, + BluetoothProfile.HAP_CLIENT, + BluetoothProfile.LE_AUDIO, + BluetoothProfile.CSIP_SET_COORDINATOR + ); + if (Flags.hearingDeviceSetConnectionStatusReport()) { + if (hearingDeviceConnectionStatusProfileId.contains(mProfile.getProfileId())) { + mDeviceManager.notifyHearingDevicesConnectionStatusChangedIfNeeded( + cachedDevice); + } + } + cachedDevice.onProfileStateChanged(mProfile, newState); // Dispatch profile changed after device update boolean needDispatchProfileConnectionState = true; diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/DataServiceUtils.java b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/DataServiceUtils.java index 714f9519f378..f6acac17e6fa 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/DataServiceUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/DataServiceUtils.java @@ -18,8 +18,6 @@ package com.android.settingslib.mobile.dataservice; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; -import android.telephony.UiccPortInfo; -import android.telephony.UiccSlotMapping; public class DataServiceUtils { @@ -43,35 +41,6 @@ public class DataServiceUtils { * {@see MobileNetworkUtils#isMobileDataEnabled(Context)}. */ public static final String COLUMN_IS_MOBILE_DATA_ENABLED = "isMobileDataEnabled"; - - /** - * The name of the show toggle for physicalSim state column, - * {@see SubscriptionUtil#showToggleForPhysicalSim(SubscriptionManager)}. - */ - public static final String COLUMN_SHOW_TOGGLE_FOR_PHYSICAL_SIM = "showToggleForPhysicalSim"; - } - - /** - * Represents columns of the UiccInfoData table, define these columns from - * {@link android.telephony.UiccSlotInfo}, {@link android.telephony.UiccCardInfo}, - * {@link UiccSlotMapping} and {@link android.telephony.UiccPortInfo}.If columns of these 4 - * classes are changed, we should also update the table except PII data. - */ - public static final class UiccInfoData { - - /** The name of the UiccInfoData table. */ - public static final String TABLE_NAME = "uiccInfo"; - - /** - * The name of the ID column, set the {@link SubscriptionInfo#getSubscriptionId()} - * as the primary key. - */ - public static final String COLUMN_ID = "sudId"; - - /** - * The name of the active state column, see {@link UiccPortInfo#isActive()}. - */ - public static final String COLUMN_IS_ACTIVE = "isActive"; } /** @@ -139,12 +108,5 @@ public class DataServiceUtils { * {@link SubscriptionManager#isActiveSubscriptionId(int)}. */ public static final String COLUMN_IS_ACTIVE_SUBSCRIPTION_ID = "isActiveSubscription"; - - /** - * The name of the active data subscription state column, see - * {@link SubscriptionManager#getActiveDataSubscriptionId()}. - */ - public static final String COLUMN_IS_ACTIVE_DATA_SUBSCRIPTION = - "isActiveDataSubscriptionId"; } } diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/MobileNetworkDatabase.java b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/MobileNetworkDatabase.java index 5f7fa278082b..63573825df02 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/MobileNetworkDatabase.java +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/MobileNetworkDatabase.java @@ -27,7 +27,7 @@ import androidx.room.RoomDatabase; import java.util.List; import java.util.Objects; -@Database(entities = {SubscriptionInfoEntity.class, UiccInfoEntity.class, +@Database(entities = {SubscriptionInfoEntity.class, MobileNetworkInfoEntity.class}, exportSchema = false, version = 1) public abstract class MobileNetworkDatabase extends RoomDatabase { @@ -35,8 +35,6 @@ public abstract class MobileNetworkDatabase extends RoomDatabase { public abstract SubscriptionInfoDao mSubscriptionInfoDao(); - public abstract UiccInfoDao mUiccInfoDao(); - public abstract MobileNetworkInfoDao mMobileNetworkInfoDao(); private static MobileNetworkDatabase sInstance; @@ -73,16 +71,6 @@ public abstract class MobileNetworkDatabase extends RoomDatabase { } /** - * Insert the UICC info to the UiccInfoEntity table. - * - * @param uiccInfoEntity The uiccInfoEntity. - */ - public void insertUiccInfo(UiccInfoEntity... uiccInfoEntity) { - Log.d(TAG, "insertUiccInfo"); - mUiccInfoDao().insertUiccInfo(uiccInfoEntity); - } - - /** * Insert the mobileNetwork info to the MobileNetworkInfoEntity table. * * @param mobileNetworkInfoEntity The mobileNetworkInfoEntity. @@ -100,14 +88,6 @@ public abstract class MobileNetworkDatabase extends RoomDatabase { } /** - * Query the subscription info by the subscription ID from the SubscriptionInfoEntity - * table. - */ - public SubscriptionInfoEntity querySubInfoById(String id) { - return mSubscriptionInfoDao().querySubInfoById(id); - } - - /** * Query all mobileNetwork infos from the MobileNetworkInfoEntity * table. */ @@ -116,21 +96,6 @@ public abstract class MobileNetworkDatabase extends RoomDatabase { } /** - * Query the mobileNetwork info by the subscription ID from the MobileNetworkInfoEntity - * table. - */ - public MobileNetworkInfoEntity queryMobileNetworkInfoById(String id) { - return mMobileNetworkInfoDao().queryMobileNetworkInfoBySubId(id); - } - - /** - * Query all UICC infos from the UiccInfoEntity table. - */ - public LiveData<List<UiccInfoEntity>> queryAllUiccInfo() { - return mUiccInfoDao().queryAllUiccInfos(); - } - - /** * Delete the subscriptionInfo info by the subscription ID from the SubscriptionInfoEntity * table. */ @@ -145,11 +110,4 @@ public abstract class MobileNetworkDatabase extends RoomDatabase { public void deleteMobileNetworkInfoBySubId(String id) { mMobileNetworkInfoDao().deleteBySubId(id); } - - /** - * Delete the UICC info by the subscription ID from the UiccInfoEntity table. - */ - public void deleteUiccInfoBySubId(String id) { - mUiccInfoDao().deleteBySubId(id); - } } diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/MobileNetworkInfoEntity.java b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/MobileNetworkInfoEntity.java index 13f99e9387de..6366708cfb17 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/MobileNetworkInfoEntity.java +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/MobileNetworkInfoEntity.java @@ -26,11 +26,9 @@ import androidx.room.PrimaryKey; @Entity(tableName = DataServiceUtils.MobileNetworkInfoData.TABLE_NAME) public class MobileNetworkInfoEntity { - public MobileNetworkInfoEntity(@NonNull String subId, boolean isMobileDataEnabled, - boolean showToggleForPhysicalSim) { + public MobileNetworkInfoEntity(@NonNull String subId, boolean isMobileDataEnabled) { this.subId = subId; this.isMobileDataEnabled = isMobileDataEnabled; - this.showToggleForPhysicalSim = showToggleForPhysicalSim; } @PrimaryKey @@ -41,15 +39,11 @@ public class MobileNetworkInfoEntity { @ColumnInfo(name = DataServiceUtils.MobileNetworkInfoData.COLUMN_IS_MOBILE_DATA_ENABLED) public boolean isMobileDataEnabled; - @ColumnInfo(name = DataServiceUtils.MobileNetworkInfoData.COLUMN_SHOW_TOGGLE_FOR_PHYSICAL_SIM) - public boolean showToggleForPhysicalSim; - @Override public int hashCode() { int result = 17; result = 31 * result + subId.hashCode(); result = 31 * result + Boolean.hashCode(isMobileDataEnabled); - result = 31 * result + Boolean.hashCode(showToggleForPhysicalSim); return result; } @@ -64,8 +58,7 @@ public class MobileNetworkInfoEntity { MobileNetworkInfoEntity info = (MobileNetworkInfoEntity) obj; return TextUtils.equals(subId, info.subId) - && isMobileDataEnabled == info.isMobileDataEnabled - && showToggleForPhysicalSim == info.showToggleForPhysicalSim; + && isMobileDataEnabled == info.isMobileDataEnabled; } public String toString() { @@ -74,8 +67,6 @@ public class MobileNetworkInfoEntity { .append(subId) .append(", isMobileDataEnabled = ") .append(isMobileDataEnabled) - .append(", activeNetworkIsCellular = ") - .append(showToggleForPhysicalSim) .append(")}"); return builder.toString(); } diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/SubscriptionInfoEntity.java b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/SubscriptionInfoEntity.java index 88e6a57bf45b..ff0f27b05cd1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/SubscriptionInfoEntity.java +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/SubscriptionInfoEntity.java @@ -30,7 +30,7 @@ public class SubscriptionInfoEntity { public SubscriptionInfoEntity(@NonNull String subId, int simSlotIndex, boolean isEmbedded, boolean isOpportunistic, String uniqueName, boolean isSubscriptionVisible, boolean isDefaultSubscriptionSelection, boolean isValidSubscription, - boolean isActiveSubscriptionId, boolean isActiveDataSubscriptionId) { + boolean isActiveSubscriptionId) { this.subId = subId; this.simSlotIndex = simSlotIndex; this.isEmbedded = isEmbedded; @@ -40,7 +40,6 @@ public class SubscriptionInfoEntity { this.isDefaultSubscriptionSelection = isDefaultSubscriptionSelection; this.isValidSubscription = isValidSubscription; this.isActiveSubscriptionId = isActiveSubscriptionId; - this.isActiveDataSubscriptionId = isActiveDataSubscriptionId; } @PrimaryKey @@ -73,17 +72,10 @@ public class SubscriptionInfoEntity { @ColumnInfo(name = DataServiceUtils.SubscriptionInfoData.COLUMN_IS_ACTIVE_SUBSCRIPTION_ID) public boolean isActiveSubscriptionId; - @ColumnInfo(name = DataServiceUtils.SubscriptionInfoData.COLUMN_IS_ACTIVE_DATA_SUBSCRIPTION) - public boolean isActiveDataSubscriptionId; - public int getSubId() { return Integer.valueOf(subId); } - public CharSequence getUniqueDisplayName() { - return uniqueName; - } - public boolean isActiveSubscription() { return isActiveSubscriptionId; } @@ -103,8 +95,7 @@ public class SubscriptionInfoEntity { isSubscriptionVisible, isDefaultSubscriptionSelection, isValidSubscription, - isActiveSubscriptionId, - isActiveDataSubscriptionId); + isActiveSubscriptionId); } @Override @@ -125,8 +116,7 @@ public class SubscriptionInfoEntity { && isSubscriptionVisible == info.isSubscriptionVisible && isDefaultSubscriptionSelection == info.isDefaultSubscriptionSelection && isValidSubscription == info.isValidSubscription - && isActiveSubscriptionId == info.isActiveSubscriptionId - && isActiveDataSubscriptionId == info.isActiveDataSubscriptionId; + && isActiveSubscriptionId == info.isActiveSubscriptionId; } public String toString() { @@ -149,8 +139,6 @@ public class SubscriptionInfoEntity { .append(isValidSubscription) .append(", isActiveSubscriptionId = ") .append(isActiveSubscriptionId) - .append(", isActiveDataSubscriptionId = ") - .append(isActiveDataSubscriptionId) .append(")}"); return builder.toString(); } diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/UiccInfoDao.java b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/UiccInfoDao.java deleted file mode 100644 index 90e5189fdf1d..000000000000 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/UiccInfoDao.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.mobile.dataservice; - -import androidx.lifecycle.LiveData; -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.OnConflictStrategy; -import androidx.room.Query; - -import java.util.List; - -@Dao -public interface UiccInfoDao { - - @Insert(onConflict = OnConflictStrategy.REPLACE) - void insertUiccInfo(UiccInfoEntity... uiccInfo); - - @Query("SELECT * FROM " + DataServiceUtils.UiccInfoData.TABLE_NAME + " ORDER BY " - + DataServiceUtils.UiccInfoData.COLUMN_ID) - LiveData<List<UiccInfoEntity>> queryAllUiccInfos(); - - @Query("SELECT COUNT(*) FROM " + DataServiceUtils.UiccInfoData.TABLE_NAME) - int count(); - - @Query("DELETE FROM " + DataServiceUtils.UiccInfoData.TABLE_NAME + " WHERE " - + DataServiceUtils.UiccInfoData.COLUMN_ID + " = :id") - void deleteBySubId(String id); -} diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/UiccInfoEntity.java b/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/UiccInfoEntity.java deleted file mode 100644 index 0f80edf52d80..000000000000 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/dataservice/UiccInfoEntity.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.mobile.dataservice; - -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.PrimaryKey; - -@Entity(tableName = DataServiceUtils.UiccInfoData.TABLE_NAME) -public class UiccInfoEntity { - - public UiccInfoEntity(@NonNull String subId, boolean isActive) { - this.subId = subId; - this.isActive = isActive; - } - - @PrimaryKey - @ColumnInfo(name = DataServiceUtils.UiccInfoData.COLUMN_ID, index = true) - @NonNull - public String subId; - - @ColumnInfo(name = DataServiceUtils.UiccInfoData.COLUMN_IS_ACTIVE) - public boolean isActive; - - @Override - public int hashCode() { - int result = 17; - result = 31 * result + subId.hashCode(); - result = 31 * result + Boolean.hashCode(isActive); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof UiccInfoEntity)) { - return false; - } - - UiccInfoEntity info = (UiccInfoEntity) obj; - return TextUtils.equals(subId, info.subId) && isActive == info.isActive; - } - - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append(" {UiccInfoEntity(subId = ") - .append(subId) - .append(", isActive = ") - .append(isActive) - .append(")}"); - return builder.toString(); - } -} diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.kt b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.kt index c71b19c9235f..e01f27964733 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.kt +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.kt @@ -501,7 +501,7 @@ open class WifiUtils { val wifiManager = context.getSystemService(WifiManager::class.java) ?: return@launch val aapmManager = context.getSystemService(AdvancedProtectionManager::class.java) if (isAdvancedProtectionEnabled(aapmManager)) { - val intent = AdvancedProtectionManager.createSupportIntent( + val intent = aapmManager.createSupportIntent( AdvancedProtectionManager.FEATURE_ID_DISALLOW_WEP, AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION) onStartActivity(intent) diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java index 05f471f62f1d..69e99c616910 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java @@ -33,21 +33,37 @@ import android.bluetooth.BluetoothUuid; import android.content.Context; import android.os.Parcel; import android.os.ParcelUuid; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; + +import androidx.test.core.app.ApplicationProvider; + +import com.google.common.collect.ImmutableList; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import java.util.Collection; +import java.util.List; import java.util.Map; @RunWith(RobolectricTestRunner.class) public class CachedBluetoothDeviceManagerTest { + @Rule + public MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + + private final Context mContext = ApplicationProvider.getApplicationContext(); + private final static String DEVICE_NAME_1 = "TestName_1"; private final static String DEVICE_NAME_2 = "TestName_2"; private final static String DEVICE_NAME_3 = "TestName_3"; @@ -82,6 +98,8 @@ public class CachedBluetoothDeviceManagerTest { @Mock private HearingAidProfile mHearingAidProfile; @Mock + private HapClientProfile mHapClientProfile; + @Mock private CsipSetCoordinatorProfile mCsipSetCoordinatorProfile; @Mock private BluetoothDevice mDevice1; @@ -89,12 +107,11 @@ public class CachedBluetoothDeviceManagerTest { private BluetoothDevice mDevice2; @Mock private BluetoothDevice mDevice3; + private HearingAidDeviceManager mHearingAidDeviceManager; private CachedBluetoothDevice mCachedDevice1; private CachedBluetoothDevice mCachedDevice2; private CachedBluetoothDevice mCachedDevice3; private CachedBluetoothDeviceManager mCachedDeviceManager; - private HearingAidDeviceManager mHearingAidDeviceManager; - private Context mContext; private BluetoothClass createBtClass(int deviceClass) { Parcel p = Parcel.obtain(); @@ -108,8 +125,6 @@ public class CachedBluetoothDeviceManagerTest { @Before public void setUp() { - MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; when(mDevice1.getAddress()).thenReturn(DEVICE_ADDRESS_1); when(mDevice2.getAddress()).thenReturn(DEVICE_ADDRESS_2); when(mDevice3.getAddress()).thenReturn(DEVICE_ADDRESS_3); @@ -129,13 +144,15 @@ public class CachedBluetoothDeviceManagerTest { when(mA2dpProfile.isProfileReady()).thenReturn(true); when(mPanProfile.isProfileReady()).thenReturn(true); when(mHearingAidProfile.isProfileReady()).thenReturn(true); + when(mHapClientProfile.isProfileReady()).thenReturn(true); when(mCsipSetCoordinatorProfile.isProfileReady()) .thenReturn(true); doAnswer((invocation) -> mHearingAidProfile). when(mLocalProfileManager).getHearingAidProfile(); doAnswer((invocation) -> mCsipSetCoordinatorProfile) .when(mLocalProfileManager).getCsipSetCoordinatorProfile(); - mCachedDeviceManager = new CachedBluetoothDeviceManager(mContext, mLocalBluetoothManager); + mCachedDeviceManager = spy( + new CachedBluetoothDeviceManager(mContext, mLocalBluetoothManager)); mCachedDevice1 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice1)); mCachedDevice2 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice2)); mCachedDevice3 = spy(new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice3)); @@ -621,12 +638,55 @@ public class CachedBluetoothDeviceManagerTest { public void onActiveDeviceChanged_validHiSyncId_callExpectedFunction() { doNothing().when(mHearingAidDeviceManager).onActiveDeviceChanged(any()); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); - CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); - cachedDevice1.setHearingAidInfo( - new HearingAidInfo.Builder().setHiSyncId(HISYNCID1).build()); + when(mCachedDevice1.getProfiles()).thenReturn( + ImmutableList.of(mHapClientProfile, mHearingAidProfile)); + + mCachedDeviceManager.onActiveDeviceChanged(mCachedDevice1); + + verify(mHearingAidDeviceManager).onActiveDeviceChanged(mCachedDevice1); + } + + @Test + @RequiresFlagsEnabled( + com.android.settingslib.flags.Flags.FLAG_HEARING_DEVICE_SET_CONNECTION_STATUS_REPORT) + public void onActiveDeviceChanged_hearingDevice_callReportConnectionStatus() { + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.getProfiles()).thenReturn( + ImmutableList.of(mHapClientProfile, mHearingAidProfile)); + + mCachedDeviceManager.onActiveDeviceChanged(mCachedDevice1); + + verify(mHearingAidDeviceManager).notifyDevicesConnectionStatusChanged(); + } + + @Test + @RequiresFlagsEnabled( + com.android.settingslib.flags.Flags.FLAG_HEARING_DEVICE_SET_CONNECTION_STATUS_REPORT) + public void onDeviceUnpaired_hearingDevice_callReportConnectionStatus() { + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.getProfiles()).thenReturn( + ImmutableList.of(mHapClientProfile, mHearingAidProfile)); + + mCachedDeviceManager.onDeviceUnpaired(mCachedDevice1); + + verify(mHearingAidDeviceManager).notifyDevicesConnectionStatusChanged(); + } + + @Test + public void notifyHearingDevicesConnectionStatusChanged_nonHearingDevice_notCallFunction() { + when(mCachedDevice1.getProfiles()).thenReturn(List.of(mA2dpProfile)); + + mCachedDeviceManager.notifyHearingDevicesConnectionStatusChangedIfNeeded(mCachedDevice1); + + verify(mHearingAidDeviceManager, never()).notifyDevicesConnectionStatusChanged(); + } + + @Test + public void notifyHearingDevicesConnectionStatusChanged_hearingDeviceProfile_callFunction() { + when(mCachedDevice1.getProfiles()).thenReturn(List.of(mHapClientProfile)); - mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1); + mCachedDeviceManager.notifyHearingDevicesConnectionStatusChangedIfNeeded(mCachedDevice1); - verify(mHearingAidDeviceManager).onActiveDeviceChanged(cachedDevice1); + verify(mHearingAidDeviceManager).notifyDevicesConnectionStatusChanged(); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java index 30f8a798b674..d933a1ced8bc 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java @@ -2074,6 +2074,21 @@ public class CachedBluetoothDeviceTest { assertThat(mCachedDevice.getConnectionSummary(false)).isNull(); } + @Test + public void isHearingDevice_supportHearingRelatedProfiles_returnTrue() { + when(mCachedDevice.getProfiles()).thenReturn( + ImmutableList.of(mHapClientProfile, mHearingAidProfile)); + + assertThat(mCachedDevice.isHearingDevice()).isTrue(); + } + + @Test + public void isHearingDevice_supportOnlyLeAudioProfile_returnFalse() { + when(mCachedDevice.getProfiles()).thenReturn(ImmutableList.of(mLeAudioProfile)); + + assertThat(mCachedDevice.isHearingDevice()).isFalse(); + } + private void updateProfileStatus(LocalBluetoothProfile profile, int status) { doReturn(status).when(profile).getConnectionStatus(mDevice); mCachedDevice.onProfileStateChanged(profile, status); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingHelperTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingHelperTest.java index c83524462b15..dc609bd2fa93 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingHelperTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidAudioRoutingHelperTest.java @@ -16,9 +16,14 @@ package com.android.settingslib.bluetooth; +import static com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants.BUILTIN_MIC; +import static com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants.BUILTIN_SPEAKER; +import static com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants.MICROPHONE_SOURCE_VOICE_COMMUNICATION; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; @@ -35,10 +40,13 @@ import android.media.audiopolicy.AudioProductStrategy; import androidx.test.core.app.ApplicationProvider; +import com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants.RoutingValue; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.MockitoJUnit; @@ -67,28 +75,35 @@ public class HearingAidAudioRoutingHelperTest { @Spy private AudioManager mAudioManager = mContext.getSystemService(AudioManager.class); @Mock - private AudioDeviceInfo mAudioDeviceInfo; + private AudioDeviceInfo mHearingDeviceInfoOutput; + @Mock + private AudioDeviceInfo mLeHearingDeviceInfoInput; @Mock private CachedBluetoothDevice mCachedBluetoothDevice; @Mock private CachedBluetoothDevice mSubCachedBluetoothDevice; - private AudioDeviceAttributes mHearingDeviceAttribute; + private AudioDeviceAttributes mHearingDeviceAttributeOutput; private HearingAidAudioRoutingHelper mHelper; @Before public void setUp() { doReturn(mAudioManager).when(mContext).getSystemService(AudioManager.class); - when(mAudioDeviceInfo.getType()).thenReturn(AudioDeviceInfo.TYPE_HEARING_AID); - when(mAudioDeviceInfo.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); + when(mHearingDeviceInfoOutput.getType()).thenReturn(AudioDeviceInfo.TYPE_HEARING_AID); + when(mHearingDeviceInfoOutput.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); + when(mLeHearingDeviceInfoInput.getType()).thenReturn(AudioDeviceInfo.TYPE_BLE_HEADSET); + when(mLeHearingDeviceInfoInput.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); + when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); when(mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)).thenReturn( - new AudioDeviceInfo[]{mAudioDeviceInfo}); + new AudioDeviceInfo[]{mHearingDeviceInfoOutput}); + when(mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS)).thenReturn( + new AudioDeviceInfo[]{mLeHearingDeviceInfoInput}); doReturn(Collections.emptyList()).when(mAudioManager).getPreferredDevicesForStrategy( any(AudioProductStrategy.class)); when(mAudioStrategy.getAudioAttributesForLegacyStreamType( AudioManager.STREAM_MUSIC)) .thenReturn((new AudioAttributes.Builder()).build()); - mHearingDeviceAttribute = new AudioDeviceAttributes( + mHearingDeviceAttributeOutput = new AudioDeviceAttributes( AudioDeviceAttributes.ROLE_OUTPUT, AudioDeviceInfo.TYPE_HEARING_AID, TEST_DEVICE_ADDRESS); @@ -99,11 +114,10 @@ public class HearingAidAudioRoutingHelperTest { @Test public void setPreferredDeviceRoutingStrategies_hadValueThenValueAuto_callRemoveStrategy() { when(mAudioManager.getPreferredDeviceForStrategy(mAudioStrategy)).thenReturn( - mHearingDeviceAttribute); + mHearingDeviceAttributeOutput); mHelper.setPreferredDeviceRoutingStrategies(List.of(mAudioStrategy), - mHearingDeviceAttribute, - HearingAidAudioRoutingConstants.RoutingValue.AUTO); + mHearingDeviceAttributeOutput, RoutingValue.AUTO); verify(mAudioManager, atLeastOnce()).removePreferredDeviceForStrategy(mAudioStrategy); } @@ -113,8 +127,7 @@ public class HearingAidAudioRoutingHelperTest { when(mAudioManager.getPreferredDeviceForStrategy(mAudioStrategy)).thenReturn(null); mHelper.setPreferredDeviceRoutingStrategies(List.of(mAudioStrategy), - mHearingDeviceAttribute, - HearingAidAudioRoutingConstants.RoutingValue.AUTO); + mHearingDeviceAttributeOutput, RoutingValue.AUTO); verify(mAudioManager, never()).removePreferredDeviceForStrategy(mAudioStrategy); } @@ -122,63 +135,95 @@ public class HearingAidAudioRoutingHelperTest { @Test public void setPreferredDeviceRoutingStrategies_valueHearingDevice_callSetStrategy() { mHelper.setPreferredDeviceRoutingStrategies(List.of(mAudioStrategy), - mHearingDeviceAttribute, - HearingAidAudioRoutingConstants.RoutingValue.HEARING_DEVICE); + mHearingDeviceAttributeOutput, RoutingValue.HEARING_DEVICE); verify(mAudioManager, atLeastOnce()).setPreferredDeviceForStrategy(mAudioStrategy, - mHearingDeviceAttribute); + mHearingDeviceAttributeOutput); } @Test - public void setPreferredDeviceRoutingStrategies_valueDeviceSpeaker_callSetStrategy() { - final AudioDeviceAttributes speakerDevice = new AudioDeviceAttributes( - AudioDeviceAttributes.ROLE_OUTPUT, AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, ""); + public void setPreferredDeviceRoutingStrategies_valueBuiltinDevice_callSetStrategy() { mHelper.setPreferredDeviceRoutingStrategies(List.of(mAudioStrategy), - mHearingDeviceAttribute, - HearingAidAudioRoutingConstants.RoutingValue.DEVICE_SPEAKER); + mHearingDeviceAttributeOutput, RoutingValue.BUILTIN_DEVICE); verify(mAudioManager, atLeastOnce()).setPreferredDeviceForStrategy(mAudioStrategy, - speakerDevice); + BUILTIN_SPEAKER); } @Test - public void getMatchedHearingDeviceAttributes_mainHearingDevice_equalAddress() { + public void getMatchedHearingDeviceAttributesForOutput_mainHearingDevice_equalAddress() { when(mCachedBluetoothDevice.isHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); - final String targetAddress = mHelper.getMatchedHearingDeviceAttributes( + final String targetAddress = mHelper.getMatchedHearingDeviceAttributesForOutput( mCachedBluetoothDevice).getAddress(); - assertThat(targetAddress).isEqualTo(mHearingDeviceAttribute.getAddress()); + assertThat(targetAddress).isEqualTo(mHearingDeviceAttributeOutput.getAddress()); } @Test - public void getMatchedHearingDeviceAttributes_subHearingDevice_equalAddress() { + public void getMatchedHearingDeviceAttributesForOutput_subHearingDevice_equalAddress() { when(mCachedBluetoothDevice.isHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getAddress()).thenReturn(NOT_EXPECT_DEVICE_ADDRESS); when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mSubCachedBluetoothDevice); when(mSubCachedBluetoothDevice.isHearingAidDevice()).thenReturn(true); when(mSubCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); - final String targetAddress = mHelper.getMatchedHearingDeviceAttributes( + final String targetAddress = mHelper.getMatchedHearingDeviceAttributesForOutput( mCachedBluetoothDevice).getAddress(); - assertThat(targetAddress).isEqualTo(mHearingDeviceAttribute.getAddress()); + assertThat(targetAddress).isEqualTo(mHearingDeviceAttributeOutput.getAddress()); } @Test - public void getMatchedHearingDeviceAttributes_memberHearingDevice_equalAddress() { + public void getMatchedHearingDeviceAttributesForOutput_memberHearingDevice_equalAddress() { when(mSubCachedBluetoothDevice.isHearingAidDevice()).thenReturn(true); when(mSubCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); - final Set<CachedBluetoothDevice> memberDevices = new HashSet<CachedBluetoothDevice>(); + final Set<CachedBluetoothDevice> memberDevices = new HashSet<>(); memberDevices.add(mSubCachedBluetoothDevice); when(mCachedBluetoothDevice.isHearingAidDevice()).thenReturn(true); when(mCachedBluetoothDevice.getAddress()).thenReturn(NOT_EXPECT_DEVICE_ADDRESS); when(mCachedBluetoothDevice.getMemberDevice()).thenReturn(memberDevices); - final String targetAddress = mHelper.getMatchedHearingDeviceAttributes( + final String targetAddress = mHelper.getMatchedHearingDeviceAttributesForOutput( mCachedBluetoothDevice).getAddress(); - assertThat(targetAddress).isEqualTo(mHearingDeviceAttribute.getAddress()); + assertThat(targetAddress).isEqualTo(mHearingDeviceAttributeOutput.getAddress()); + } + + @Test + public void setPreferredInputDeviceForCalls_valueAuto_callClearPreset() { + when(mCachedBluetoothDevice.isHearingAidDevice()).thenReturn(true); + + mHelper.setPreferredInputDeviceForCalls(mCachedBluetoothDevice, RoutingValue.AUTO); + + verify(mAudioManager).clearPreferredDevicesForCapturePreset( + MICROPHONE_SOURCE_VOICE_COMMUNICATION); + } + + @Test + public void setPreferredInputDeviceForCalls_valueHearingDevice_callSetPresetToHearingDevice() { + final ArgumentCaptor<AudioDeviceAttributes> audioDeviceAttributesCaptor = + ArgumentCaptor.forClass(AudioDeviceAttributes.class); + when(mCachedBluetoothDevice.isHearingAidDevice()).thenReturn(true); + + mHelper.setPreferredInputDeviceForCalls(mCachedBluetoothDevice, + RoutingValue.HEARING_DEVICE); + + verify(mAudioManager).setPreferredDeviceForCapturePreset( + eq(MICROPHONE_SOURCE_VOICE_COMMUNICATION), audioDeviceAttributesCaptor.capture()); + assertThat(audioDeviceAttributesCaptor.getValue().getAddress()).isEqualTo( + TEST_DEVICE_ADDRESS); + } + + @Test + public void setPreferredInputDeviceForCalls_valueBuiltinDevice_callClearPresetToBuiltinMic() { + when(mCachedBluetoothDevice.isHearingAidDevice()).thenReturn(true); + + mHelper.setPreferredInputDeviceForCalls(mCachedBluetoothDevice, + RoutingValue.BUILTIN_DEVICE); + + verify(mAudioManager).setPreferredDeviceForCapturePreset( + MICROPHONE_SOURCE_VOICE_COMMUNICATION, BUILTIN_MIC); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java index eb73eee90f0d..21dde1fd9411 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java @@ -54,6 +54,8 @@ import android.util.FeatureFlagUtils; import androidx.test.core.app.ApplicationProvider; +import com.android.settingslib.bluetooth.HearingAidDeviceManager.ConnectionStatus; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -112,7 +114,10 @@ public class HearingAidDeviceManagerTest { private BluetoothDevice mDevice1; @Mock private BluetoothDevice mDevice2; - + @Mock + private HearingAidDeviceManager.ConnectionStatusListener mConnectionStatusListener; + @Mock + private HearingAidDeviceManager.ConnectionStatusListener mConnectionStatusListener2; private BluetoothClass createBtClass(int deviceClass) { Parcel p = Parcel.obtain(); @@ -140,6 +145,8 @@ public class HearingAidDeviceManagerTest { when(mLocalProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); when(mLocalProfileManager.getLeAudioProfile()).thenReturn(mLeAudioProfile); when(mLocalProfileManager.getHapClientProfile()).thenReturn(mHapClientProfile); + when(mHapClientProfile.getProfileId()).thenReturn(BluetoothProfile.HAP_CLIENT); + when(mLeAudioProfile.getProfileId()).thenReturn(BluetoothProfile.LE_AUDIO); when(mAudioStrategy.getAudioAttributesForLegacyStreamType( AudioManager.STREAM_MUSIC)) .thenReturn((new AudioAttributes.Builder()).build()); @@ -729,7 +736,7 @@ public class HearingAidDeviceManagerTest { @Test public void onActiveDeviceChanged_connected_callSetStrategies() { - when(mHelper.getMatchedHearingDeviceAttributes(mCachedDevice1)).thenReturn( + when(mHelper.getMatchedHearingDeviceAttributesForOutput(mCachedDevice1)).thenReturn( mHearingDeviceAttribute); when(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).thenReturn(true); doReturn(true).when(mHelper).setPreferredDeviceRoutingStrategies(anyList(), @@ -743,7 +750,7 @@ public class HearingAidDeviceManagerTest { @Test public void onActiveDeviceChanged_disconnected_callSetStrategiesWithAutoValue() { - when(mHelper.getMatchedHearingDeviceAttributes(mCachedDevice1)).thenReturn( + when(mHelper.getMatchedHearingDeviceAttributesForOutput(mCachedDevice1)).thenReturn( mHearingDeviceAttribute); when(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).thenReturn(false); doReturn(true).when(mHelper).setPreferredDeviceRoutingStrategies(anyList(), any(), @@ -826,6 +833,125 @@ public class HearingAidDeviceManagerTest { verify(mHapClientProfile).selectPreset(mDevice2, PRESET_INDEX_1); } + @Test + public void getAssociatedCachedDevice_existSubDevice_returnSize2() { + mCachedDevice1.setSubDevice(mCachedDevice2); + + //including self device + assertThat(mHearingAidDeviceManager.getAssociatedCachedDevice( + mCachedDevice1).size()).isEqualTo(2); + } + + @Test + public void getAssociatedCachedDevice_existMemberDevice_returnSize2() { + mCachedDevice1.addMemberDevice(mCachedDevice2); + + //including self device + assertThat(mHearingAidDeviceManager.getAssociatedCachedDevice( + mCachedDevice1).size()).isEqualTo(2); + } + + @Test + public void notifyDevicesConnectionStatusChanged_connecting_connectingStatus() { + when(mCachedDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.getProfiles()).thenReturn(List.of(mHapClientProfile)); + when(mHapClientProfile.getConnectionStatus(mDevice1)).thenReturn( + BluetoothProfile.STATE_CONNECTING); + + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + + assertThat(mHearingAidDeviceManager.getDevicesConnectionStatus()).isEqualTo( + ConnectionStatus.CONNECTING_OR_DISCONNECTING); + } + + @Test + public void notifyDevicesConnectionStatusChanged_activeConnectedProfile_activeStatus() { + when(mCachedDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.getProfiles()).thenReturn(List.of(mHapClientProfile, mLeAudioProfile)); + when(mLeAudioProfile.getConnectionStatus(mDevice1)).thenReturn( + BluetoothProfile.STATE_CONNECTED); + when(mCachedDevice1.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(true); + + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + + assertThat(mHearingAidDeviceManager.getDevicesConnectionStatus()).isEqualTo( + ConnectionStatus.ACTIVE); + } + + @Test + public void notifyDevicesConnectionStatusChanged_isConnected_connectedStatus() { + when(mCachedDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.getProfiles()).thenReturn(List.of(mHapClientProfile, mLeAudioProfile)); + when(mCachedDevice1.isConnected()).thenReturn(true); + + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + + assertThat(mHearingAidDeviceManager.getDevicesConnectionStatus()).isEqualTo( + ConnectionStatus.CONNECTED); + } + + @Test + public void notifyDevicesConnectionStatusChanged_bondedNotConnected_disconnectedStatus() { + when(mCachedDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.isConnected()).thenReturn(false); + when(mCachedDevice1.getProfiles()).thenReturn(List.of(mHapClientProfile)); + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + + assertThat(mHearingAidDeviceManager.getDevicesConnectionStatus()).isEqualTo( + ConnectionStatus.DISCONNECTED); + } + + @Test + public void notifyDevicesConnectionStatusChanged_bondNone_noDeviceBondedStatus() { + when(mCachedDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + + assertThat(mHearingAidDeviceManager.getDevicesConnectionStatus()).isEqualTo( + ConnectionStatus.NO_DEVICE_BONDED); + } + + @Test + public void notifyDevicesConnectionStatusChanged_noRegisteredListener_noCallback() { + when(mCachedDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.getProfiles()).thenReturn(List.of(mHapClientProfile, mLeAudioProfile)); + when(mCachedDevice1.isConnected()).thenReturn(true); + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + + mHearingAidDeviceManager.registerConnectionStatusListener( + mConnectionStatusListener, mContext.getMainExecutor()); + mHearingAidDeviceManager.unregisterConnectionStatusListener( + mConnectionStatusListener); + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + + verify(mConnectionStatusListener, never()).onDevicesConnectionStatusChanged(anyInt()); + } + + @Test + public void notifyDevicesConnectionStatusChanged_twoRegisteredListener_callbackEachConnected() { + when(mCachedDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.getProfiles()).thenReturn(List.of(mHapClientProfile, mLeAudioProfile)); + when(mCachedDevice1.isConnected()).thenReturn(true); + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + + mHearingAidDeviceManager.registerConnectionStatusListener( + mConnectionStatusListener, mContext.getMainExecutor()); + mHearingAidDeviceManager.registerConnectionStatusListener( + mConnectionStatusListener2, mContext.getMainExecutor()); + mHearingAidDeviceManager.notifyDevicesConnectionStatusChanged(); + + verify(mConnectionStatusListener).onDevicesConnectionStatusChanged( + ConnectionStatus.CONNECTED); + verify(mConnectionStatusListener2).onDevicesConnectionStatusChanged( + ConnectionStatus.CONNECTED); + } + private HearingAidInfo getLeftAshaHearingAidInfo(long hiSyncId) { return new HearingAidInfo.Builder() .setAshaDeviceSide(HearingAidInfo.DeviceSide.SIDE_LEFT) diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java index 6ff90ba4b391..219bfe0c8c53 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java @@ -37,10 +37,14 @@ import android.bluetooth.BluetoothUuid; import android.content.Context; import android.content.Intent; import android.os.ParcelUuid; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import com.android.settingslib.testutils.shadow.ShadowBluetoothAdapter; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -56,6 +60,9 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowBluetoothAdapter.class}) public class LocalBluetoothProfileManagerTest { + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + private static final long HISYNCID = 10; private static final int GROUP_ID = 1; @@ -305,6 +312,25 @@ public class LocalBluetoothProfileManagerTest { verify(mCachedBluetoothDevice).refresh(); } + @Test + @RequiresFlagsEnabled( + com.android.settingslib.flags.Flags.FLAG_HEARING_DEVICE_SET_CONNECTION_STATUS_REPORT) + public void stateChangedHandler_hapProfileStateChanged_notifyHearingDevicesConnectionStatus() { + mShadowBluetoothAdapter.setSupportedProfiles(generateList( + new int[] {BluetoothProfile.HAP_CLIENT})); + mProfileManager.updateLocalProfiles(); + + mIntent = new Intent(BluetoothHapClient.ACTION_HAP_CONNECTION_STATE_CHANGED); + mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice); + mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING); + mIntent.putExtra(BluetoothProfile.EXTRA_STATE, BluetoothProfile.STATE_CONNECTED); + + mContext.sendBroadcast(mIntent); + + verify(mDeviceManager).notifyHearingDevicesConnectionStatusChangedIfNeeded( + mCachedBluetoothDevice); + } + private List<Integer> generateList(int[] profiles) { if (profiles == null) { return null; diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java index 18bebd40b03a..b9f8c714175e 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java @@ -289,5 +289,6 @@ public class SecureSettings { Settings.Secure.MANDATORY_BIOMETRICS_REQUIREMENTS_SATISFIED, Settings.Secure.ADVANCED_PROTECTION_MODE, Settings.Secure.ACCESSIBILITY_KEY_GESTURE_TARGETS, + Settings.Secure.EM_VALUE, }; } diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java index f1bbfc62681a..5b4ee8bdb339 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java @@ -110,6 +110,7 @@ public class SystemSettings { Settings.System.MOUSE_REVERSE_VERTICAL_SCROLLING, Settings.System.MOUSE_SCROLLING_ACCELERATION, Settings.System.MOUSE_SWAP_PRIMARY_BUTTON, + Settings.System.MOUSE_POINTER_ACCELERATION_ENABLED, Settings.System.TOUCHPAD_POINTER_SPEED, Settings.System.TOUCHPAD_NATURAL_SCROLLING, Settings.System.TOUCHPAD_TAP_TO_CLICK, diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java index 1d7608d7d4d0..7c5e577b1d93 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java @@ -445,6 +445,8 @@ public class SecureSettingsValidators { Secure.RESOLUTION_MODE_UNKNOWN, Secure.RESOLUTION_MODE_FULL)); VALIDATORS.put(Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, new InclusiveIntegerRangeValidator(0, 10)); + VALIDATORS.put(Secure.EM_VALUE, + new InclusiveIntegerRangeValidator(0, 1)); VALIDATORS.put(Secure.CHARGE_OPTIMIZATION_MODE, new InclusiveIntegerRangeValidator(0, 10)); VALIDATORS.put(Secure.ON_DEVICE_INFERENCE_UNBIND_TIMEOUT_MS, ANY_LONG_VALIDATOR); VALIDATORS.put(Secure.ON_DEVICE_INTELLIGENCE_UNBIND_TIMEOUT_MS, ANY_LONG_VALIDATOR); diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java index 6abd9b73e26d..0432eeacec4d 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java @@ -226,6 +226,7 @@ public class SystemSettingsValidators { VALIDATORS.put(System.MOUSE_REVERSE_VERTICAL_SCROLLING, BOOLEAN_VALIDATOR); VALIDATORS.put(System.MOUSE_SWAP_PRIMARY_BUTTON, BOOLEAN_VALIDATOR); VALIDATORS.put(System.MOUSE_SCROLLING_ACCELERATION, BOOLEAN_VALIDATOR); + VALIDATORS.put(System.MOUSE_POINTER_ACCELERATION_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put(System.TOUCHPAD_POINTER_SPEED, new InclusiveIntegerRangeValidator(-7, 7)); VALIDATORS.put(System.TOUCHPAD_NATURAL_SCROLLING, BOOLEAN_VALIDATOR); VALIDATORS.put(System.TOUCHPAD_TAP_TO_CLICK, BOOLEAN_VALIDATOR); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 661a09553914..dedd7ebd1ef7 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -2186,6 +2186,10 @@ class SettingsProtoDumpUtil { SecureSettingsProto.EvenDimmer.EVEN_DIMMER_MIN_NITS); p.end(evenDimmerToken); + dumpSetting(s, p, + Settings.Secure.EM_VALUE, + SecureSettingsProto.Accessibility.EM_VALUE); + final long gestureToken = p.start(SecureSettingsProto.GESTURE); dumpSetting(s, p, Settings.Secure.AWARE_ENABLED, diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 3ee2db10d7e5..b88ae3751d22 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -278,13 +278,13 @@ filegroup { "tests/src/**/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImplTest.kt", "tests/src/**/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandlerTest.kt", "tests/src/**/systemui/qs/tiles/HotspotTileTest.java", - "tests/src/**/systemui/qs/tiles/dialog/InternetDialogDelegateTest.java", + "tests/src/**/systemui/qs/tiles/dialog/InternetDialogDelegateLegacyTest.java", "tests/src/**/systemui/navigationbar/NavigationBarControllerImplTest.java", "tests/src/**/systemui/wmshell/BubblesTest.java", "tests/src/**/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java", "tests/src/**/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java", "tests/src/**/systemui/shared/system/RemoteTransitionTest.java", - "tests/src/**/systemui/qs/tiles/dialog/InternetDialogDelegateControllerTest.java", + "tests/src/**/systemui/qs/tiles/dialog/InternetDetailsContentControllerTest.java", "tests/src/**/systemui/qs/external/TileLifecycleManagerTest.java", "tests/src/**/systemui/ScreenDecorationsTest.java", "tests/src/**/systemui/statusbar/policy/BatteryControllerStartableTest.java", diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 87fb58ee359e..7d201c18a141 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -492,7 +492,7 @@ flag { name: "status_bar_notification_chips" namespace: "systemui" description: "Show promoted ongoing notifications as chips in the status bar" - bug: "361346412" + bug: "364653005" } flag { @@ -753,13 +753,6 @@ flag { } flag { - name: "screenshot_context_url" - namespace: "systemui" - description: "Include optional app-provided context URL when sharing a screenshot." - bug: "242791070" -} - -flag { name: "run_fingerprint_detect_on_dismissible_keyguard" namespace: "systemui" description: "Run fingerprint detect instead of authenticate if the keyguard is dismissible." diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/effect/ContentOverscrollEffect.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/ContentOverscrollEffect.kt index 2233debde277..4ee6db3d516c 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/effect/ContentOverscrollEffect.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/ContentOverscrollEffect.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.compose.animation.scene.effect +package com.android.compose.gesture.effect import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.AnimationSpec @@ -118,56 +118,3 @@ open class BaseContentOverscrollEffect( } } } - -/** An overscroll effect that ensures only a single fling animation is triggered. */ -internal class GestureEffect(private val delegate: ContentOverscrollEffect) : - ContentOverscrollEffect by delegate { - private var shouldFling = false - - override fun applyToScroll( - delta: Offset, - source: NestedScrollSource, - performScroll: (Offset) -> Offset, - ): Offset { - shouldFling = true - return delegate.applyToScroll(delta, source, performScroll) - } - - override suspend fun applyToFling( - velocity: Velocity, - performFling: suspend (Velocity) -> Velocity, - ) { - if (!shouldFling) { - performFling(velocity) - return - } - shouldFling = false - delegate.applyToFling(velocity, performFling) - } - - suspend fun ensureApplyToFlingIsCalled() { - 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/src/com/android/compose/animation/scene/effect/OffsetOverscrollEffect.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/OffsetOverscrollEffect.kt index f459c46d3e6f..d9924038d8ef 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/effect/OffsetOverscrollEffect.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/effect/OffsetOverscrollEffect.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.compose.animation.scene.effect +package com.android.compose.gesture.effect import androidx.annotation.VisibleForTesting import androidx.compose.animation.core.AnimationSpec @@ -34,7 +34,6 @@ import androidx.compose.ui.node.LayoutModifierNode import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp -import com.android.compose.animation.scene.ProgressConverter import kotlin.math.roundToInt import kotlinx.coroutines.CoroutineScope @@ -80,7 +79,7 @@ class OffsetOverscrollEffect( ) @VisibleForTesting - internal fun computeOffset(density: Density, overscrollDistance: Float): Int { + fun computeOffset(density: Density, overscrollDistance: Float): Int { val maxDistancePx = with(density) { MaxDistance.toPx() } val progress = ProgressConverter.Default.convert(overscrollDistance / maxDistancePx) return (progress * maxDistancePx).roundToInt() @@ -98,3 +97,35 @@ fun rememberOffsetOverscrollEffect( 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 + + companion object { + /** Starts linearly with some resistance and slowly approaches to 0.2f */ + val Default = tanh(maxProgress = 0.2f, tilt = 3f) + + /** + * The scroll stays linear, with [factor] you can control how much resistance there is. + * + * @param factor If you choose a value between 0f and 1f, the progress will grow more + * slowly, like there's resistance. A value of 1f means there's no resistance. + */ + fun linear(factor: Float = 1f) = ProgressConverter { it * factor } + + /** + * This function starts linear and slowly approaches [maxProgress]. + * + * See a [visual representation](https://www.desmos.com/calculator/usgvvf0z1u) of this + * function. + * + * @param maxProgress is the maximum progress value. + * @param tilt behaves similarly to the factor in the [linear] function, and allows you to + * control how quickly you get to the [maxProgress]. + */ + fun tanh(maxProgress: Float, tilt: Float = 1f) = ProgressConverter { + maxProgress * kotlin.math.tanh(x = it / (maxProgress * tilt)) + } + } +} diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/ui/util/SpaceVectorConverter.kt b/packages/SystemUI/compose/core/src/com/android/compose/ui/util/SpaceVectorConverter.kt index ca50e778d131..ca50e778d131 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/ui/util/SpaceVectorConverter.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/ui/util/SpaceVectorConverter.kt diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/effect/OffsetOverscrollEffectTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/effect/OffsetOverscrollEffectTest.kt index da8fe3094448..5a3f240deb44 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/effect/OffsetOverscrollEffectTest.kt +++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/effect/OffsetOverscrollEffectTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.compose.animation.scene.effect +package com.android.compose.gesture.effect import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.rememberScrollableState diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt index 9ab281217fbd..9c53afecad11 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt @@ -20,6 +20,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.blur import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.BlendMode @@ -43,6 +44,7 @@ import com.android.compose.animation.scene.SceneTransitionLayout import com.android.compose.animation.scene.Swipe import com.android.compose.animation.scene.observableTransitionState import com.android.compose.animation.scene.transitions +import com.android.compose.modifiers.thenIf import com.android.systemui.communal.shared.model.CommunalBackgroundType import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.communal.shared.model.CommunalTransitionKeys @@ -158,6 +160,7 @@ fun CommunalContainer( transitions = sceneTransitions, ) } + val isUiBlurred by viewModel.isUiBlurred.collectAsStateWithLifecycle() val detector = remember { CommunalSwipeDetector() } @@ -174,9 +177,11 @@ fun CommunalContainer( onDispose { viewModel.setTransitionState(null) } } + val blurRadius = with(LocalDensity.current) { viewModel.blurRadiusPx.toDp() } + SceneTransitionLayout( state = state, - modifier = modifier.fillMaxSize(), + modifier = modifier.fillMaxSize().thenIf(isUiBlurred) { Modifier.blur(blurRadius) }, swipeSourceDetector = detector, swipeDetector = detector, ) { 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 7956d0293a1d..9643f192e066 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 @@ -34,7 +34,6 @@ import androidx.compose.ui.unit.IntRect import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope import com.android.compose.modifiers.padding -import com.android.compose.modifiers.thenIf import com.android.systemui.compose.modifiers.sysuiResTag import com.android.systemui.keyguard.ui.composable.LockscreenLongPress import com.android.systemui.keyguard.ui.composable.section.AmbientIndicationSection @@ -97,18 +96,15 @@ constructor( ) } - Box { + Box(modifier = Modifier.fillMaxWidth()) { with(topAreaSection) { DefaultClockLayout( smartSpacePaddingTop = viewModel::getSmartSpacePaddingTop, isShadeLayoutWide = isShadeLayoutWide, modifier = - Modifier.thenIf(isShadeLayoutWide) { - Modifier.fillMaxWidth(0.5f) - } - .graphicsLayer { - translationX = unfoldTranslations.start - }, + Modifier.fillMaxWidth().graphicsLayer { + translationX = unfoldTranslations.start + }, ) } if (isShadeLayoutWide && !isBypassEnabled) { diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt index eae46e90557a..fb01e7039edd 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt @@ -81,10 +81,7 @@ constructor( .padding(horizontal = dimensionResource(R.dimen.clock_padding_start)) .padding(top = { smallTopMargin }) .onTopPlacementChanged(onTopChanged) - .burnInAware( - viewModel = aodBurnInViewModel, - params = burnInParams, - ) + .burnInAware(viewModel = aodBurnInViewModel, params = burnInParams) .element(smallClockElementKey), ) } @@ -114,10 +111,7 @@ constructor( val dir = if (transition.toContent == splitShadeLargeClockScene) -1f else 1f val distance = dir * getClockCenteringDistance() val largeClock = checkNotNull(currentClock).largeClock - largeClock.animations.onPositionUpdated( - distance = distance, - fraction = progress, - ) + largeClock.animations.onPositionUpdated(distance = distance, fraction = progress) } Element(key = largeClockElementKey, modifier = modifier) { @@ -125,6 +119,16 @@ constructor( AndroidView( factory = { context -> FrameLayout(context).apply { + // By default, ViewGroups like FrameLayout clip their children. Turning + // off the clipping allows the child view to render outside of its + // bounds - letting the step animation of the clock push the digits out + // when needed. + // + // Note that, in Compose, clipping is actually disabled by default so + // there's no need to propagate this up the composable hierarchy. + clipChildren = false + clipToPadding = false + ensureClockViewExists(checkNotNull(currentClock).largeClock.view) } }, @@ -136,8 +140,8 @@ constructor( .burnInAware( viewModel = aodBurnInViewModel, params = burnInParams, - isClock = true - ) + isClock = true, + ), ) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt index 58bfd08dfdbc..46e0efa79ef5 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt @@ -284,8 +284,9 @@ fun ContentScope.NotificationScrollingStack( viewModel: NotificationsPlaceholderViewModel, maxScrimTop: () -> Float, shouldPunchHoleBehindScrim: Boolean, + stackTopPadding: Dp, + stackBottomPadding: Dp, shouldFillMaxSize: Boolean = true, - shouldReserveSpaceForNavBar: Boolean = true, shouldIncludeHeadsUpSpace: Boolean = true, shouldShowScrim: Boolean = true, supportNestedScrolling: Boolean, @@ -307,10 +308,7 @@ fun ContentScope.NotificationScrollingStack( val expansionFraction by viewModel.expandFraction.collectAsStateWithLifecycle(0f) val shadeToQsFraction by viewModel.shadeToQsFraction.collectAsStateWithLifecycle(0f) - val topPadding = dimensionResource(id = R.dimen.notification_side_paddings) val navBarHeight = WindowInsets.systemBars.asPaddingValues().calculateBottomPadding() - val bottomPadding = if (shouldReserveSpaceForNavBar) navBarHeight else 0.dp - val screenHeight = with(density) { LocalConfiguration.current.screenHeightDp.dp.toPx() } /** @@ -363,8 +361,9 @@ fun ContentScope.NotificationScrollingStack( val shadeScrollState by remember { derivedStateOf { ShadeScrollState( - // we are not scrolled to the top unless the scrim is at its maximum offset. - isScrolledToTop = scrimOffset.value >= 0f, + // we are not scrolled to the top unless the scroll position is zero, + // and the scrim is at its maximum offset + isScrolledToTop = scrimOffset.value >= 0f && scrollState.value == 0, scrollPosition = scrollState.value, maxScrollPosition = scrollState.maxValue, ) @@ -574,7 +573,7 @@ fun ContentScope.NotificationScrollingStack( } .stackVerticalOverscroll(coroutineScope) { scrollState.canScrollForward } .verticalScroll(scrollState) - .padding(top = topPadding) + .padding(top = stackTopPadding, bottom = stackBottomPadding) .fillMaxWidth() .onGloballyPositioned { coordinates -> stackBoundsOnScreen.value = coordinates.boundsInWindow() @@ -587,11 +586,10 @@ fun ContentScope.NotificationScrollingStack( !shouldUseLockscreenStackBounds(layoutState.transitionState) }, modifier = - Modifier.notificationStackHeight( - view = stackScrollView, - totalVerticalPadding = topPadding + bottomPadding, - ) - .onSizeChanged { size -> stackHeight.intValue = size.height }, + Modifier.notificationStackHeight(view = stackScrollView).onSizeChanged { + size -> + stackHeight.intValue = size.height + }, ) Spacer( modifier = @@ -607,7 +605,7 @@ fun ContentScope.NotificationScrollingStack( stackScrollView = stackScrollView, viewModel = viewModel, useHunBounds = { !shouldUseLockscreenHunBounds(layoutState.transitionState) }, - modifier = Modifier.padding(top = topPadding), + modifier = Modifier.padding(top = stackTopPadding), ) } } 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 5790c4af0d77..9eb1f68dd669 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 @@ -16,12 +16,15 @@ package com.android.systemui.notifications.ui.composable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.layoutId +import androidx.compose.ui.res.dimensionResource import com.android.compose.animation.scene.ContentScope import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.UserAction @@ -34,6 +37,7 @@ import com.android.systemui.keyguard.ui.composable.section.DefaultClockSection import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.notifications.ui.viewmodel.NotificationsShadeOverlayActionsViewModel import com.android.systemui.notifications.ui.viewmodel.NotificationsShadeOverlayContentViewModel +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 @@ -61,7 +65,6 @@ constructor( private val clockSection: DefaultClockSection, private val clockInteractor: KeyguardClockInteractor, ) : Overlay { - override val key = Overlays.NotificationsShade private val actionsViewModel: NotificationsShadeOverlayActionsViewModel by lazy { @@ -76,6 +79,9 @@ constructor( @Composable override fun ContentScope.Content(modifier: Modifier) { + + val notificationStackPadding = dimensionResource(id = R.dimen.notification_side_paddings) + val viewModel = rememberViewModel("NotificationsShadeOverlay-viewModel") { contentViewModelFactory.create() @@ -90,47 +96,52 @@ constructor( modifier = modifier, onScrimClicked = viewModel::onScrimClicked, ) { - Column { - if (viewModel.showHeader) { - val burnIn = rememberBurnIn(clockInteractor) + 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, - onTopChanged = burnIn.onSmallClockTopChanged, - modifier = Modifier.fillMaxWidth(), + CollapsedShadeHeader( + viewModelFactory = viewModel.shadeHeaderViewModelFactory, + createTintedIconManager = tintedIconManagerFactory::create, + createBatteryMeterViewController = + batteryMeterViewControllerFactory::create, + statusBarIconController = statusBarIconController, + modifier = + Modifier.element(NotificationsShade.Elements.StatusBar) + .layoutId(SingleShadeMeasurePolicy.LayoutId.ShadeHeader), ) - } - } - NotificationScrollingStack( - shadeSession = shadeSession, - stackScrollView = stackScrollView.get(), - viewModel = placeholderViewModel, - maxScrimTop = { 0f }, - shouldPunchHoleBehindScrim = false, - shouldFillMaxSize = false, - shouldReserveSpaceForNavBar = false, - shouldShowScrim = false, - supportNestedScrolling = false, - modifier = Modifier.fillMaxWidth(), - ) + with(clockSection) { + SmallClock( + burnInParams = burnIn.parameters, + onTopChanged = burnIn.onSmallClockTopChanged, + modifier = Modifier.fillMaxWidth(), + ) + } + } + NotificationScrollingStack( + shadeSession = shadeSession, + stackScrollView = stackScrollView.get(), + viewModel = placeholderViewModel, + maxScrimTop = { 0f }, + 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. NotificationStackCutoffGuideline( stackScrollView = stackScrollView.get(), viewModel = placeholderViewModel, + modifier = + Modifier.align(Alignment.BottomCenter) + .padding(bottom = notificationStackPadding), ) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt index 52adaf2a5b5d..26cf7066124a 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt @@ -74,7 +74,6 @@ import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.animateSceneDpAsState import com.android.compose.animation.scene.animateSceneFloatAsState import com.android.compose.animation.scene.content.state.TransitionState -import com.android.compose.modifiers.padding import com.android.compose.modifiers.thenIf import com.android.compose.windowsizeclass.LocalWindowSizeClass import com.android.systemui.battery.BatteryMeterViewController @@ -433,12 +432,15 @@ private fun SceneScope.QuickSettingsScene( // A 1 pixel is added to compensate for any kind of rounding errors to make sure 100% that // the notification stack is entirely "below" the entire screen. val minNotificationStackTop = screenHeight.roundToInt() + 1 + val notificationStackPadding = dimensionResource(id = R.dimen.notification_side_paddings) NotificationScrollingStack( shadeSession = shadeSession, stackScrollView = notificationStackScrollView, viewModel = notificationsPlaceholderViewModel, maxScrimTop = { minNotificationStackTop.toFloat() }, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, + stackTopPadding = notificationStackPadding, + stackBottomPadding = navBarBottomHeight, shouldIncludeHeadsUpSpace = false, supportNestedScrolling = true, modifier = @@ -453,7 +455,12 @@ private fun SceneScope.QuickSettingsScene( Modifier.align(Alignment.BottomCenter) .navigationBarsPadding() .offset { IntOffset(x = 0, y = minNotificationStackTop) } - .padding(horizontal = shadeHorizontalPadding), + .padding( + start = shadeHorizontalPadding, + top = 0.dp, + end = shadeHorizontalPadding, + bottom = navBarBottomHeight, + ), ) } } 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 3327fc020da3..f052e60246d2 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 @@ -103,12 +103,15 @@ constructor( onScrimClicked = viewModel::onScrimClicked, ) { Column { - CollapsedShadeHeader( - viewModelFactory = viewModel.shadeHeaderViewModelFactory, - createTintedIconManager = tintedIconManagerFactory::create, - createBatteryMeterViewController = batteryMeterViewControllerFactory::create, - statusBarIconController = statusBarIconController, - ) + if (viewModel.showHeader) { + CollapsedShadeHeader( + viewModelFactory = viewModel.shadeHeaderViewModelFactory, + createTintedIconManager = tintedIconManagerFactory::create, + createBatteryMeterViewController = + batteryMeterViewControllerFactory::create, + statusBarIconController = statusBarIconController, + ) + } ShadeBody(viewModel = viewModel.quickSettingsContainerViewModel) } @@ -178,8 +181,8 @@ fun ContentScope.QuickSettingsLayout( Column( verticalArrangement = Arrangement.spacedBy(QuickSettingsShade.Dimensions.Padding), horizontalAlignment = Alignment.CenterHorizontally, - modifier = modifier - .padding( + modifier = + modifier.padding( start = QuickSettingsShade.Dimensions.Padding, end = QuickSettingsShade.Dimensions.Padding, bottom = QuickSettingsShade.Dimensions.Padding, 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 cfbe6671db02..ffdf509174d5 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 @@ -58,7 +58,7 @@ 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.animation.scene.effect.rememberOffsetOverscrollEffect +import com.android.compose.gesture.effect.rememberOffsetOverscrollEffect import com.android.compose.windowsizeclass.LocalWindowSizeClass import com.android.systemui.res.R diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt index aefe83b781e0..0d3bab24f68f 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt @@ -36,7 +36,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.overscroll @@ -76,7 +75,6 @@ import com.android.compose.modifiers.thenIf import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout -import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius import com.android.systemui.compose.modifiers.sysuiResTag import com.android.systemui.dagger.SysUISingleton import com.android.systemui.lifecycle.ExclusiveActivatable @@ -283,7 +281,7 @@ private fun SceneScope.SingleShade( key = MediaLandscapeTopOffset, canOverflow = false, ) - + val notificationStackPadding = dimensionResource(id = R.dimen.notification_side_paddings) val navBarHeight = WindowInsets.systemBars.asPaddingValues().calculateBottomPadding() val mediaOffsetProvider = remember { @@ -383,6 +381,8 @@ private fun SceneScope.SingleShade( viewModel = notificationsPlaceholderViewModel, maxScrimTop = { maxNotifScrimTop.toFloat() }, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, + stackTopPadding = notificationStackPadding, + stackBottomPadding = navBarHeight, supportNestedScrolling = true, onEmptySpaceClick = viewModel::onEmptySpaceClicked.takeIf { isEmptySpaceClickable }, @@ -422,8 +422,6 @@ private fun SceneScope.SplitShade( modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { - val screenCornerRadius = LocalScreenCornerRadius.current - val isCustomizing by viewModel.qsSceneAdapter.isCustomizing.collectAsStateWithLifecycle() val isQsEnabled by viewModel.isQsEnabled.collectAsStateWithLifecycle() val isCustomizerShowing by @@ -444,6 +442,7 @@ private fun SceneScope.SplitShade( val unfoldTranslationXForEndSide by viewModel.unfoldTranslationX(isOnStartSide = false).collectAsStateWithLifecycle(0f) + val notificationStackPadding = dimensionResource(id = R.dimen.notification_side_paddings) val navBarBottomHeight = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() val bottomPadding by animateDpAsState( @@ -604,8 +603,9 @@ private fun SceneScope.SplitShade( stackScrollView = notificationStackScrollView, viewModel = notificationsPlaceholderViewModel, maxScrimTop = { 0f }, + stackTopPadding = notificationStackPadding, + stackBottomPadding = notificationStackPadding, shouldPunchHoleBehindScrim = false, - shouldReserveSpaceForNavBar = false, supportNestedScrolling = false, onEmptySpaceClick = viewModel::onEmptySpaceClicked.takeIf { isEmptySpaceClickable }, @@ -624,7 +624,9 @@ private fun SceneScope.SplitShade( NotificationStackCutoffGuideline( stackScrollView = notificationStackScrollView, viewModel = notificationsPlaceholderViewModel, - modifier = Modifier.align(Alignment.BottomCenter).navigationBarsPadding(), + modifier = + Modifier.align(Alignment.BottomCenter) + .padding(bottom = notificationStackPadding + navBarBottomHeight), ) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt index 1480db9de701..5f991fbb50df 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt @@ -101,20 +101,21 @@ fun VolumeSlider( Column(modifier) { Row( horizontalArrangement = Arrangement.spacedBy(12.dp), - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().height(40.dp), + verticalAlignment = Alignment.CenterVertically, ) { state.icon?.let { Icon( icon = it, tint = MaterialTheme.colorScheme.onSurface, - modifier = Modifier.size(40.dp).padding(8.dp), + modifier = Modifier.size(24.dp), ) } Text( text = state.label, style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface, - modifier = Modifier.weight(1f).align(Alignment.CenterVertically), + modifier = Modifier.weight(1f), ) button?.invoke() } @@ -125,43 +126,47 @@ fun VolumeSlider( onValueChangeFinished = onValueChangeFinished, enabled = state.isEnabled, modifier = - Modifier.height(40.dp).sysuiResTag(state.label).clearAndSetSemantics { - if (state.isEnabled) { - contentDescription = state.label - state.a11yClickDescription?.let { - customActions = - listOf( - CustomAccessibilityAction(it) { - onIconTapped() - true - } - ) - } - - state.a11yStateDescription?.let { stateDescription = it } - progressBarRangeInfo = ProgressBarRangeInfo(state.value, state.valueRange) - } else { - disabled() - contentDescription = - state.disabledMessage?.let { "${state.label}, $it" } ?: state.label - } - setProgress { targetValue -> - val targetDirection = - when { - targetValue > value -> 1 - targetValue < value -> -1 - else -> 0 + Modifier.height(40.dp) + .padding(vertical = 8.dp) + .sysuiResTag(state.label) + .clearAndSetSemantics { + if (state.isEnabled) { + contentDescription = state.label + state.a11yClickDescription?.let { + customActions = + listOf( + CustomAccessibilityAction(it) { + onIconTapped() + true + } + ) } - val newValue = - (value + targetDirection * state.a11yStep).coerceIn( - state.valueRange.start, - state.valueRange.endInclusive, - ) - onValueChange(newValue) - true - } - }, + state.a11yStateDescription?.let { stateDescription = it } + progressBarRangeInfo = + ProgressBarRangeInfo(state.value, state.valueRange) + } else { + disabled() + contentDescription = + state.disabledMessage?.let { "${state.label}, $it" } ?: state.label + } + setProgress { targetValue -> + val targetDirection = + when { + targetValue > value -> 1 + targetValue < value -> -1 + else -> 0 + } + + val newValue = + (value + targetDirection * state.a11yStep).coerceIn( + state.valueRange.start, + state.valueRange.endInclusive, + ) + onValueChange(newValue) + true + } + }, ) } } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt index b0d9fcd4344b..8865a079733a 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt @@ -1307,8 +1307,7 @@ private inline fun <T> computeValue( val currentContent = currentContentState.contents.last() - // The element is shared: interpolate between the value in fromContent and the value in - // toContent. + // The element is shared: interpolate between the value in fromContent and toContent. // TODO(b/290184746): Support non linear shared paths as well as a way to make sure that shared // elements follow the finger direction. val isSharedElement = fromState != null && toState != null @@ -1343,153 +1342,52 @@ private inline fun <T> computeValue( // The content for which we compute the transformation. Note that this is not necessarily // [currentContent] because [currentContent] could be a different content than the transition // fromContent or toContent during interruptions or when a ancestor transition is running. - val content: ContentKey + val transformationContentKey: ContentKey = + getTransformationContentKey( + isDisabledSharedElement = isSharedElement, + currentContent = currentContent, + layoutImpl = layoutImpl, + transition = transition, + element = element, + currentSceneState = currentSceneState, + ) // Get the transformed value, i.e. the target value at the beginning (for entering elements) or // end (for leaving elements) of the transition. - val contentState: Element.State - when { - isSharedElement -> { - content = currentContent - contentState = currentContentState - } - isAncestorTransition(layoutImpl, transition) -> { - if ( - fromState != null && - transition.transformationSpec.hasTransformation(element.key, fromContent) - ) { - content = fromContent - contentState = fromState - } else if ( - toState != null && - transition.transformationSpec.hasTransformation(element.key, toContent) - ) { - content = toContent - contentState = toState - } else { - throw IllegalStateException( - "Ancestor transition is active but no transformation " + - "spec was found. The ancestor transition should have only been selected " + - "when a transformation for that element and content was defined." - ) - } - } - currentSceneState != null && currentContent == transition.currentScene -> { - content = currentContent - contentState = currentSceneState - } - fromState != null -> { - content = fromContent - contentState = fromState - } - else -> { - content = toContent - contentState = toState!! - } - } + val targetState: Element.State = element.stateByContent.getValue(transformationContentKey) + val idleValue = contentValue(targetState) val transformationWithRange = - transformation(transition.transformationSpec.transformations(element.key, content)) - - val previewTransformation = - transition.previewTransformationSpec?.let { - transformation(it.transformations(element.key, content)) - } - if (previewTransformation != null) { - val isInPreviewStage = transition.isInPreviewStage - - val idleValue = contentValue(contentState) - val isEntering = content == toContent - val previewTargetValue = - with( - previewTransformation.transformation.requireInterpolatedTransformation( - element, - transition, - ) { - "Custom transformations in preview specs should not be possible" - } - ) { - layoutImpl.propertyTransformationScope.transform( - content, - element.key, - transition, - idleValue, - ) - } - - val targetValueOrNull = - transformationWithRange?.let { transformation -> - with( - transformation.transformation.requireInterpolatedTransformation( - element, - transition, - ) { - "Custom transformations are not allowed for properties with a preview" - } - ) { - layoutImpl.propertyTransformationScope.transform( - content, - element.key, - transition, - idleValue, - ) - } - } + transformation( + transition.transformationSpec.transformations(element.key, transformationContentKey) + ) - // Make sure we don't read progress if values are the same and we don't need to interpolate, - // so we don't invalidate the phase where this is read. + val isElementEntering = when { - isInPreviewStage && isEntering && previewTargetValue == targetValueOrNull -> - return previewTargetValue - isInPreviewStage && !isEntering && idleValue == previewTargetValue -> return idleValue - previewTargetValue == targetValueOrNull && idleValue == previewTargetValue -> - return idleValue - else -> {} + transformationContentKey == toContent -> true + transformationContentKey == fromContent -> false + isAncestorTransition(layoutImpl, transition) -> + isEnteringAncestorTransition(layoutImpl, transition) + transformationContentKey == transition.currentScene -> toState == null + else -> transformationContentKey == toContent } - val previewProgress = transition.previewProgress - // progress is not needed for all cases of the below when block, therefore read it lazily - // TODO(b/290184746): Make sure that we don't overflow transformations associated to a range - val previewRangeProgress = - previewTransformation.range?.progress(previewProgress) ?: previewProgress - - if (isInPreviewStage) { - // if we're in the preview stage of the transition, interpolate between start state and - // preview target state: - return if (isEntering) { - // i.e. in the entering case between previewTargetValue and targetValue (or - // idleValue if no transformation is defined in the second stage transition)... - lerp(previewTargetValue, targetValueOrNull ?: idleValue, previewRangeProgress) - } else { - // ...and in the exiting case between the idleValue and the previewTargetValue. - lerp(idleValue, previewTargetValue, previewRangeProgress) - } + val previewTransformation = + transition.previewTransformationSpec?.let { + transformation(it.transformations(element.key, transformationContentKey)) } - // if we're in the second stage of the transition, interpolate between the state the - // element was left at the end of the preview-phase and the target state: - return if (isEntering) { - // i.e. in the entering case between preview-end-state and the idleValue... - lerp( - lerp(previewTargetValue, targetValueOrNull ?: idleValue, previewRangeProgress), - idleValue, - transformationWithRange?.range?.progress(transition.progress) ?: transition.progress, - ) - } else { - if (targetValueOrNull == null) { - // ... and in the exiting case, the element should remain in the preview-end-state - // if no further transformation is defined in the second-stage transition... - lerp(idleValue, previewTargetValue, previewRangeProgress) - } else { - // ...and otherwise it should be interpolated between preview-end-state and - // targetValue - lerp( - lerp(idleValue, previewTargetValue, previewRangeProgress), - targetValueOrNull, - transformationWithRange.range?.progress(transition.progress) - ?: transition.progress, - ) - } - } + if (previewTransformation != null) { + return computePreviewTransformationValue( + transition, + idleValue, + transformationContentKey, + isElementEntering, + previewTransformation, + element, + layoutImpl, + transformationWithRange, + lerp, + ) } if (transformationWithRange == null) { @@ -1504,7 +1402,7 @@ private inline fun <T> computeValue( is CustomPropertyTransformation -> return with(transformation) { layoutImpl.propertyTransformationScope.transform( - content, + transformationContentKey, element.key, transition, transition.coroutineScope, @@ -1515,11 +1413,10 @@ private inline fun <T> computeValue( } } - val idleValue = contentValue(contentState) val targetValue = with(transformation) { layoutImpl.propertyTransformationScope.transform( - content, + transformationContentKey, element.key, transition, idleValue, @@ -1536,23 +1433,167 @@ private inline fun <T> computeValue( // TODO(b/290184746): Make sure that we don't overflow transformations associated to a range. val rangeProgress = transformationWithRange.range?.progress(progress) ?: progress - // Interpolate between the value at rest and the value before entering/after leaving. - val isEntering = - when { - content == toContent -> true - content == fromContent -> false - isAncestorTransition(layoutImpl, transition) -> - isEnteringAncestorTransition(layoutImpl, transition) - content == transition.currentScene -> toState == null - else -> content == toContent - } - return if (isEntering) { + return if (isElementEntering) { lerp(targetValue, idleValue, rangeProgress) } else { lerp(idleValue, targetValue, rangeProgress) } } +private fun getTransformationContentKey( + isDisabledSharedElement: Boolean, + currentContent: ContentKey, + layoutImpl: SceneTransitionLayoutImpl, + transition: TransitionState.Transition, + element: Element, + currentSceneState: Element.State?, +): ContentKey { + return when { + isDisabledSharedElement -> { + currentContent + } + isAncestorTransition(layoutImpl, transition) -> { + if ( + element.stateByContent[transition.fromContent] != null && + transition.transformationSpec.hasTransformation( + element.key, + transition.fromContent, + ) + ) { + transition.fromContent + } else if ( + element.stateByContent[transition.toContent] != null && + transition.transformationSpec.hasTransformation( + element.key, + transition.toContent, + ) + ) { + transition.toContent + } else { + throw IllegalStateException( + "Ancestor transition is active but no transformation " + + "spec was found. The ancestor transition should have only been selected " + + "when a transformation for that element and content was defined." + ) + } + } + currentSceneState != null && currentContent == transition.currentScene -> { + currentContent + } + element.stateByContent[transition.fromContent] != null -> { + transition.fromContent + } + else -> { + transition.toContent + } + } +} + +private inline fun <T> computePreviewTransformationValue( + transition: TransitionState.Transition, + idleValue: T, + transformationContentKey: ContentKey, + isEntering: Boolean, + previewTransformation: TransformationWithRange<PropertyTransformation<T>>, + element: Element, + layoutImpl: SceneTransitionLayoutImpl, + transformationWithRange: TransformationWithRange<PropertyTransformation<T>>?, + lerp: (T, T, Float) -> T, +): T { + val isInPreviewStage = transition.isInPreviewStage + + val previewTargetValue = + with( + previewTransformation.transformation.requireInterpolatedTransformation( + element, + transition, + ) { + "Custom transformations in preview specs should not be possible" + } + ) { + layoutImpl.propertyTransformationScope.transform( + transformationContentKey, + element.key, + transition, + idleValue, + ) + } + + val targetValueOrNull = + transformationWithRange?.let { transformation -> + with( + transformation.transformation.requireInterpolatedTransformation( + element, + transition, + ) { + "Custom transformations are not allowed for properties with a preview" + } + ) { + layoutImpl.propertyTransformationScope.transform( + transformationContentKey, + element.key, + transition, + idleValue, + ) + } + } + + // Make sure we don't read progress if values are the same and we don't need to interpolate, + // so we don't invalidate the phase where this is read. + when { + isInPreviewStage && isEntering && previewTargetValue == targetValueOrNull -> + return previewTargetValue + isInPreviewStage && !isEntering && idleValue == previewTargetValue -> return idleValue + previewTargetValue == targetValueOrNull && idleValue == previewTargetValue -> + return idleValue + else -> {} + } + + val previewProgress = transition.previewProgress + // progress is not needed for all cases of the below when block, therefore read it lazily + // TODO(b/290184746): Make sure that we don't overflow transformations associated to a range + val previewRangeProgress = + previewTransformation.range?.progress(previewProgress) ?: previewProgress + + if (isInPreviewStage) { + // if we're in the preview stage of the transition, interpolate between start state and + // preview target state: + return if (isEntering) { + // i.e. in the entering case between previewTargetValue and targetValue (or + // idleValue if no transformation is defined in the second stage transition)... + lerp(previewTargetValue, targetValueOrNull ?: idleValue, previewRangeProgress) + } else { + // ...and in the exiting case between the idleValue and the previewTargetValue. + lerp(idleValue, previewTargetValue, previewRangeProgress) + } + } + + // if we're in the second stage of the transition, interpolate between the state the + // element was left at the end of the preview-phase and the target state: + return if (isEntering) { + // i.e. in the entering case between preview-end-state and the idleValue... + lerp( + lerp(previewTargetValue, targetValueOrNull ?: idleValue, previewRangeProgress), + idleValue, + transformationWithRange?.range?.progress(transition.progress) ?: transition.progress, + ) + } else { + if (targetValueOrNull == null) { + // ... and in the exiting case, the element should remain in the preview-end-state + // if no further transformation is defined in the second-stage transition... + lerp(idleValue, previewTargetValue, previewRangeProgress) + } else { + // ...and otherwise it should be interpolated between preview-end-state and + // targetValue + lerp( + lerp(idleValue, previewTargetValue, previewRangeProgress), + targetValueOrNull, + transformationWithRange.range?.progress(transition.progress) ?: transition.progress, + ) + } + } +} + private fun isAncestorTransition( layoutImpl: SceneTransitionLayoutImpl, transition: TransitionState.Transition, @@ -1564,7 +1605,7 @@ private fun isAncestorTransition( private fun isEnteringAncestorTransition( layoutImpl: SceneTransitionLayoutImpl, - transition: TransitionState.Transition + transition: TransitionState.Transition, ): Boolean { return layoutImpl.ancestors.fastAny { it.inContent == transition.toContent } } 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 7b30a2a475e3..c704a3e96467 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 @@ -35,7 +35,7 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.LayoutDirection -import com.android.compose.animation.scene.effect.ContentOverscrollEffect +import com.android.compose.gesture.effect.ContentOverscrollEffect /** * [SceneTransitionLayout] is a container that automatically animates its content whenever its state diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt index 8794df0cf884..fda6fab6229a 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt @@ -25,7 +25,6 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.transformation.Transformation -import kotlin.math.tanh /** Define the [transitions][SceneTransitions] to be used with a [SceneTransitionLayout]. */ fun transitions(builder: SceneTransitionsBuilder.() -> Unit): SceneTransitions { @@ -476,35 +475,3 @@ interface PropertyTransformationBuilder { /** Apply a [transformation] to the element(s) matching [matcher]. */ fun transformation(matcher: ElementMatcher, transformation: Transformation.Factory) } - -/** This converter lets you change a linear progress into a function of your choice. */ -fun interface ProgressConverter { - fun convert(progress: Float): Float - - companion object { - /** Starts linearly with some resistance and slowly approaches to 0.2f */ - val Default = tanh(maxProgress = 0.2f, tilt = 3f) - - /** - * The scroll stays linear, with [factor] you can control how much resistance there is. - * - * @param factor If you choose a value between 0f and 1f, the progress will grow more - * slowly, like there's resistance. A value of 1f means there's no resistance. - */ - fun linear(factor: Float = 1f) = ProgressConverter { it * factor } - - /** - * This function starts linear and slowly approaches [maxProgress]. - * - * See a [visual representation](https://www.desmos.com/calculator/usgvvf0z1u) of this - * function. - * - * @param maxProgress is the maximum progress value. - * @param tilt behaves similarly to the factor in the [linear] function, and allows you to - * control how quickly you get to the [maxProgress]. - */ - fun tanh(maxProgress: Float, tilt: Float = 1f) = ProgressConverter { - maxProgress * tanh(x = it / (maxProgress * tilt)) - } - } -} 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 8c5a72738a41..4c15f7a4534f 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 @@ -53,10 +53,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.OffsetOverscrollEffect 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.effect.OffsetOverscrollEffect import com.android.compose.modifiers.thenIf import com.android.compose.ui.graphics.ContainerState import com.android.compose.ui.graphics.container 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 new file mode 100644 index 000000000000..2db45aa3dd58 --- /dev/null +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/effect/GestureEffect.kt @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.compose.animation.scene.effect + +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 { + private var shouldFling = false + + override fun applyToScroll( + delta: Offset, + source: NestedScrollSource, + performScroll: (Offset) -> Offset, + ): Offset { + shouldFling = true + return delegate.applyToScroll(delta, source, performScroll) + } + + override suspend fun applyToFling( + velocity: Velocity, + performFling: suspend (Velocity) -> Velocity, + ) { + if (!shouldFling) { + performFling(velocity) + return + } + shouldFling = false + delegate.applyToFling(velocity, performFling) + } + + suspend fun ensureApplyToFlingIsCalled() { + 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/ElementTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt index 676903274b38..53495be7b02a 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 @@ -70,8 +70,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.compose.animation.scene.TestScenes.SceneA import com.android.compose.animation.scene.TestScenes.SceneB import com.android.compose.animation.scene.TestScenes.SceneC -import com.android.compose.animation.scene.effect.OffsetOverscrollEffect import com.android.compose.animation.scene.subjects.assertThat +import com.android.compose.gesture.effect.OffsetOverscrollEffect import com.android.compose.test.assertSizeIsEqualTo import com.android.compose.test.setContentAndCreateMainScope import com.android.compose.test.transition diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java index 80de087971c5..266591028efb 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/DragToInteractAnimationControllerTest.java @@ -29,6 +29,7 @@ import android.view.accessibility.AccessibilityManager; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.android.systemui.accessibility.utils.TestUtils; @@ -58,13 +59,15 @@ public class DragToInteractAnimationControllerTest extends SysuiTestCase { @Mock private AccessibilityManager mAccessibilityManager; + @Mock + private HearingAidDeviceManager mHearingAidDeviceManager; @Before public void setUp() throws Exception { final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); final SecureSettings mockSecureSettings = TestUtils.mockSecureSettings(); final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, - mockSecureSettings); + mockSecureSettings, mHearingAidDeviceManager); final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, stubWindowManager); final MenuView stubMenuView = spy(new MenuView(mContext, stubMenuViewModel, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java index 24f3a29e64ee..785493faf957 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java @@ -16,6 +16,7 @@ package com.android.systemui.accessibility.floatingmenu; +import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static org.mockito.ArgumentMatchers.anyInt; @@ -25,11 +26,13 @@ import static org.mockito.Mockito.verify; import android.content.Context; import android.content.res.Configuration; +import android.platform.test.annotations.EnableFlags; import android.view.accessibility.AccessibilityManager; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.SysuiTestCase; import com.android.systemui.util.settings.SecureSettings; @@ -45,6 +48,7 @@ import org.mockito.junit.MockitoRule; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.concurrent.Executor; /** Tests for {@link MenuInfoRepository}. */ @RunWith(AndroidJUnit4.class) @@ -55,9 +59,10 @@ public class MenuInfoRepositoryTest extends SysuiTestCase { @Mock private AccessibilityManager mAccessibilityManager; - @Mock - private MenuInfoRepository.OnSettingsContentsChanged mMockSettingsContentsChanged; + private HearingAidDeviceManager mHearingAidDeviceManager; + @Mock + private MenuInfoRepository.OnContentsChanged mMockSettingsContentsChanged; @Mock private SecureSettings mSecureSettings; @@ -72,7 +77,7 @@ public class MenuInfoRepositoryTest extends SysuiTestCase { anyInt()); mMenuInfoRepository = new MenuInfoRepository(mContext, mAccessibilityManager, - mMockSettingsContentsChanged, mSecureSettings); + mMockSettingsContentsChanged, mSecureSettings, mHearingAidDeviceManager); } @After @@ -103,4 +108,16 @@ public class MenuInfoRepositoryTest extends SysuiTestCase { verify(mMockSettingsContentsChanged).onTargetFeaturesChanged(any()); } + + @Test + @EnableFlags( + com.android.settingslib.flags.Flags.FLAG_HEARING_DEVICE_SET_CONNECTION_STATUS_REPORT) + public void registerObservers_addHearingDeviceTarget_verifyRegisterConnectionStatusListener() { + mShortcutTargets.add(ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()); + mMenuInfoRepository.registerObserversAndCallbacks(); + + verify(mHearingAidDeviceManager).registerConnectionStatusListener( + any(HearingAidDeviceManager.ConnectionStatusListener.class), any( + Executor.class)); + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java index 157cccc3d62f..241da5fbc444 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java @@ -41,6 +41,7 @@ import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.android.systemui.accessibility.utils.TestUtils; @@ -68,6 +69,8 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase { @Mock private AccessibilityManager mAccessibilityManager; + @Mock + private HearingAidDeviceManager mHearingAidDeviceManager; private final SecureSettings mSecureSettings = TestUtils.mockSecureSettings(); private RecyclerView mStubListView; private MenuView mMenuView; @@ -84,7 +87,7 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase { final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, stubWindowManager); final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, - mSecureSettings); + mSecureSettings, mHearingAidDeviceManager); final int halfScreenHeight = stubWindowManager.getCurrentWindowMetrics().getBounds().height() / 2; diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java index 46f076a75116..fbd8a713a249 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java @@ -41,6 +41,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.internal.accessibility.dialog.AccessibilityTarget; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.android.systemui.accessibility.MotionEventHelper; @@ -82,13 +83,15 @@ public class MenuListViewTouchHandlerTest extends SysuiTestCase { @Mock private AccessibilityManager mAccessibilityManager; + @Mock + private HearingAidDeviceManager mHearingAidDeviceManager; @Before public void setUp() throws Exception { final WindowManager windowManager = mContext.getSystemService(WindowManager.class); final SecureSettings secureSettings = TestUtils.mockSecureSettings(); final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, - secureSettings); + secureSettings, mHearingAidDeviceManager); final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, windowManager); mStubMenuView = new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerControllerTest.java index fcdeff9ab683..4f043109a534 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerControllerTest.java @@ -41,6 +41,7 @@ import androidx.test.filters.SmallTest; import com.android.app.viewcapture.ViewCapture; import com.android.app.viewcapture.ViewCaptureAwareWindowManager; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.SysuiTestCase; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.util.settings.SecureSettings; @@ -68,6 +69,8 @@ public class MenuViewLayerControllerTest extends SysuiTestCase { @Mock private AccessibilityManager mAccessibilityManager; + @Mock + private HearingAidDeviceManager mHearingAidDeviceManager; @Mock private SecureSettings mSecureSettings; @@ -93,7 +96,7 @@ public class MenuViewLayerControllerTest extends SysuiTestCase { when(mWindowMetrics.getWindowInsets()).thenReturn(stubDisplayInsets()); mMenuViewLayerController = new MenuViewLayerController(mContext, mWindowManager, viewCaptureAwareWm, mAccessibilityManager, mSecureSettings, - mock(NavigationModeController.class)); + mock(NavigationModeController.class), mHearingAidDeviceManager); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java index ee8ce17cecd4..cb7c205742fc 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java @@ -37,6 +37,7 @@ import android.view.accessibility.AccessibilityManager; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.Flags; import com.android.systemui.Prefs; import com.android.systemui.SysuiTestCase; @@ -70,6 +71,8 @@ public class MenuViewTest extends SysuiTestCase { @Mock private AccessibilityManager mAccessibilityManager; + @Mock + private HearingAidDeviceManager mHearingAidDeviceManager; private SysuiTestableContext mSpyContext; @@ -90,7 +93,7 @@ public class MenuViewTest extends SysuiTestCase { final SecureSettings secureSettings = TestUtils.mockSecureSettings(); final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, - secureSettings); + secureSettings, mHearingAidDeviceManager); final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); mStubMenuViewAppearance = new MenuViewAppearance(mSpyContext, stubWindowManager); mMenuView = spy(new MenuView(mSpyContext, stubMenuViewModel, mStubMenuViewAppearance, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt index d70af2806430..b70f46c4b01c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt @@ -25,10 +25,12 @@ import android.provider.Settings import android.widget.RemoteViews import androidx.test.filters.SmallTest import com.android.compose.animation.scene.ObservableTransitionState +import com.android.systemui.Flags.FLAG_BOUNCER_UI_REVAMP import com.android.systemui.Flags.FLAG_COMMUNAL_HUB import com.android.systemui.Flags.FLAG_COMMUNAL_RESPONSIVE_GRID import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_DIRECT_EDIT_MODE import com.android.systemui.SysuiTestCase +import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository import com.android.systemui.communal.data.model.CommunalSmartspaceTimer import com.android.systemui.communal.data.repository.FakeCommunalMediaRepository import com.android.systemui.communal.data.repository.FakeCommunalSceneRepository @@ -69,6 +71,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.keyguard.ui.transitions.blurConfig import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope import com.android.systemui.log.logcatLogBuffer @@ -184,6 +187,7 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { logcatLogBuffer("CommunalViewModelTest"), metricsLogger, kosmos.mediaCarouselController, + kosmos.blurConfig, ) } @@ -893,6 +897,20 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(selectedKey2).isEqualTo(key) } + @Test + @EnableFlags(FLAG_BOUNCER_UI_REVAMP) + fun uiIsBlurred_whenPrimaryBouncerIsShowing() = + testScope.runTest { + val viewModel = createViewModel() + val isUiBlurred by collectLastValue(viewModel.isUiBlurred) + + kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(true) + assertThat(isUiBlurred).isTrue() + + kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(false) + assertThat(isUiBlurred).isFalse() + } + private suspend fun setIsMainUser(isMainUser: Boolean) { val user = if (isMainUser) MAIN_USER_INFO else SECONDARY_USER_INFO with(userRepository) { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepositoryImplTest.kt index f68a1b5a17e9..eae5728f586d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepositoryImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepositoryImplTest.kt @@ -16,7 +16,7 @@ package com.android.systemui.display.data.repository -import android.content.testableContext +import android.content.Context import android.platform.test.annotations.EnableFlags import android.view.Display import android.view.layoutInflater @@ -24,6 +24,7 @@ import android.view.mockWindowManager import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.SysuiTestableContext import com.android.systemui.display.shared.model.DisplayWindowProperties import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.testScope @@ -36,8 +37,12 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mockito.doAnswer +import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock +import org.mockito.kotlin.spy +import org.mockito.kotlin.whenever @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME) @RunWith(AndroidJUnit4::class) @@ -48,7 +53,8 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() { private val fakeDisplayRepository = kosmos.displayRepository private val testScope = kosmos.testScope - private val applicationContext = kosmos.testableContext + private val applicationContext = spy(context) + private val applicationWindowManager = kosmos.mockWindowManager private val applicationLayoutInflater = kosmos.layoutInflater @@ -64,6 +70,22 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() { } @Before + fun setUpContext() { + doAnswer { createContextForDisplay(it.arguments[0] as Display) } + .whenever(applicationContext) + .createWindowContext(any(), any(), any()) + } + + private fun createContextForDisplay(display: Display): Context { + if (display.displayId == BEING_REMOVED_DISPLAY_ID) { + // Simulate what happens when a display is being removed. + // Return a context with the same display id as the original context. + return mContext + } + return SysuiTestableContext(mContext).also { it.display = display } + } + + @Before fun start() { repo.start() } @@ -72,6 +94,7 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() { fun addDisplays() = runBlocking { fakeDisplayRepository.addDisplay(createDisplay(DEFAULT_DISPLAY_ID)) fakeDisplayRepository.addDisplay(createDisplay(NON_DEFAULT_DISPLAY_ID)) + fakeDisplayRepository.addDisplay(createDisplay(BEING_REMOVED_DISPLAY_ID)) } @Test @@ -94,7 +117,7 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() { @Test fun get_nonDefaultDisplayId_returnsNewStatusBarContext() = testScope.runTest { - val displayContext = repo.get(NON_DEFAULT_DISPLAY_ID, WINDOW_TYPE_FOO) + val displayContext = repo.get(NON_DEFAULT_DISPLAY_ID, WINDOW_TYPE_FOO)!! assertThat(displayContext.context).isNotSameInstanceAs(applicationContext) } @@ -102,7 +125,7 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() { @Test fun get_nonDefaultDisplayId_returnsNewWindowManager() = testScope.runTest { - val displayContext = repo.get(NON_DEFAULT_DISPLAY_ID, WINDOW_TYPE_FOO) + val displayContext = repo.get(NON_DEFAULT_DISPLAY_ID, WINDOW_TYPE_FOO)!! assertThat(displayContext.windowManager).isNotSameInstanceAs(applicationWindowManager) } @@ -110,7 +133,7 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() { @Test fun get_nonDefaultDisplayId_returnsNewLayoutInflater() = testScope.runTest { - val displayContext = repo.get(NON_DEFAULT_DISPLAY_ID, WINDOW_TYPE_FOO) + val displayContext = repo.get(NON_DEFAULT_DISPLAY_ID, WINDOW_TYPE_FOO)!! assertThat(displayContext.layoutInflater).isNotSameInstanceAs(applicationLayoutInflater) } @@ -154,17 +177,26 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() { .isNotSameInstanceAs(displayContext) } - @Test(expected = IllegalArgumentException::class) - fun get_nonExistingDisplayId_throws() = - testScope.runTest { repo.get(NON_EXISTING_DISPLAY_ID, WINDOW_TYPE_FOO) } + @Test + fun get_nonExistingDisplayId_returnsNull() = + testScope.runTest { + assertThat(repo.get(NON_EXISTING_DISPLAY_ID, WINDOW_TYPE_FOO)).isNull() + } + + @Test + fun get_displayBeingRemoved_returnsNull() = + testScope.runTest { + assertThat(repo.get(BEING_REMOVED_DISPLAY_ID, WINDOW_TYPE_FOO)).isNull() + } private fun createDisplay(displayId: Int) = - mock<Display> { on { getDisplayId() } doReturn displayId } + mock<Display> { on { getDisplayId() } doReturn (displayId) } companion object { private const val DEFAULT_DISPLAY_ID = Display.DEFAULT_DISPLAY private const val NON_DEFAULT_DISPLAY_ID = DEFAULT_DISPLAY_ID + 1 private const val NON_EXISTING_DISPLAY_ID = DEFAULT_DISPLAY_ID + 2 + private const val BEING_REMOVED_DISPLAY_ID = DEFAULT_DISPLAY_ID + 4 private const val WINDOW_TYPE_FOO = 123 private const val WINDOW_TYPE_BAR = 321 } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/PerDisplayStoreImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/PerDisplayStoreImplTest.kt index 6a0781b3580f..73957eb488d0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/PerDisplayStoreImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/display/data/repository/PerDisplayStoreImplTest.kt @@ -80,9 +80,9 @@ class PerDisplayStoreImplTest : SysuiTestCase() { assertThat(store.forDisplay(NON_DEFAULT_DISPLAY_ID)).isNotSameInstanceAs(instance) } - @Test(expected = IllegalArgumentException::class) - fun forDisplay_nonExistingDisplayId_throws() = - testScope.runTest { store.forDisplay(NON_EXISTING_DISPLAY_ID) } + @Test + fun forDisplay_nonExistingDisplayId_returnsNull() = + testScope.runTest { assertThat(store.forDisplay(NON_EXISTING_DISPLAY_ID)).isNull() } @Test fun forDisplay_afterDisplayRemoved_onDisplayRemovalActionInvoked() = diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractorTest.kt index 28ac169e2bbe..16f02c5dc9ea 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractorTest.kt @@ -27,7 +27,6 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.deviceentry.domain.interactor.deviceEntryFaceAuthInteractor import com.android.systemui.deviceentry.shared.FaceAuthUiEvent -import com.android.systemui.flags.Flags import com.android.systemui.flags.fakeFeatureFlagsClassic import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository @@ -93,9 +92,7 @@ class KeyguardTouchHandlingInteractorTest : SysuiTestCase() { testScope.runTest { val isEnabled = collectLastValue(underTest.isLongPressHandlingEnabled) KeyguardState.values().forEach { keyguardState -> - setUpState( - keyguardState = keyguardState, - ) + setUpState(keyguardState = keyguardState) if (keyguardState == KeyguardState.LOCKSCREEN) { assertThat(isEnabled()).isTrue() @@ -110,10 +107,7 @@ class KeyguardTouchHandlingInteractorTest : SysuiTestCase() { testScope.runTest { val isEnabled = collectLastValue(underTest.isLongPressHandlingEnabled) KeyguardState.values().forEach { keyguardState -> - setUpState( - keyguardState = keyguardState, - isQuickSettingsVisible = true, - ) + setUpState(keyguardState = keyguardState, isQuickSettingsVisible = true) assertThat(isEnabled()).isFalse() } @@ -290,22 +284,19 @@ class KeyguardTouchHandlingInteractorTest : SysuiTestCase() { keyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.LOCKSCREEN, to = KeyguardState.GONE, - testScope + testScope, ) assertThat(isMenuVisible).isFalse() keyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.GONE, to = KeyguardState.LOCKSCREEN, - testScope + testScope, ) assertThat(isMenuVisible).isFalse() } - private suspend fun createUnderTest( - isLongPressFeatureEnabled: Boolean = true, - isRevampedWppFeatureEnabled: Boolean = true, - ) { + private suspend fun createUnderTest(isRevampedWppFeatureEnabled: Boolean = true) { // This needs to be re-created for each test outside of kosmos since the flag values are // read during initialization to set up flows. Maybe there is a better way to handle that. underTest = @@ -315,10 +306,7 @@ class KeyguardTouchHandlingInteractorTest : SysuiTestCase() { transitionInteractor = kosmos.keyguardTransitionInteractor, repository = keyguardRepository, logger = logger, - featureFlags = - kosmos.fakeFeatureFlagsClassic.apply { - set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, isLongPressFeatureEnabled) - }, + featureFlags = kosmos.fakeFeatureFlagsClassic, broadcastDispatcher = fakeBroadcastDispatcher, accessibilityManager = kosmos.accessibilityManagerWrapper, pulsingGestureListener = kosmos.pulsingGestureListener, @@ -334,7 +322,7 @@ class KeyguardTouchHandlingInteractorTest : SysuiTestCase() { keyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.AOD, to = keyguardState, - testScope = testScope + testScope = testScope, ) keyguardRepository.setQuickSettingsVisible(isVisible = isQuickSettingsVisible) } 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 67a43327efc2..7c694b4fc95b 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 @@ -23,7 +23,6 @@ import androidx.constraintlayout.widget.ConstraintSet import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.communal.ui.view.layout.sections.CommunalTutorialIndicatorSection import com.android.systemui.keyguard.shared.model.KeyguardBlueprint import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.view.KeyguardRootView @@ -71,7 +70,6 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { @Mock private lateinit var splitShadeGuidelines: SplitShadeGuidelines @Mock private lateinit var aodNotificationIconsSection: AodNotificationIconsSection @Mock private lateinit var aodBurnInSection: AodBurnInSection - @Mock private lateinit var communalTutorialIndicatorSection: CommunalTutorialIndicatorSection @Mock private lateinit var clockSection: ClockSection @Mock private lateinit var smartspaceSection: SmartspaceSection @Mock private lateinit var keyguardSliceViewSection: KeyguardSliceViewSection @@ -94,7 +92,6 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { defaultNSSLSection, aodNotificationIconsSection, aodBurnInSection, - communalTutorialIndicatorSection, clockSection, smartspaceSection, keyguardSliceViewSection, 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 new file mode 100644 index 000000000000..88fd333b34a8 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModelTest.kt @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectValues +import com.android.systemui.flags.DisableSceneContainer +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.keyguard.ui.transitions.blurConfig +import com.android.systemui.kosmos.testScope +import com.android.systemui.testKosmos +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +@ExperimentalCoroutinesApi +@SmallTest +@RunWith(AndroidJUnit4::class) +class GlanceableHubToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val underTest by lazy { kosmos.glanceableHubToPrimaryBouncerTransitionViewModel } + + @Test + @DisableSceneContainer + fun blurBecomesMaxValueImmediately() = + testScope.runTest { + val values by collectValues(underTest.windowBlurRadius) + + kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), + startValue = kosmos.blurConfig.maxBlurRadiusPx, + endValue = kosmos.blurConfig.maxBlurRadiusPx, + actualValuesProvider = { values }, + transitionFactory = { step, transitionState -> + TransitionStep( + from = KeyguardState.GLANCEABLE_HUB, + to = KeyguardState.PRIMARY_BOUNCER, + value = step, + transitionState = transitionState, + ownerName = "GlanceableHubToPrimaryBouncerTransitionViewModelTest", + ) + }, + checkInterpolatedValues = false, + ) + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt index 6f7e9d3bc59d..e4eb55b79a23 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt @@ -26,9 +26,7 @@ import com.android.systemui.biometrics.authController import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.DisableSceneContainer -import com.android.systemui.flags.Flags import com.android.systemui.flags.andSceneContainer -import com.android.systemui.flags.fakeFeatureFlagsClassic import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository import com.android.systemui.keyguard.shared.model.ClockSize @@ -77,7 +75,6 @@ class LockscreenContentViewModelTest(flags: FlagsParameterization) : SysuiTestCa @Before fun setup() { with(kosmos) { - fakeFeatureFlagsClassic.set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, true) shadeRepository.setShadeLayoutWide(false) underTest = lockscreenContentViewModel underTest.activateIn(testScope) 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 new file mode 100644 index 000000000000..e11e3076c6c3 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModelTest.kt @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectValues +import com.android.systemui.flags.DisableSceneContainer +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.keyguard.ui.transitions.blurConfig +import com.android.systemui.kosmos.testScope +import com.android.systemui.testKosmos +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +@ExperimentalCoroutinesApi +@SmallTest +@RunWith(AndroidJUnit4::class) +class OccludedToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val underTest by lazy { kosmos.occludedToPrimaryBouncerTransitionViewModel } + + @Test + @DisableSceneContainer + fun blurBecomesMaxValueImmediately() = + testScope.runTest { + val values by collectValues(underTest.windowBlurRadius) + + kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), + startValue = kosmos.blurConfig.maxBlurRadiusPx, + endValue = kosmos.blurConfig.maxBlurRadiusPx, + actualValuesProvider = { values }, + transitionFactory = { step, transitionState -> + TransitionStep( + from = KeyguardState.OCCLUDED, + to = KeyguardState.PRIMARY_BOUNCER, + value = step, + transitionState = transitionState, + ownerName = "OccludedToPrimaryBouncerTransitionViewModelTest", + ) + }, + checkInterpolatedValues = false, + ) + } +} 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 new file mode 100644 index 000000000000..8a2fc56e11e6 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModelTest.kt @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectValues +import com.android.systemui.flags.DisableSceneContainer +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.keyguard.ui.transitions.blurConfig +import com.android.systemui.kosmos.testScope +import com.android.systemui.testKosmos +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +@ExperimentalCoroutinesApi +@SmallTest +@RunWith(AndroidJUnit4::class) +class PrimaryBouncerToOccludedTransitionViewModelTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val underTest by lazy { kosmos.primaryBouncerToOccludedTransitionViewModel } + + @Test + @DisableSceneContainer + fun blurBecomesMaxValueImmediately() = + testScope.runTest { + val values by collectValues(underTest.windowBlurRadius) + + kosmos.bouncerWindowBlurTestUtil.assertTransitionToBlurRadius( + transitionProgress = listOf(0.0f, 0.2f, 0.3f, 0.65f, 0.7f, 1.0f), + startValue = kosmos.blurConfig.minBlurRadiusPx, + endValue = kosmos.blurConfig.minBlurRadiusPx, + actualValuesProvider = { values }, + transitionFactory = { step, transitionState -> + TransitionStep( + from = KeyguardState.PRIMARY_BOUNCER, + to = KeyguardState.OCCLUDED, + value = step, + transitionState = transitionState, + ownerName = "PrimaryBouncerToOccludedTransitionViewModelTest", + ) + }, + checkInterpolatedValues = false, + ) + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/pipeline/Media3ActionFactoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/pipeline/Media3ActionFactoryTest.kt index f8f6fe246563..466c9f96749f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/pipeline/Media3ActionFactoryTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/pipeline/Media3ActionFactoryTest.kt @@ -26,6 +26,7 @@ import androidx.media3.common.Player import androidx.media3.session.CommandButton import androidx.media3.session.MediaController as Media3Controller import androidx.media3.session.SessionCommand +import androidx.media3.session.SessionResult import androidx.media3.session.SessionToken import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest @@ -41,6 +42,8 @@ import com.android.systemui.testKosmos import com.android.systemui.util.concurrency.execution import com.google.common.collect.ImmutableList import com.google.common.truth.Truth.assertThat +import com.google.common.util.concurrent.ListenableFuture +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before @@ -60,6 +63,7 @@ private const val PACKAGE_NAME = "package_name" private const val CUSTOM_ACTION_NAME = "Custom Action" private const val CUSTOM_ACTION_COMMAND = "custom-action" +@OptIn(ExperimentalCoroutinesApi::class) @SmallTest @RunWithLooper @RunWith(AndroidJUnit4::class) @@ -84,12 +88,14 @@ class Media3ActionFactoryTest : SysuiTestCase() { } } private val customLayout = ImmutableList.of<CommandButton>() + private val customCommandFuture = mock<ListenableFuture<SessionResult>>() private val media3Controller = mock<Media3Controller> { on { customLayout } doReturn customLayout on { sessionExtras } doReturn Bundle() on { isCommandAvailable(any()) } doReturn true on { isSessionCommandAvailable(any<SessionCommand>()) } doReturn true + on { sendCustomCommand(any(), any()) } doReturn customCommandFuture } private lateinit var underTest: Media3ActionFactory @@ -105,7 +111,7 @@ class Media3ActionFactoryTest : SysuiTestCase() { kosmos.mediaLogger, kosmos.looper, handler, - kosmos.testScope, + testScope, kosmos.execution, ) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/shared/QSSettingsPackageRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/shared/QSSettingsPackageRepositoryTest.kt new file mode 100644 index 000000000000..765c02afbb41 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/shared/QSSettingsPackageRepositoryTest.kt @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.shared + +import android.content.Context +import android.content.Intent +import android.content.pm.ActivityInfo +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.kosmos.testScope +import com.android.systemui.testKosmos +import com.android.systemui.user.data.repository.fakeUserRepository +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.any +import org.mockito.Mockito.anyInt +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule +import org.mockito.kotlin.whenever + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidJUnit4::class) +class QSSettingsPackageRepositoryTest : SysuiTestCase() { + + @get:Rule val mockito: MockitoRule = MockitoJUnit.rule() + + @Mock private lateinit var context: Context + @Mock private lateinit var packageManager: PackageManager + @Mock private lateinit var resolveInfo: ResolveInfo + @Mock private lateinit var activityInfo: ActivityInfo + + private val kosmos = testKosmos() + private val scope = kosmos.testScope + private val userRepository = kosmos.fakeUserRepository + + private lateinit var underTest: QSSettingsPackageRepository + + @Before + fun setUp() { + whenever(context.createContextAsUser(any(), anyInt())).thenReturn(context) + whenever(context.packageManager).thenReturn(packageManager) + whenever(packageManager.queryIntentActivities(any(Intent::class.java), anyInt())) + .thenReturn(listOf(resolveInfo)) + resolveInfo.activityInfo = activityInfo + + underTest = QSSettingsPackageRepository(context, scope, userRepository) + } + + @Test + fun getSettingsPackageName_noInit_returnsDefaultPackageName() { + assertThat(underTest.getSettingsPackageName()).isEqualTo(DEFAULT_SETTINGS_PACKAGE_NAME) + } + + @Test + fun getSettingsPackageName_repositoryWithCustomPackage_returnsCustomPackageName() { + scope.runTest { + activityInfo.packageName = CUSTOM_SETTINGS_PACKAGE_NAME + + underTest.init() + runCurrent() + + assertThat(underTest.getSettingsPackageName()).isEqualTo(CUSTOM_SETTINGS_PACKAGE_NAME) + } + } + + @Test + fun getSettingsPackageName_noMatchingActivity_returnsDefaultPackageName() { + scope.runTest { + whenever(packageManager.queryIntentActivities(any(Intent::class.java), anyInt())) + .thenReturn(emptyList()) + + underTest.init() + runCurrent() + + assertThat(underTest.getSettingsPackageName()).isEqualTo(DEFAULT_SETTINGS_PACKAGE_NAME) + } + } + + @Test + fun getSettingsPackageName_nullActivityInfo_returnsDefaultPackageName() { + scope.runTest { + resolveInfo.activityInfo = null + + underTest.init() + runCurrent() + + assertThat(underTest.getSettingsPackageName()).isEqualTo(DEFAULT_SETTINGS_PACKAGE_NAME) + } + } + + companion object { + private const val DEFAULT_SETTINGS_PACKAGE_NAME = "com.android.settings" + private const val CUSTOM_SETTINGS_PACKAGE_NAME = "com.android.test.settings" + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ColorCorrectionTileTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ColorCorrectionTileTest.java index 028beb599644..e5e8d4a6ed32 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ColorCorrectionTileTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ColorCorrectionTileTest.java @@ -39,6 +39,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QsEventLogger; import com.android.systemui.qs.logging.QSLogger; +import com.android.systemui.qs.shared.QSSettingsPackageRepository; import com.android.systemui.settings.UserTracker; import com.android.systemui.util.settings.FakeSettings; import com.android.systemui.util.settings.SecureSettings; @@ -55,6 +56,7 @@ import org.mockito.MockitoAnnotations; @TestableLooper.RunWithLooper(setAsMainLooper = true) @SmallTest public class ColorCorrectionTileTest extends SysuiTestCase { + private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; @Mock private QSHost mHost; @@ -70,6 +72,8 @@ public class ColorCorrectionTileTest extends SysuiTestCase { private QsEventLogger mUiEventLogger; @Mock private UserTracker mUserTracker; + @Mock + private QSSettingsPackageRepository mQSSettingsPackageRepository; private TestableLooper mTestableLooper; private SecureSettings mSecureSettings; @@ -83,6 +87,8 @@ public class ColorCorrectionTileTest extends SysuiTestCase { mTestableLooper = TestableLooper.get(this); when(mHost.getContext()).thenReturn(mContext); + when(mQSSettingsPackageRepository.getSettingsPackageName()) + .thenReturn(SETTINGS_PACKAGE_NAME); mTile = new ColorCorrectionTile( mHost, @@ -95,7 +101,8 @@ public class ColorCorrectionTileTest extends SysuiTestCase { mActivityStarter, mQSLogger, mUserTracker, - mSecureSettings + mSecureSettings, + mQSSettingsPackageRepository ); mTile.initialize(); @@ -119,5 +126,6 @@ public class ColorCorrectionTileTest extends SysuiTestCase { anyInt(), any()); assertThat(IntentCaptor.getValue().getAction()).isEqualTo( Settings.ACTION_COLOR_CORRECTION_SETTINGS); + assertThat(IntentCaptor.getValue().getPackage()).isEqualTo(SETTINGS_PACKAGE_NAME); } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ColorInversionTileTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ColorInversionTileTest.java index a58dd6301e07..cbde99847770 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ColorInversionTileTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ColorInversionTileTest.java @@ -45,6 +45,7 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QsEventLogger; import com.android.systemui.qs.flags.QsInCompose; import com.android.systemui.qs.logging.QSLogger; +import com.android.systemui.qs.shared.QSSettingsPackageRepository; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.settings.UserTracker; @@ -59,15 +60,16 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.List; - import platform.test.runner.parameterized.ParameterizedAndroidJunit4; import platform.test.runner.parameterized.Parameters; +import java.util.List; + @RunWith(ParameterizedAndroidJunit4.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @SmallTest public class ColorInversionTileTest extends SysuiTestCase { + private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; private static final Integer COLOR_INVERSION_DISABLED = 0; private static final Integer COLOR_INVERSION_ENABLED = 1; @@ -90,6 +92,8 @@ public class ColorInversionTileTest extends SysuiTestCase { private QsEventLogger mUiEventLogger; @Mock private UserTracker mUserTracker; + @Mock + private QSSettingsPackageRepository mQSSettingsPackageRepository; private TestableLooper mTestableLooper; private SecureSettings mSecureSettings; @@ -108,6 +112,8 @@ public class ColorInversionTileTest extends SysuiTestCase { mTestableLooper = TestableLooper.get(this); when(mHost.getContext()).thenReturn(mContext); + when(mQSSettingsPackageRepository.getSettingsPackageName()) + .thenReturn(SETTINGS_PACKAGE_NAME); mTile = new ColorInversionTile( mHost, @@ -120,7 +126,8 @@ public class ColorInversionTileTest extends SysuiTestCase { mActivityStarter, mQSLogger, mUserTracker, - mSecureSettings + mSecureSettings, + mQSSettingsPackageRepository ); mTile.initialize(); @@ -144,6 +151,7 @@ public class ColorInversionTileTest extends SysuiTestCase { anyInt(), any()); assertThat(IntentCaptor.getValue().getAction()).isEqualTo( Settings.ACTION_COLOR_INVERSION_SETTINGS); + assertThat(IntentCaptor.getValue().getPackage()).isEqualTo(SETTINGS_PACKAGE_NAME); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/FontScalingTileTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/FontScalingTileTest.kt index c854920cbf1f..ae4da9de5e48 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/FontScalingTileTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/FontScalingTileTest.kt @@ -32,11 +32,10 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSHost import com.android.systemui.qs.QsEventLogger import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.qs.shared.QSSettingsPackageRepository import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.FakeExecutor -import com.android.systemui.util.mockito.any -import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import org.junit.After @@ -49,8 +48,10 @@ import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.never import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations +import org.mockito.kotlin.any +import org.mockito.kotlin.eq +import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @@ -68,21 +69,24 @@ class FontScalingTileTest : SysuiTestCase() { @Mock private lateinit var dialog: SystemUIDialog @Mock private lateinit var expandable: Expandable @Mock private lateinit var controller: DialogTransitionAnimator.Controller + @Mock private lateinit var settingsPackageRepository: QSSettingsPackageRepository + + @Captor private lateinit var argumentCaptor: ArgumentCaptor<Runnable> private lateinit var testableLooper: TestableLooper private lateinit var systemClock: FakeSystemClock private lateinit var backgroundDelayableExecutor: FakeExecutor private lateinit var fontScalingTile: FontScalingTile - @Captor private lateinit var argumentCaptor: ArgumentCaptor<Runnable> - @Before fun setUp() { MockitoAnnotations.initMocks(this) testableLooper = TestableLooper.get(this) - `when`(qsHost.getContext()).thenReturn(mContext) - `when`(fontScalingDialogDelegate.createDialog()).thenReturn(dialog) - `when`(expandable.dialogTransitionController(any())).thenReturn(controller) + whenever(qsHost.getContext()).thenReturn(mContext) + whenever(fontScalingDialogDelegate.createDialog()).thenReturn(dialog) + whenever(expandable.dialogTransitionController(any())).thenReturn(controller) + whenever(settingsPackageRepository.getSettingsPackageName()) + .thenReturn(SETTINGS_PACKAGE_NAME) systemClock = FakeSystemClock() backgroundDelayableExecutor = FakeExecutor(systemClock) @@ -100,6 +104,7 @@ class FontScalingTileTest : SysuiTestCase() { keyguardStateController, mDialogTransitionAnimator, { fontScalingDialogDelegate }, + settingsPackageRepository, ) fontScalingTile.initialize() testableLooper.processAllMessages() @@ -120,7 +125,7 @@ class FontScalingTileTest : SysuiTestCase() { @Test fun clickTile_screenUnlocked_showDialogAnimationFromView() { - `when`(keyguardStateController.isShowing).thenReturn(false) + whenever(keyguardStateController.isShowing).thenReturn(false) fontScalingTile.click(expandable) testableLooper.processAllMessages() @@ -130,7 +135,7 @@ class FontScalingTileTest : SysuiTestCase() { eq(null), eq(true), eq(true), - eq(false) + eq(false), ) argumentCaptor.value.run() verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean()) @@ -138,7 +143,7 @@ class FontScalingTileTest : SysuiTestCase() { @Test fun clickTile_onLockScreen_neverShowDialogAnimationFromView() { - `when`(keyguardStateController.isShowing).thenReturn(true) + whenever(keyguardStateController.isShowing).thenReturn(true) fontScalingTile.click(expandable) testableLooper.processAllMessages() @@ -148,7 +153,7 @@ class FontScalingTileTest : SysuiTestCase() { eq(null), eq(true), eq(true), - eq(false) + eq(false), ) argumentCaptor.value.run() verify(mDialogTransitionAnimator, never()).show(any(), any(), anyBoolean()) @@ -159,5 +164,10 @@ class FontScalingTileTest : SysuiTestCase() { val intent: Intent? = fontScalingTile.getLongClickIntent() assertThat(intent!!.action).isEqualTo(Settings.ACTION_TEXT_READING_SETTINGS) + assertThat(intent.getPackage()).isEqualTo(SETTINGS_PACKAGE_NAME) + } + + companion object { + private const val SETTINGS_PACKAGE_NAME = "com.android.settings" } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/dialog/InternetAdapterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/dialog/InternetAdapterTest.java index 5c6657b98801..cfbc8128282c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/dialog/InternetAdapterTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/dialog/InternetAdapterTest.java @@ -1,6 +1,6 @@ package com.android.systemui.qs.tiles.dialog; -import static com.android.systemui.qs.tiles.dialog.InternetDialogController.MAX_WIFI_ENTRY_COUNT; +import static com.android.systemui.qs.tiles.dialog.InternetDetailsContentController.MAX_WIFI_ENTRY_COUNT; import static com.google.common.truth.Truth.assertThat; @@ -63,7 +63,7 @@ public class InternetAdapterTest extends SysuiTestCase { @Mock private WifiEntry mWifiEntry; @Mock - private InternetDialogController mInternetDialogController; + private InternetDetailsContentController mInternetDetailsContentController; @Mock private Drawable mWifiDrawable; @Mock @@ -86,7 +86,7 @@ public class InternetAdapterTest extends SysuiTestCase { when(mWifiEntry.getTitle()).thenReturn(WIFI_TITLE); when(mWifiEntry.getSummary(false)).thenReturn(WIFI_SUMMARY); - mInternetAdapter = new InternetAdapter(mInternetDialogController, mScope); + mInternetAdapter = new InternetAdapter(mInternetDetailsContentController, mScope); mViewHolder = mInternetAdapter.onCreateViewHolder(new LinearLayout(mContext), 0); mInternetAdapter.setWifiEntries(Arrays.asList(mWifiEntry), 1 /* wifiEntriesCount */); } @@ -124,7 +124,7 @@ public class InternetAdapterTest extends SysuiTestCase { @Test public void onBindViewHolder_getWifiDrawableNull_noCrash() { - when(mInternetDialogController.getWifiDrawable(any())).thenReturn(null); + when(mInternetDetailsContentController.getWifiDrawable(any())).thenReturn(null); mInternetAdapter.onBindViewHolder(mViewHolder, 0); @@ -133,7 +133,7 @@ public class InternetAdapterTest extends SysuiTestCase { @Test public void onBindViewHolder_getWifiDrawableNotNull_setWifiIconDrawable() { - when(mInternetDialogController.getWifiDrawable(any())).thenReturn(mWifiDrawable); + when(mInternetDetailsContentController.getWifiDrawable(any())).thenReturn(mWifiDrawable); mInternetAdapter.onBindViewHolder(mViewHolder, 0); @@ -232,7 +232,7 @@ public class InternetAdapterTest extends SysuiTestCase { mViewHolder.onWifiClick(mWifiEntry, mock(View.class)); - verify(mInternetDialogController).startActivityForDialog(any()); + verify(mInternetDetailsContentController).startActivityForDialog(any()); verify(mSpyContext, never()).startActivity(any()); } @@ -242,7 +242,7 @@ public class InternetAdapterTest extends SysuiTestCase { mViewHolder.onWifiClick(mWifiEntry, mock(View.class)); - verify(mInternetDialogController).connect(mWifiEntry); + verify(mInternetDetailsContentController).connect(mWifiEntry); } @Test @@ -252,7 +252,7 @@ public class InternetAdapterTest extends SysuiTestCase { mViewHolder.onWifiClick(mWifiEntry, mock(View.class)); - verify(mInternetDialogController).launchWifiDetailsSetting(anyString(), any()); + verify(mInternetDetailsContentController).launchWifiDetailsSetting(anyString(), any()); } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionTileUserActionInteractorTest.kt index 3bc53b273e89..0cf3734dd92b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionTileUserActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionTileUserActionInteractorTest.kt @@ -23,29 +23,45 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.accessibility.data.repository.FakeColorCorrectionRepository +import com.android.systemui.qs.shared.QSSettingsPackageRepository import com.android.systemui.qs.tiles.base.actions.FakeQSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandlerSubject import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx import com.android.systemui.qs.tiles.impl.colorcorrection.domain.model.ColorCorrectionTileModel import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule +import org.mockito.kotlin.whenever @SmallTest @EnabledOnRavenwood @RunWith(AndroidJUnit4::class) class ColorCorrectionTileUserActionInteractorTest : SysuiTestCase() { + @get:Rule val mockito: MockitoRule = MockitoJUnit.rule() + + @Mock private lateinit var settingsPackageRepository: QSSettingsPackageRepository + private val testUser = UserHandle.CURRENT private val repository = FakeColorCorrectionRepository() private val inputHandler = FakeQSTileIntentUserInputHandler() - private val underTest = - ColorCorrectionUserActionInteractor( - repository, - inputHandler, - ) + private lateinit var underTest: ColorCorrectionUserActionInteractor + + @Before + fun setUp() { + whenever(settingsPackageRepository.getSettingsPackageName()) + .thenReturn(SETTINGS_PACKAGE_NAME) + + underTest = + ColorCorrectionUserActionInteractor(repository, inputHandler, settingsPackageRepository) + } @Test fun handleClickWhenEnabled() = runTest { @@ -86,6 +102,11 @@ class ColorCorrectionTileUserActionInteractorTest : SysuiTestCase() { QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput { assertThat(it.intent.action).isEqualTo(Settings.ACTION_COLOR_CORRECTION_SETTINGS) + assertThat(it.intent.getPackage()).isEqualTo(SETTINGS_PACKAGE_NAME) } } + + companion object { + private const val SETTINGS_PACKAGE_NAME = "com.android.settings" + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingUserActionInteractorTest.kt index d3095542e90f..9bd4895ac21c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingUserActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingUserActionInteractorTest.kt @@ -29,6 +29,7 @@ import com.android.systemui.animation.LaunchableView import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.qs.shared.QSSettingsPackageRepository import com.android.systemui.qs.tiles.base.actions.FakeQSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.actions.intentInputs import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx @@ -36,11 +37,7 @@ import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx.click import com.android.systemui.qs.tiles.impl.fontscaling.domain.model.FontScalingTileModel import com.android.systemui.statusbar.phone.FakeKeyguardStateController import com.android.systemui.statusbar.phone.SystemUIDialog -import com.android.systemui.util.mockito.any -import com.android.systemui.util.mockito.eq -import com.android.systemui.util.mockito.mock -import com.android.systemui.util.mockito.whenever -import com.google.common.truth.Truth +import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -51,15 +48,14 @@ import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.never import org.mockito.Mockito.verify +import org.mockito.kotlin.any +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) class FontScalingUserActionInteractorTest : SysuiTestCase() { - private val kosmos = Kosmos() - private val qsTileIntentUserActionHandler = FakeQSTileIntentUserInputHandler() - private val keyguardStateController = FakeKeyguardStateController() - - private lateinit var underTest: FontScalingTileUserActionInteractor @Mock private lateinit var fontScalingDialogDelegate: FontScalingDialogDelegate @Mock private lateinit var mDialogTransitionAnimator: DialogTransitionAnimator @@ -67,35 +63,47 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { @Mock private lateinit var activityStarter: ActivityStarter @Mock private lateinit var expandable: Expandable @Mock private lateinit var controller: DialogTransitionAnimator.Controller + @Mock private lateinit var settingsPackageRepository: QSSettingsPackageRepository @Captor private lateinit var argumentCaptor: ArgumentCaptor<Runnable> + private val kosmos = Kosmos() + private val scope = kosmos.testScope + private val qsTileIntentUserActionHandler = FakeQSTileIntentUserInputHandler() + private val keyguardStateController = FakeKeyguardStateController() + + private lateinit var underTest: FontScalingTileUserActionInteractor + @Before fun setup() { activityStarter = mock<ActivityStarter>() mDialogTransitionAnimator = mock<DialogTransitionAnimator>() dialog = mock<SystemUIDialog>() - fontScalingDialogDelegate = - mock<FontScalingDialogDelegate> { whenever(createDialog()).thenReturn(dialog) } + fontScalingDialogDelegate = mock<FontScalingDialogDelegate>() + whenever(fontScalingDialogDelegate.createDialog()).thenReturn(dialog) controller = mock<DialogTransitionAnimator.Controller>() - expandable = - mock<Expandable> { whenever(dialogTransitionController(any())).thenReturn(controller) } + expandable = mock<Expandable>() + whenever(expandable.dialogTransitionController(any())).thenReturn(controller) + settingsPackageRepository = mock<QSSettingsPackageRepository>() + whenever(settingsPackageRepository.getSettingsPackageName()) + .thenReturn(SETTINGS_PACKAGE_NAME) argumentCaptor = ArgumentCaptor.forClass(Runnable::class.java) underTest = FontScalingTileUserActionInteractor( - kosmos.testScope.coroutineContext, + scope.coroutineContext, qsTileIntentUserActionHandler, { fontScalingDialogDelegate }, keyguardStateController, mDialogTransitionAnimator, - activityStarter + activityStarter, + settingsPackageRepository, ) } @Test fun clickTile_screenUnlocked_showDialogAnimationFromView() = - kosmos.testScope.runTest { + scope.runTest { keyguardStateController.isShowing = false underTest.handleInput(click(FontScalingTileModel, expandable = expandable)) @@ -106,7 +114,7 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { eq(null), eq(true), eq(true), - eq(false) + eq(false), ) argumentCaptor.value.run() verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean()) @@ -114,7 +122,7 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { @Test fun clickTile_onLockScreen_neverShowDialogAnimationFromView_butShowsDialog() = - kosmos.testScope.runTest { + scope.runTest { keyguardStateController.isShowing = true underTest.handleInput(click(FontScalingTileModel, expandable = expandable)) @@ -125,7 +133,7 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { eq(null), eq(true), eq(true), - eq(false) + eq(false), ) argumentCaptor.value.run() verify(mDialogTransitionAnimator, never()).show(any(), any(), anyBoolean()) @@ -134,17 +142,20 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { @Test fun handleLongClick() = - kosmos.testScope.runTest { + scope.runTest { underTest.handleInput(QSTileInputTestKtx.longClick(FontScalingTileModel)) - Truth.assertThat(qsTileIntentUserActionHandler.handledInputs).hasSize(1) - val intentInput = qsTileIntentUserActionHandler.intentInputs.last() - val actualIntentAction = intentInput.intent.action - val expectedIntentAction = Settings.ACTION_TEXT_READING_SETTINGS - Truth.assertThat(actualIntentAction).isEqualTo(expectedIntentAction) + assertThat(qsTileIntentUserActionHandler.handledInputs).hasSize(1) + val it = qsTileIntentUserActionHandler.intentInputs.last() + assertThat(it.intent.action).isEqualTo(Settings.ACTION_TEXT_READING_SETTINGS) + assertThat(it.intent.getPackage()).isEqualTo(SETTINGS_PACKAGE_NAME) } private class FontScalingTileTestView(context: Context) : View(context), LaunchableView { override fun setShouldBlockVisibilityChanges(block: Boolean) {} } + + companion object { + private const val SETTINGS_PACKAGE_NAME = "com.android.settings" + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractorTest.kt index f574f793fbf2..3f77b86971e1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractorTest.kt @@ -23,29 +23,45 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.accessibility.data.repository.FakeColorInversionRepository +import com.android.systemui.qs.shared.QSSettingsPackageRepository import com.android.systemui.qs.tiles.base.actions.FakeQSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandlerSubject import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx import com.android.systemui.qs.tiles.impl.inversion.domain.model.ColorInversionTileModel import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule +import org.mockito.kotlin.whenever @SmallTest @EnabledOnRavenwood @RunWith(AndroidJUnit4::class) class ColorInversionUserActionInteractorTest : SysuiTestCase() { + @get:Rule val mockito: MockitoRule = MockitoJUnit.rule() + + @Mock private lateinit var settingsPackageRepository: QSSettingsPackageRepository + private val testUser = UserHandle.CURRENT private val repository = FakeColorInversionRepository() private val inputHandler = FakeQSTileIntentUserInputHandler() - private val underTest = - ColorInversionUserActionInteractor( - repository, - inputHandler, - ) + private lateinit var underTest: ColorInversionUserActionInteractor + + @Before + fun setUp() { + whenever(settingsPackageRepository.getSettingsPackageName()) + .thenReturn(SETTINGS_PACKAGE_NAME) + + underTest = + ColorInversionUserActionInteractor(repository, inputHandler, settingsPackageRepository) + } @Test fun handleClickWhenEnabled() = runTest { @@ -86,6 +102,11 @@ class ColorInversionUserActionInteractorTest : SysuiTestCase() { QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput { assertThat(it.intent.action).isEqualTo(Settings.ACTION_COLOR_INVERSION_SETTINGS) + assertThat(it.intent.getPackage()).isEqualTo(SETTINGS_PACKAGE_NAME) } } + + companion object { + private const val SETTINGS_PACKAGE_NAME = "com.android.settings" + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt index 24f6b6d8566b..7ab8ab93c024 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt @@ -36,6 +36,7 @@ import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.shade.data.repository.shadeRepository import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.shared.flag.DualShade import com.android.systemui.testKosmos @@ -124,6 +125,24 @@ class QuickSettingsShadeOverlayContentViewModelTest : SysuiTestCase() { assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade) } + @Test + fun showHeader_showsOnNarrowScreen() = + testScope.runTest { + kosmos.shadeRepository.setShadeLayoutWide(false) + runCurrent() + + assertThat(underTest.showHeader).isTrue() + } + + @Test + fun showHeader_hidesOnWideScreen() = + testScope.runTest { + kosmos.shadeRepository.setShadeLayoutWide(true) + runCurrent() + + assertThat(underTest.showHeader).isFalse() + } + private fun TestScope.lockDevice() { val currentScene by collectLastValue(sceneInteractor.currentScene) kosmos.powerInteractor.setAsleepForTest() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt index ba6518f9bd2b..cd30eddb1901 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt @@ -24,9 +24,9 @@ import android.os.UserHandle import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.internal.logging.UiEventLogger -import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.screenshot.ui.viewmodel.PreviewAction +import com.android.systemui.shared.Flags import com.google.common.truth.Truth.assertThat import java.util.UUID import kotlin.test.Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerStateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerStateTest.kt new file mode 100644 index 000000000000..e68045fe470f --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerStateTest.kt @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.chips.ui.compose + +import android.text.format.DateUtils.formatElapsedTime +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidJUnit4::class) +class ChronometerStateTest : SysuiTestCase() { + + private lateinit var mockTimeSource: MutableTimeSource + + @Before + fun setup() { + mockTimeSource = MutableTimeSource() + } + + @Test + fun initialText_isCorrect() = runTest { + val state = ChronometerState(mockTimeSource, 0L) + assertThat(state.currentTimeText).isEqualTo(formatElapsedTime(0)) + } + + @Test + fun textUpdates_withTime() = runTest { + val startTime = 1000L + val state = ChronometerState(mockTimeSource, startTime) + val job = launch { state.run() } + + val elapsedTime = 5000L + mockTimeSource.time = startTime + elapsedTime + advanceTimeBy(elapsedTime) + assertThat(state.currentTimeText).isEqualTo(formatElapsedTime(elapsedTime / 1000)) + + job.cancelAndJoin() + } + + @Test + fun textUpdates_toLargerValue() = runTest { + val startTime = 1000L + val state = ChronometerState(mockTimeSource, startTime) + val job = launch { state.run() } + + val elapsedTime = 15000L + mockTimeSource.time = startTime + elapsedTime + advanceTimeBy(elapsedTime) + assertThat(state.currentTimeText).isEqualTo(formatElapsedTime(elapsedTime / 1000)) + + job.cancelAndJoin() + } + + @Test + fun textUpdates_afterResettingBase() = runTest { + val initialElapsedTime = 30000L + val startTime = 50000L + val state = ChronometerState(mockTimeSource, startTime) + val job = launch { state.run() } + + mockTimeSource.time = startTime + initialElapsedTime + advanceTimeBy(initialElapsedTime) + assertThat(state.currentTimeText).isEqualTo(formatElapsedTime(initialElapsedTime / 1000)) + + job.cancelAndJoin() + + val newElapsedTime = 5000L + val newStartTime = 100000L + val newState = ChronometerState(mockTimeSource, newStartTime) + val newJob = launch { newState.run() } + + mockTimeSource.time = newStartTime + newElapsedTime + advanceTimeBy(newElapsedTime) + assertThat(newState.currentTimeText).isEqualTo(formatElapsedTime(newElapsedTime / 1000)) + + newJob.cancelAndJoin() + } +} + +/** A fake implementation of [TimeSource] that allows the caller to set the current time */ +class MutableTimeSource(var time: Long = 0L) : TimeSource { + override fun getCurrentTime(): Long { + return time + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt index 009b33b9f808..3515c5649ca0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt @@ -26,10 +26,12 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.fragments.FragmentHostManager import com.android.systemui.kosmos.useUnconfinedTestDispatcher +import com.android.systemui.plugins.fakeDarkIconDispatcher import com.android.systemui.statusbar.data.repository.fakeStatusBarModePerDisplayRepository import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment import com.android.systemui.statusbar.phone.fragment.dagger.HomeStatusBarComponent import com.android.systemui.statusbar.pipeline.shared.ui.composable.StatusBarRootFactory +import com.android.systemui.statusbar.policy.statusBarConfigurationController import com.android.systemui.statusbar.window.StatusBarWindowController import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import com.android.systemui.testKosmos @@ -77,6 +79,8 @@ class StatusBarInitializerTest : SysuiTestCase() { componentFactory = mock(HomeStatusBarComponent.Factory::class.java), creationListeners = setOf(), statusBarModePerDisplayRepository = statusBarModePerDisplayRepository, + darkIconDispatcher = kosmos.fakeDarkIconDispatcher, + statusBarConfigurationController = kosmos.statusBarConfigurationController, ) @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/LightBarControllerStoreImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/LightBarControllerStoreImplTest.kt index 18eef33813f6..884c35c3457d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/LightBarControllerStoreImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/LightBarControllerStoreImplTest.kt @@ -51,7 +51,7 @@ class LightBarControllerStoreImplTest : SysuiTestCase() { @Test fun forDisplay_startsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance).start() } @@ -59,7 +59,7 @@ class LightBarControllerStoreImplTest : SysuiTestCase() { @Test fun beforeDisplayRemoved_doesNotStopInstances() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance, never()).stop() } @@ -67,7 +67,7 @@ class LightBarControllerStoreImplTest : SysuiTestCase() { @Test fun displayRemoved_stopsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayDarkIconDispatcherStoreTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayDarkIconDispatcherStoreTest.kt index a2c3c66f4448..f37648a639df 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayDarkIconDispatcherStoreTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayDarkIconDispatcherStoreTest.kt @@ -56,7 +56,7 @@ class MultiDisplayDarkIconDispatcherStoreTest : SysuiTestCase() { @Test fun beforeDisplayRemoved_doesNotStopInstances() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance, never()).stop() } @@ -64,7 +64,7 @@ class MultiDisplayDarkIconDispatcherStoreTest : SysuiTestCase() { @Test fun displayRemoved_stopsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarContentInsetsProviderStoreTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarContentInsetsProviderStoreTest.kt index 4a26fdf20e6e..e0a1f273aa44 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarContentInsetsProviderStoreTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarContentInsetsProviderStoreTest.kt @@ -51,7 +51,7 @@ class MultiDisplayStatusBarContentInsetsProviderStoreTest : SysuiTestCase() { @Test fun forDisplay_startsInstances() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance).start() } @@ -59,7 +59,7 @@ class MultiDisplayStatusBarContentInsetsProviderStoreTest : SysuiTestCase() { @Test fun beforeDisplayRemoved_doesNotStopInstances() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance, never()).stop() } @@ -67,7 +67,7 @@ class MultiDisplayStatusBarContentInsetsProviderStoreTest : SysuiTestCase() { @Test fun displayRemoved_stopsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarModeRepositoryStoreTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarModeRepositoryStoreTest.kt index a9920ec5e29b..11fd902fc50c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarModeRepositoryStoreTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarModeRepositoryStoreTest.kt @@ -53,7 +53,7 @@ class MultiDisplayStatusBarModeRepositoryStoreTest : SysuiTestCase() { @Test fun forDisplay_startsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance).start() } @@ -61,7 +61,7 @@ class MultiDisplayStatusBarModeRepositoryStoreTest : SysuiTestCase() { @Test fun displayRemoved_stopsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/SystemEventChipAnimationControllerStoreImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/SystemEventChipAnimationControllerStoreImplTest.kt index e65c04c45382..3cc592c94678 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/SystemEventChipAnimationControllerStoreImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/SystemEventChipAnimationControllerStoreImplTest.kt @@ -56,7 +56,7 @@ class SystemEventChipAnimationControllerStoreImplTest : SysuiTestCase() { @Test fun beforeDisplayRemoved_doesNotStopInstances() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance, never()).stop() } @@ -64,7 +64,7 @@ class SystemEventChipAnimationControllerStoreImplTest : SysuiTestCase() { @Test fun displayRemoved_stopsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModelTest.kt new file mode 100644 index 000000000000..8650e4b8cfce --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModelTest.kt @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.featurepods.media.ui.viewmodel + +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.useUnconfinedTestDispatcher +import com.android.systemui.media.controls.data.repository.mediaFilterRepository +import com.android.systemui.media.controls.shared.model.MediaData +import com.android.systemui.media.controls.shared.model.MediaDataLoadingModel +import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlin.test.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class MediaControlChipViewModelTest : SysuiTestCase() { + private val kosmos = testKosmos().useUnconfinedTestDispatcher() + private val underTest = kosmos.mediaControlChipViewModel + + @Test + fun chip_noActiveMedia_IsHidden() = + kosmos.runTest { + val chip by collectLastValue(underTest.chip) + + assertThat(chip).isInstanceOf(PopupChipModel.Hidden::class.java) + } + + @Test + fun chip_activeMedia_IsShown() = + kosmos.runTest { + val chip by collectLastValue(underTest.chip) + + val userMedia = MediaData(active = true, song = "test") + val instanceId = userMedia.instanceId + + mediaFilterRepository.addSelectedUserMediaEntry(userMedia) + mediaFilterRepository.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId)) + + assertThat(chip).isInstanceOf(PopupChipModel.Shown::class.java) + } + + @Test + fun chip_songNameChanges_chipTextUpdated() = + kosmos.runTest { + val chip by collectLastValue(underTest.chip) + + val initialSongName = "Initial Song" + val newSongName = "New Song" + val userMedia = MediaData(active = true, song = initialSongName) + val instanceId = userMedia.instanceId + + mediaFilterRepository.addSelectedUserMediaEntry(userMedia) + mediaFilterRepository.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId)) + + assertThat((chip as PopupChipModel.Shown).chipText).isEqualTo(initialSongName) + + val updatedUserMedia = userMedia.copy(song = newSongName) + mediaFilterRepository.addSelectedUserMediaEntry(updatedUserMedia) + + assertThat((chip as PopupChipModel.Shown).chipText).isEqualTo(newSongName) + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModelTest.kt index 14787e169979..fcbf0fe9a37a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModelTest.kt @@ -22,7 +22,11 @@ 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.statusbar.chips.notification.shared.StatusBarPopupChips +import com.android.systemui.media.controls.data.repository.mediaFilterRepository +import com.android.systemui.media.controls.shared.model.MediaData +import com.android.systemui.media.controls.shared.model.MediaDataLoadingModel +import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipId +import com.android.systemui.statusbar.featurepods.popups.StatusBarPopupChips import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest @@ -35,12 +39,28 @@ import org.junit.runner.RunWith class StatusBarPopupChipsViewModelTest : SysuiTestCase() { private val kosmos = testKosmos() private val testScope = kosmos.testScope + private val mediaFilterRepository = kosmos.mediaFilterRepository private val underTest = kosmos.statusBarPopupChipsViewModel @Test - fun popupChips_allHidden_empty() = + fun shownPopupChips_allHidden_empty() = testScope.runTest { - val latest by collectLastValue(underTest.popupChips) - assertThat(latest).isEmpty() + val shownPopupChips by collectLastValue(underTest.shownPopupChips) + assertThat(shownPopupChips).isEmpty() + } + + @Test + fun shownPopupChips_activeMedia_restHidden_mediaControlChipShown() = + testScope.runTest { + val shownPopupChips by collectLastValue(underTest.shownPopupChips) + + val userMedia = MediaData(active = true, song = "test") + val instanceId = userMedia.instanceId + + mediaFilterRepository.addSelectedUserMediaEntry(userMedia) + mediaFilterRepository.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId)) + + assertThat(shownPopupChips).hasSize(1) + assertThat(shownPopupChips!!.first().chipId).isEqualTo(PopupChipId.MediaControl) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinatorTest.kt index d38fb5050c5f..5f154acbaca0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinatorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinatorTest.kt @@ -48,7 +48,7 @@ import com.android.systemui.statusbar.notification.domain.interactor.SeenNotific import com.android.systemui.statusbar.notification.domain.interactor.lockScreenShowOnlyUnseenNotificationsSetting import com.android.systemui.statusbar.notification.domain.interactor.seenNotificationsInteractor import com.android.systemui.statusbar.notification.headsup.OnHeadsUpChangedListener -import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.testKosmos import com.android.systemui.util.settings.FakeSettings @@ -625,7 +625,7 @@ class OriginalUnseenKeyguardCoordinatorTest(flags: FlagsParameterization) : Sysu val keyguardCoordinator = OriginalUnseenKeyguardCoordinator( dumpManager = kosmos.dumpManager, - headsUpManager = kosmos.headsUpManager, + headsUpManager = kosmos.mockHeadsUpManager, keyguardRepository = kosmos.keyguardRepository, keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor, logger = KeyguardCoordinatorLogger(logcatLogBuffer()), @@ -663,7 +663,8 @@ class OriginalUnseenKeyguardCoordinatorTest(flags: FlagsParameterization) : Sysu val onHeadsUpChangedListener: OnHeadsUpChangedListener get() = - argumentCaptor { verify(kosmos.headsUpManager).addListener(capture()) }.lastValue + argumentCaptor { verify(kosmos.mockHeadsUpManager).addListener(capture()) } + .lastValue } companion object { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt index be20bc1bf9d4..d86c6efce284 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt @@ -225,7 +225,7 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati val displayId = 123 darkIconRepository.darkState(displayId).value = SysuiDarkIconDispatcher.DarkChange(emptyList(), 0f, 0xAABBCC) - val iconColors by collectLastValue(underTest.iconColors(displayId)) + val iconColors by collectLastValue(underTest.iconColors(displayId)!!) assertThat(iconColors).isNotNull() assertThat(iconColors!!.tint).isEqualTo(0xAABBCC) @@ -241,7 +241,7 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati val displayId = 321 darkIconRepository.darkState(displayId).value = SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC) - val iconColors by collectLastValue(underTest.iconColors(displayId)) + val iconColors by collectLastValue(underTest.iconColors(displayId)!!) val staticDrawableColor = iconColors?.staticDrawableColor(Rect(6, 6, 7, 7)) assertThat(staticDrawableColor).isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT) } @@ -252,7 +252,7 @@ class NotificationIconContainerStatusBarViewModelTest(flags: FlagsParameterizati val displayId = 987 darkIconRepository.darkState(displayId).value = SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC) - val iconColors by collectLastValue(underTest.iconColors(displayId)) + val iconColors by collectLastValue(underTest.iconColors(displayId)!!) assertThat(iconColors!!.staticDrawableColor(Rect(6, 6, 7, 7))) .isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt index 1a1af2eecc00..256da253588c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt @@ -1,5 +1,6 @@ package com.android.systemui.statusbar.notification.stack +import android.platform.test.annotations.EnableFlags import android.service.notification.StatusBarNotification import android.testing.TestableLooper.RunWithLooper import android.view.LayoutInflater @@ -20,6 +21,8 @@ import com.android.systemui.statusbar.StatusBarIconView import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView +import com.android.systemui.statusbar.notification.shared.NotificationMinimalism +import com.android.systemui.statusbar.notification.shelf.NotificationShelfIconContainer import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.StackScrollAlgorithmState import com.android.systemui.util.mockito.mock import junit.framework.Assert.assertEquals @@ -30,6 +33,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.mock +import org.mockito.Mockito.spy import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations @@ -59,7 +63,7 @@ open class NotificationShelfTest : SysuiTestCase() { .inflate( /* resource = */ R.layout.status_bar_notification_shelf, /* root = */ root, - /* attachToRoot = */ false + /* attachToRoot = */ false, ) as NotificationShelf whenever(ambientState.largeScreenShadeInterpolator).thenReturn(largeScreenShadeInterpolator) @@ -128,6 +132,348 @@ open class NotificationShelfTest : SysuiTestCase() { } @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testAlignment_splitShade_LTR() { + // Given: LTR mode, split shade + val width = 100 + val actualWidth = 40 + val iconContainerPadding = 16f + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = false, + splitShade = true, + width = width, + actualWidth = actualWidth, + iconContainerPadding = iconContainerPadding, + ) + + // Then: shelf should align to end + assertTrue(shelfSpy.isAlignedToEnd) + assertTrue(shelfSpy.isAlignedToRight) + assertTrue(shelfSpy.mBackgroundNormal.alignToEnd) + + // Then: icon container should align to end, right + val iconContainer = shelfSpy.shelfIcons as NotificationShelfIconContainer + assertTrue(iconContainer.alignToEnd) + assertTrue(iconContainer.isAlignedToRight) + + // Then: icon container bounds are updated based on the widths and paddings + val actualPaddingStart = iconContainerPadding + val actualPaddingEnd = iconContainerPadding + val expectedLeftBound = width - actualWidth + actualPaddingStart + val expectedRightBound = width - actualPaddingEnd + assertEquals(expectedLeftBound, iconContainer.leftBound) + assertEquals(expectedRightBound, iconContainer.rightBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testAlignment_nonSplitShade_LTR() { + // Given: LTR mode, non split shade + val width = 100 + val actualWidth = 40 + val iconContainerPadding = 16f + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = false, + splitShade = false, + width = width, + actualWidth = actualWidth, + iconContainerPadding = iconContainerPadding, + ) + + // Then: shelf should not align to end + // left bound of icon container should be 16f (actualPaddingStart) + // right bound of icon container should be 24f (actualWidth - actualPaddingEnd) + assertFalse(shelfSpy.isAlignedToEnd) + assertFalse(shelfSpy.isAlignedToRight) + assertFalse(shelfSpy.mBackgroundNormal.alignToEnd) + + // Then: icon container should align to start, left + + val iconContainer = shelfSpy.shelfIcons as NotificationShelfIconContainer + assertFalse(iconContainer.alignToEnd) + assertFalse(iconContainer.isAlignedToRight) + + // Then: icon container bounds are updated based on the widths and paddings + val actualPaddingStart = iconContainerPadding + val actualPaddingEnd = iconContainerPadding + val expectedLeftBound = actualPaddingStart + val expectedRightBound = actualWidth - actualPaddingEnd + assertEquals(expectedLeftBound, iconContainer.leftBound) + assertEquals(expectedRightBound, iconContainer.rightBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testAlignment_splitShade_RTL() { + // Given: RTL mode, split shade + val width = 100 + val actualWidth = 40 + val iconContainerPadding = 16f + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = true, + splitShade = true, + width = width, + actualWidth = actualWidth, + iconContainerPadding = iconContainerPadding, + ) + + // Then: shelf should align to end, but to left due to RTL + // left bound of icon container should be 16f (actualPaddingStart) + // right bound of icon container should be 24f (actualWidth - actualPaddingEnd) + assertTrue(shelfSpy.isAlignedToEnd) + assertFalse(shelfSpy.isAlignedToRight) + assertTrue(shelfSpy.mBackgroundNormal.alignToEnd) + + // Then: icon container should align to end, left + val iconContainer = shelfSpy.shelfIcons as NotificationShelfIconContainer + assertTrue(iconContainer.alignToEnd) + assertFalse(iconContainer.isAlignedToRight) + + // Then: icon container bounds are updated based on the widths and paddings + val actualPaddingStart = iconContainerPadding + val actualPaddingEnd = iconContainerPadding + val expectedLeftBound = actualPaddingStart + val expectedRightBound = actualWidth - actualPaddingEnd + assertEquals(expectedLeftBound, iconContainer.leftBound) + assertEquals(expectedRightBound, iconContainer.rightBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testAlignment_nonSplitShade_RTL() { + // Given: RTL mode, non split shade + val width = 100 + val actualWidth = 40 + val iconContainerPadding = 16f + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = true, + splitShade = false, + width = width, + actualWidth = actualWidth, + iconContainerPadding = iconContainerPadding, + ) + + // Then: shelf should not align to end, but to right due to RTL + assertFalse(shelfSpy.isAlignedToEnd) + assertTrue(shelfSpy.isAlignedToRight) + assertFalse(shelfSpy.mBackgroundNormal.alignToEnd) + + // Then: icon container should align to start, right + val iconContainer = shelfSpy.shelfIcons as NotificationShelfIconContainer + assertFalse(iconContainer.alignToEnd) + assertTrue(iconContainer.isAlignedToRight) + + // Then: icon container bounds are updated based on the widths and paddings + val actualPaddingStart = iconContainerPadding + val actualPaddingEnd = iconContainerPadding + val expectedLeftBound = width - actualWidth + actualPaddingStart + val expectedRightBound = width - actualPaddingEnd + assertEquals(expectedLeftBound, iconContainer.leftBound) + assertEquals(expectedRightBound, iconContainer.rightBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testGetShelfLeftBound_splitShade_LTR() { + // Given: LTR mode, split shade + val width = 100 + val actualWidth = 40 + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = false, + splitShade = true, + width = width, + actualWidth = actualWidth, + ) + + // When: get the left bound of the shelf + val shelfLeftBound = shelfSpy.shelfLeftBound + + // Then: should be equal to shelf's width - actual width + val expectedLeftBound = (width - actualWidth).toFloat() + assertEquals(expectedLeftBound, shelfLeftBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testGetShelfRightBound_splitShade_LTR() { + // Given: LTR mode, split shade, width 100, actual width 40 + val width = 100 + val actualWidth = 40 + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = false, + splitShade = true, + width = width, + actualWidth = actualWidth, + ) + + // Then: the right bound of the shelf should be equal to shelf's width + val expectedRightBound = width.toFloat() + assertEquals(expectedRightBound, shelfSpy.shelfRightBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testGetShelfLeftBound_nonSplitShade_LTR() { + // Given: LTR mode, non split shade + val width = 100 + val actualWidth = 40 + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = false, + splitShade = false, + width = width, + actualWidth = actualWidth, + ) + + // When: get the left bound of the shelf + val shelfLeftBound = shelfSpy.shelfLeftBound + + // Then: should be equal to 0f + assertEquals(0f, shelfLeftBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testGetShelfRightBound_nonSplitShade_LTR() { + // Given: LTR mode, non split shade, width 100, actual width 40 + val width = 100 + val actualWidth = 40 + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = false, + splitShade = false, + width = width, + actualWidth = actualWidth, + ) + + // Then: the right bound of the shelf should be equal to shelf's actual width + assertEquals(actualWidth.toFloat(), shelfSpy.shelfRightBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testGetShelfLeftBound_splitShade_RTL() { + // Given: RTL mode, split shade + val width = 100 + val actualWidth = 40 + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = true, + splitShade = true, + width = width, + actualWidth = actualWidth, + ) + + // When: get the left bound of the shelf + val shelfLeftBound = shelfSpy.shelfLeftBound + + // Then: should be equal to 0f + assertEquals(0f, shelfLeftBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testGetShelfRightBound_splitShade_RTL() { + // Given: RTL mode, split shade, width 100, actual width 40 + val width = 100 + val actualWidth = 40 + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = true, + splitShade = true, + width = width, + actualWidth = actualWidth, + ) + + // Then: the right bound of the shelf should be equal to shelf's actual width + assertEquals(actualWidth.toFloat(), shelfSpy.shelfRightBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testGetShelfLeftBound_nonSplitShade_RTL() { + // Given: RTL mode, non split shade + val width = 100 + val actualWidth = 40 + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = true, + splitShade = false, + width = width, + actualWidth = actualWidth, + ) + + // When: get the left bound of the shelf + val shelfLeftBound = shelfSpy.shelfLeftBound + + // Then: should be equal to shelf's width - actual width + val expectedLeftBound = (width - actualWidth).toFloat() + assertEquals(expectedLeftBound, shelfLeftBound) + } + + @Test + @EnableFlags(NotificationMinimalism.FLAG_NAME) + fun testGetShelfRightBound_nonSplitShade_RTL() { + // Given: LTR mode, non split shade, width 100, actual width 40 + val width = 100 + val actualWidth = 40 + val shelfSpy = + prepareShelfSpy( + shelf, + rtl = true, + splitShade = false, + width = width, + actualWidth = actualWidth, + ) + + // Then: the right bound of the shelf should be equal to shelf's width + assertEquals(width.toFloat(), shelfSpy.shelfRightBound) + } + + private fun prepareShelfSpy( + shelf: NotificationShelf, + rtl: Boolean, + splitShade: Boolean, + width: Int, + actualWidth: Int, + iconContainerPadding: Float? = null, + ): NotificationShelf { + val shelfSpy = spy(shelf) + whenever(shelfSpy.isLayoutRtl).thenReturn(rtl) + whenever(ambientState.useSplitShade).thenReturn(splitShade) + shelfSpy.layout(0, 0, width, 5) + shelfSpy.mShelfIcons.layout(0, 0, width, 5) + iconContainerPadding?.let { + shelfSpy.mShelfIcons.actualPaddingStart = it + shelfSpy.mShelfIcons.setActualPaddingEnd(it) + } + shelfSpy.setActualWidth(actualWidth.toFloat()) + + val iconContainerSpy = spy(shelf.mShelfIcons) + whenever(iconContainerSpy.isLayoutRtl).thenReturn(rtl) + whenever(shelfSpy.shelfIcons).thenReturn(iconContainerSpy) + + return shelfSpy + } + + @Test fun getAmountInShelf_lastViewBelowShelf_completelyInShelf() { val shelfClipStart = 0f val viewStart = 1f @@ -152,7 +498,7 @@ open class NotificationShelfTest : SysuiTestCase() { /* scrollingFast= */ false, /* expandingAnimated= */ false, /* isLastChild= */ true, - shelfClipStart + shelfClipStart, ) assertEquals(1f, amountInShelf) } @@ -182,7 +528,7 @@ open class NotificationShelfTest : SysuiTestCase() { /* scrollingFast= */ false, /* expandingAnimated= */ false, /* isLastChild= */ true, - shelfClipStart + shelfClipStart, ) assertEquals(1f, amountInShelf) } @@ -212,7 +558,7 @@ open class NotificationShelfTest : SysuiTestCase() { /* scrollingFast= */ false, /* expandingAnimated= */ false, /* isLastChild= */ true, - shelfClipStart + shelfClipStart, ) assertEquals(0.5f, amountInShelf) } @@ -241,7 +587,7 @@ open class NotificationShelfTest : SysuiTestCase() { /* scrollingFast= */ false, /* expandingAnimated= */ false, /* isLastChild= */ true, - shelfClipStart + shelfClipStart, ) assertEquals(0f, amountInShelf) } @@ -250,7 +596,7 @@ open class NotificationShelfTest : SysuiTestCase() { fun updateState_expansionChanging_shelfTransparent() { updateState_expansionChanging_shelfAlphaUpdated( expansionFraction = 0.25f, - expectedAlpha = 0.0f + expectedAlpha = 0.0f, ) } @@ -260,7 +606,7 @@ open class NotificationShelfTest : SysuiTestCase() { updateState_expansionChanging_shelfAlphaUpdated( expansionFraction = 0.85f, - expectedAlpha = 0.0f + expectedAlpha = 0.0f, ) } @@ -281,7 +627,7 @@ open class NotificationShelfTest : SysuiTestCase() { updateState_expansionChanging_shelfAlphaUpdated( expansionFraction = expansionFraction, - expectedAlpha = 0.123f + expectedAlpha = 0.123f, ) } @@ -330,7 +676,7 @@ open class NotificationShelfTest : SysuiTestCase() { /* scrollingFast= */ false, /* expandingAnimated= */ false, /* isLastChild= */ true, - shelfClipStart + shelfClipStart, ) assertEquals(1f, amountInShelf) } @@ -628,7 +974,7 @@ open class NotificationShelfTest : SysuiTestCase() { private fun updateState_expansionChanging_shelfAlphaUpdated( expansionFraction: Float, - expectedAlpha: Float + expectedAlpha: Float, ) { val sbnMock: StatusBarNotification = mock() val mockEntry = mock<NotificationEntry>().apply { whenever(this.sbn).thenReturn(sbnMock) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.kt index f4c254562420..216f51d992d0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.kt @@ -38,7 +38,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationIconInteractor import com.android.systemui.statusbar.notification.domain.interactor.headsUpNotificationIconInteractor import com.android.systemui.statusbar.notification.headsup.PinnedStatus -import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotificationTestHelper import com.android.systemui.statusbar.notification.row.shared.AsyncGroupHeaderViewInflation @@ -75,7 +75,7 @@ class HeadsUpAppearanceControllerTest : SysuiTestCase() { private val keyguardStateController = kosmos.keyguardStateController private val commandQueue = kosmos.commandQueue private val notificationRoundnessManager = mock<NotificationRoundnessManager>() - private var headsUpManager = kosmos.headsUpManager + private var headsUpManager = kosmos.mockHeadsUpManager private lateinit var testHelper: NotificationTestHelper private lateinit var row: ExpandableNotificationRow diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/MultiDisplayAutoHideControllerStoreTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/MultiDisplayAutoHideControllerStoreTest.kt index 90506a1b9a7f..d16372611e88 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/MultiDisplayAutoHideControllerStoreTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/MultiDisplayAutoHideControllerStoreTest.kt @@ -56,7 +56,7 @@ class MultiDisplayAutoHideControllerStoreTest : SysuiTestCase() { @Test fun beforeDisplayRemoved_doesNotStopInstances() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance, never()).stop() } @@ -64,7 +64,7 @@ class MultiDisplayAutoHideControllerStoreTest : SysuiTestCase() { @Test fun displayRemoved_stopsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/domain/interactor/LightsOutInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/domain/interactor/LightsOutInteractorTest.kt index 2d9880a48f80..659d91a95aa8 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/domain/interactor/LightsOutInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/domain/interactor/LightsOutInteractorTest.kt @@ -39,7 +39,7 @@ class LightsOutInteractorTest : SysuiTestCase() { fun isLowProfile_lightsOutStatusBarMode_false() = runTest { statusBarModeRepository.defaultDisplay.statusBarMode.value = StatusBarMode.LIGHTS_OUT - val actual by collectLastValue(interactor.isLowProfile(DISPLAY_ID)) + val actual by collectLastValue(interactor.isLowProfile(DISPLAY_ID)!!) assertThat(actual).isTrue() } @@ -49,7 +49,7 @@ class LightsOutInteractorTest : SysuiTestCase() { statusBarModeRepository.defaultDisplay.statusBarMode.value = StatusBarMode.LIGHTS_OUT_TRANSPARENT - val actual by collectLastValue(interactor.isLowProfile(DISPLAY_ID)) + val actual by collectLastValue(interactor.isLowProfile(DISPLAY_ID)!!) assertThat(actual).isTrue() } @@ -58,7 +58,7 @@ class LightsOutInteractorTest : SysuiTestCase() { fun isLowProfile_transparentStatusBarMode_false() = runTest { statusBarModeRepository.defaultDisplay.statusBarMode.value = StatusBarMode.TRANSPARENT - val actual by collectLastValue(interactor.isLowProfile(DISPLAY_ID)) + val actual by collectLastValue(interactor.isLowProfile(DISPLAY_ID)!!) assertThat(actual).isFalse() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt index 0aaf89a4c382..a9db0b70dd4d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt @@ -23,6 +23,7 @@ import com.android.systemui.plugins.DarkIconDispatcher import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle +import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -41,6 +42,8 @@ class FakeHomeStatusBarViewModel( override val ongoingActivityChips = MutableStateFlow(MultipleOngoingActivityChipsModel()) + override val statusBarPopupChips = MutableStateFlow(emptyList<PopupChipModel.Shown>()) + override val isHomeStatusBarAllowedByScene = MutableStateFlow(false) override val shouldShowOperatorNameView = MutableStateFlow(false) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/window/MultiDisplayStatusBarWindowControllerStoreTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/window/MultiDisplayStatusBarWindowControllerStoreTest.kt index 7a9d0179b239..769f012bfdf7 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/window/MultiDisplayStatusBarWindowControllerStoreTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/window/MultiDisplayStatusBarWindowControllerStoreTest.kt @@ -53,7 +53,7 @@ class MultiDisplayStatusBarWindowControllerStoreTest : SysuiTestCase() { @Test fun beforeDisplayRemoved_doesNotStopInstances() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! verify(instance, never()).stop() } @@ -61,7 +61,7 @@ class MultiDisplayStatusBarWindowControllerStoreTest : SysuiTestCase() { @Test fun displayRemoved_stopsInstance() = testScope.runTest { - val instance = underTest.forDisplay(DEFAULT_DISPLAY) + val instance = underTest.forDisplay(DEFAULT_DISPLAY)!! fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGesture.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGesture.kt new file mode 100644 index 000000000000..68b5772bd7ac --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGesture.kt @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.touchpad.tutorial.ui.gesture + +import android.graphics.PointF +import android.view.MotionEvent +import kotlin.math.cos +import kotlin.math.sin + +/** Test helper to generate circular gestures or full EasterEgg gesture */ +object EasterEggGesture { + + fun motionEventsForGesture(): List<MotionEvent> { + val gesturePath = generateCircularGesturePoints(circlesCount = 3) + val events = + TwoFingerGesture.eventsForFullGesture { gesturePath.forEach { p -> move(p.x, p.y) } } + return events + } + + /** + * Generates list of points that would make up clockwise circular motion with given [radius]. + * [circlesCount] determines how many full circles gesture should perform. [radiusNoiseFraction] + * can introduce noise to mimic real-world gesture which is not perfect - shape will be still + * circular but radius at any given point can be deviate from given radius by + * [radiusNoiseFraction]. + */ + fun generateCircularGesturePoints( + circlesCount: Int, + radiusNoiseFraction: Double? = null, + radius: Float = 100f, + ): List<PointF> { + val pointsPerCircle = 50 + val angleStep = 360 / pointsPerCircle + val angleBuffer = 20 // buffer to make sure we're doing a bit more than 360 degree + val totalAngle = circlesCount * (360 + angleBuffer) + // Because all gestures in tests should start at (DEFAULT_X, DEFAULT_Y) we need to shift + // circle center x coordinate by radius + val centerX = -radius + val centerY = 0f + + val randomNoise: (Double) -> Double = + if (radiusNoiseFraction == null) { + { 0.0 } + } else { + { radianAngle -> sin(radianAngle * 2) * radiusNoiseFraction } + } + + val events = mutableListOf<PointF>() + var currentAngle = 0f + // as cos(0) == 1 and sin(0) == 0 we start gesture at position of (radius, 0) and go + // clockwise - first Y increases and X decreases + while (currentAngle < totalAngle) { + val radianAngle = Math.toRadians(currentAngle.toDouble()) + val radiusWithNoise = radius * (1 + randomNoise(radianAngle).toFloat()) + val x = centerX + radiusWithNoise * cos(radianAngle).toFloat() + val y = centerY + radiusWithNoise * sin(radianAngle).toFloat() + events.add(PointF(x, y)) + currentAngle += angleStep + } + return events + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureRecognizerTest.kt index ff0cec5e06e9..3829778864f1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureRecognizerTest.kt @@ -16,29 +16,28 @@ package com.android.systemui.touchpad.tutorial.ui.gesture +import android.graphics.PointF import android.view.MotionEvent import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE +import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGesture.generateCircularGesturePoints import com.google.common.truth.Truth.assertThat -import kotlin.math.cos -import kotlin.math.sin +import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @SmallTest @RunWith(AndroidJUnit4::class) -class EasterEggGestureTest : SysuiTestCase() { - - private data class Point(val x: Float, val y: Float) +class EasterEggGestureRecognizerTest : SysuiTestCase() { private var triggered = false - private val handler = - TouchpadGestureHandler( - BackGestureRecognizer(gestureDistanceThresholdPx = SWIPE_DISTANCE.toInt()), - EasterEggGestureMonitor(callback = { triggered = true }), - ) + private val gestureRecognizer = EasterEggGestureRecognizer() + + @Before + fun setup() { + gestureRecognizer.addGestureStateCallback { triggered = it == GestureState.Finished } + } @Test fun easterEggTriggeredAfterThreeCircles() { @@ -99,56 +98,13 @@ class EasterEggGestureTest : SysuiTestCase() { } private fun assertStateAfterEvents(events: List<MotionEvent>, wasTriggered: Boolean) { - events.forEach { handler.onMotionEvent(it) } + events.forEach { gestureRecognizer.accept(it) } assertThat(triggered).isEqualTo(wasTriggered) } - private fun assertStateAfterTwoFingerGesture(gesturePath: List<Point>, wasTriggered: Boolean) { + private fun assertStateAfterTwoFingerGesture(gesturePath: List<PointF>, wasTriggered: Boolean) { val events = - TwoFingerGesture.eventsForFullGesture { gesturePath.forEach { (x, y) -> move(x, y) } } + TwoFingerGesture.eventsForFullGesture { gesturePath.forEach { p -> move(p.x, p.y) } } assertStateAfterEvents(events = events, wasTriggered = wasTriggered) } - - /** - * Generates list of points that would make up clockwise circular motion with given [radius]. - * [circlesCount] determines how many full circles gesture should perform. [radiusNoiseFraction] - * can introduce noise to mimic real-world gesture which is not perfect - shape will be still - * circular but radius at any given point can be deviate from given radius by - * [radiusNoiseFraction]. - */ - private fun generateCircularGesturePoints( - circlesCount: Int, - radiusNoiseFraction: Double? = null, - radius: Float = 100f, - ): List<Point> { - val pointsPerCircle = 50 - val angleStep = 360 / pointsPerCircle - val angleBuffer = 20 // buffer to make sure we're doing a bit more than 360 degree - val totalAngle = circlesCount * (360 + angleBuffer) - // Because all gestures in tests should start at (DEFAULT_X, DEFAULT_Y) we need to shift - // circle center x coordinate by radius - val centerX = -radius - val centerY = 0f - - val events = mutableListOf<Point>() - val randomNoise: (Double) -> Double = - if (radiusNoiseFraction == null) { - { 0.0 } - } else { - { radianAngle -> sin(radianAngle * 2) * radiusNoiseFraction } - } - - var currentAngle = 0f - // as cos(0) == 1 and sin(0) == 0 we start gesture at position of (radius, 0) and go - // clockwise - first Y increases and X decreases - while (currentAngle < totalAngle) { - val radianAngle = Math.toRadians(currentAngle.toDouble()) - val radiusWithNoise = radius * (1 + randomNoise(radianAngle).toFloat()) - val x = centerX + radiusWithNoise * cos(radianAngle).toFloat() - val y = centerY + radiusWithNoise * sin(radianAngle).toFloat() - events.add(Point(x, y)) - currentAngle += angleStep - } - return events - } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureRecognizerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureRecognizerTest.kt index 8972f3ec71af..8b526bb1d55b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureRecognizerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/ThreeFingerGestureRecognizerTest.kt @@ -30,12 +30,14 @@ import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecogn import com.android.systemui.touchpad.ui.gesture.FakeVelocityTracker import com.google.common.truth.Truth.assertThat import org.junit.Before +import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import platform.test.runner.parameterized.ParameterizedAndroidJunit4 import platform.test.runner.parameterized.Parameters @SmallTest +@Ignore("b/386412866") @RunWith(ParameterizedAndroidJunit4::class) class ThreeFingerGestureRecognizerTest( private val recognizer: GestureRecognizer, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandlerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadEventsFilterTest.kt index c302b40fc4d7..20bcb3eac8a0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandlerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadEventsFilterTest.kt @@ -33,12 +33,11 @@ import org.junit.runner.RunWith @SmallTest @RunWith(AndroidJUnit4::class) -class TouchpadGestureHandlerTest : SysuiTestCase() { +class TouchpadEventsFilterTest : SysuiTestCase() { private var gestureState: GestureState = GestureState.NotStarted private val gestureRecognizer = BackGestureRecognizer(gestureDistanceThresholdPx = SWIPE_DISTANCE.toInt()) - private val handler = TouchpadGestureHandler(gestureRecognizer, EasterEggGestureMonitor {}) @Before fun before() { @@ -48,21 +47,21 @@ class TouchpadGestureHandlerTest : SysuiTestCase() { @Test fun handlesEventsFromTouchpad() { val event = downEvent(source = SOURCE_MOUSE, toolType = TOOL_TYPE_FINGER) - val eventHandled = handler.onMotionEvent(event) + val eventHandled = gestureRecognizer.handleTouchpadMotionEvent(event) assertThat(eventHandled).isTrue() } @Test fun ignoresEventsFromMouse() { val event = downEvent(source = SOURCE_MOUSE, toolType = TOOL_TYPE_MOUSE) - val eventHandled = handler.onMotionEvent(event) + val eventHandled = gestureRecognizer.handleTouchpadMotionEvent(event) assertThat(eventHandled).isFalse() } @Test fun ignoresEventsFromTouch() { val event = downEvent(source = SOURCE_TOUCHSCREEN, toolType = TOOL_TYPE_FINGER) - val eventHandled = handler.onMotionEvent(event) + val eventHandled = gestureRecognizer.handleTouchpadMotionEvent(event) assertThat(eventHandled).isFalse() } @@ -70,25 +69,10 @@ class TouchpadGestureHandlerTest : SysuiTestCase() { fun ignoresButtonClicksFromTouchpad() { val event = downEvent(source = SOURCE_MOUSE, toolType = TOOL_TYPE_FINGER) event.buttonState = MotionEvent.BUTTON_PRIMARY - val eventHandled = handler.onMotionEvent(event) + val eventHandled = gestureRecognizer.handleTouchpadMotionEvent(event) assertThat(eventHandled).isFalse() } private fun downEvent(source: Int, toolType: Int) = motionEvent(action = ACTION_DOWN, x = 0f, y = 0f, source = source, toolType = toolType) - - @Test - fun triggersGestureDoneForThreeFingerGesture() { - backGestureEvents().forEach { handler.onMotionEvent(it) } - - assertThat(gestureState).isEqualTo(GestureState.Finished) - } - - private fun backGestureEvents(): List<MotionEvent> { - return ThreeFingerGesture.eventsForFullGesture { - move(deltaX = SWIPE_DISTANCE / 4) - move(deltaX = SWIPE_DISTANCE / 2) - move(deltaX = SWIPE_DISTANCE) - } - } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModelTest.kt index f90e14caca75..79c1f9fcf517 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModelTest.kt @@ -54,13 +54,6 @@ class BackGestureScreenViewModelTest : SysuiTestCase() { } @Test - fun easterEggNotTriggeredAtStart() = - kosmos.runTest { - val easterEggTriggered by collectLastValue(viewModel.easterEggTriggered) - assertThat(easterEggTriggered).isFalse() - } - - @Test fun emitsProgressStateWithLeftProgressAnimation() = kosmos.runTest { assertProgressWhileMovingFingers( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModelTest.kt new file mode 100644 index 000000000000..4af374287c62 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModelTest.kt @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.touchpad.tutorial.ui.viewmodel + +import android.view.MotionEvent +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.kosmos.Kosmos +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.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGesture +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class EasterEggGestureViewModelTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val viewModel = EasterEggGestureViewModel() + + @Before + fun before() { + kosmos.useUnconfinedTestDispatcher() + } + + @Test + fun easterEggNotTriggeredAtStart() = + kosmos.runTest { + val easterEggTriggered by collectLastValue(viewModel.easterEggTriggered) + assertThat(easterEggTriggered).isFalse() + } + + @Test + fun emitsTrueOnEasterEggTriggered() = + kosmos.runTest { + assertStateAfterEvents( + events = EasterEggGesture.motionEventsForGesture(), + expected = true, + ) + } + + @Test + fun emitsFalseOnEasterEggCallbackExecuted() = + kosmos.runTest { + val easterEggTriggered by collectLastValue(viewModel.easterEggTriggered) + EasterEggGesture.motionEventsForGesture().forEach { viewModel.accept(it) } + + assertThat(easterEggTriggered).isEqualTo(true) + viewModel.onEasterEggFinished() + assertThat(easterEggTriggered).isEqualTo(false) + } + + private fun Kosmos.assertStateAfterEvents(events: List<MotionEvent>, expected: Boolean) { + val state by collectLastValue(viewModel.easterEggTriggered) + events.forEach { viewModel.accept(it) } + assertThat(state).isEqualTo(expected) + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModelTest.kt index 3c06352ace97..4dfd01a91f17 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModelTest.kt @@ -70,13 +70,6 @@ class HomeGestureScreenViewModelTest : SysuiTestCase() { } @Test - fun easterEggNotTriggeredAtStart() = - kosmos.runTest { - val easterEggTriggered by collectLastValue(viewModel.easterEggTriggered) - assertThat(easterEggTriggered).isFalse() - } - - @Test fun emitsProgressStateWithAnimationMarkers() = kosmos.runTest { assertStateAfterEvents( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModelTest.kt index a2d8a8b3cb0e..66bf778a754b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModelTest.kt @@ -74,13 +74,6 @@ class RecentAppsGestureScreenViewModelTest : SysuiTestCase() { } @Test - fun easterEggNotTriggeredAtStart() = - kosmos.runTest { - val easterEggTriggered by collectLastValue(viewModel.easterEggTriggered) - assertThat(easterEggTriggered).isFalse() - } - - @Test fun emitsProgressStateWithAnimationMarkers() = kosmos.runTest { assertStateAfterEvents( diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index 41c3e06bd062..83a607b14a19 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -42,7 +42,7 @@ <string name="keyguard_sim_puk_locked_message" msgid="2503428315518592542">"SIMa PUKaren bidez desblokeatu behar da."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="8489092646014631659">"SIMa desblokeatzen…"</string> <string name="keyguard_accessibility_pin_area" msgid="7403009340414014734">"PIN kodearen eremua"</string> - <string name="keyguard_accessibility_password" msgid="3524161948484801450">"Gailuaren pasahitza"</string> + <string name="keyguard_accessibility_password" msgid="3524161948484801450">"Gailuko pasahitza"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="6272116591533888062">"SIM txartelaren PIN kodearen eremua"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="5537294043180237374">"SIM txartelaren PUK kodearen eremua"</string> <string name="keyboardview_keycode_delete" msgid="8489719929424895174">"Ezabatu"</string> diff --git a/packages/SystemUI/res-product/values-ar/strings.xml b/packages/SystemUI/res-product/values-ar/strings.xml index 7332ec8a2294..a25e8c154528 100644 --- a/packages/SystemUI/res-product/values-ar/strings.xml +++ b/packages/SystemUI/res-product/values-ar/strings.xml @@ -66,8 +66,6 @@ <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"يمكنك فتح قفل جهازك للوصول إلى مزيد من الخيارات."</string> <string name="media_transfer_playing_this_device" product="default" msgid="5795784619523545556">"جارٍ تشغيل الوسائط على هذا الهاتف."</string> <string name="media_transfer_playing_this_device" product="tablet" msgid="222514408550408633">"جارٍ تشغيل الوسائط على هذا الجهاز اللوحي."</string> - <!-- no translation found for finder_active (2734050945122991747) --> - <skip /> - <!-- no translation found for finder_active (8045583079989970505) --> - <skip /> + <string name="finder_active" product="default" msgid="2734050945122991747">"يمكنك تحديد مكان هذا الهاتف باستخدام تطبيق \"العثور على جهازي\" حتى عندما يكون مُطفأً"</string> + <string name="finder_active" product="tablet" msgid="8045583079989970505">"يمكنك تحديد مكان هذا الجهاز اللوحي باستخدام تطبيق \"العثور على جهازي\" حتى عندما يكون مُطفأً"</string> </resources> diff --git a/packages/SystemUI/res-product/values-hi/strings.xml b/packages/SystemUI/res-product/values-hi/strings.xml index 92d55054a53a..67bc2a3aa95d 100644 --- a/packages/SystemUI/res-product/values-hi/strings.xml +++ b/packages/SystemUI/res-product/values-hi/strings.xml @@ -66,8 +66,6 @@ <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ज़्यादा विकल्प देखने के लिए, अपना डिवाइस अनलॉक करें"</string> <string name="media_transfer_playing_this_device" product="default" msgid="5795784619523545556">"मीडिया इस फ़ोन पर चल रहा है"</string> <string name="media_transfer_playing_this_device" product="tablet" msgid="222514408550408633">"मीडिया इस टैबलेट पर चल रहा है"</string> - <!-- no translation found for finder_active (2734050945122991747) --> - <skip /> - <!-- no translation found for finder_active (8045583079989970505) --> - <skip /> + <string name="finder_active" product="default" msgid="2734050945122991747">"आप Find My Device की मदद से, इस फ़ोन के बंद होने पर भी इसकी जगह की जानकारी का पता लगा सकते हैं"</string> + <string name="finder_active" product="tablet" msgid="8045583079989970505">"आप Find My Device की मदद से, इस टैबलेट के बंद होने पर भी इसकी जगह की जानकारी का पता लगा सकते हैं"</string> </resources> diff --git a/packages/SystemUI/res-product/values-pt-rBR/strings.xml b/packages/SystemUI/res-product/values-pt-rBR/strings.xml index 1a99a1618bd9..f21bbd0f61b2 100644 --- a/packages/SystemUI/res-product/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-product/values-pt-rBR/strings.xml @@ -66,6 +66,6 @@ <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloqueie seu dispositivo para ver mais opções"</string> <string name="media_transfer_playing_this_device" product="default" msgid="5795784619523545556">"Tocando neste smartphone"</string> <string name="media_transfer_playing_this_device" product="tablet" msgid="222514408550408633">"Mídia tocando neste tablet"</string> - <string name="finder_active" product="default" msgid="2734050945122991747">"Localize o smartphone com o Encontre Meu Dispositivo mesmo se ele estiver desligado"</string> - <string name="finder_active" product="tablet" msgid="8045583079989970505">"Localize o tablet com o Encontre Meu Dispositivo mesmo se ele estiver desligado"</string> + <string name="finder_active" product="default" msgid="2734050945122991747">"Você pode localizar o smartphone com o Encontre Meu Dispositivo mesmo se ele estiver desligado"</string> + <string name="finder_active" product="tablet" msgid="8045583079989970505">"Você pode localizar o tablet com o Encontre Meu Dispositivo mesmo se ele estiver desligado"</string> </resources> diff --git a/packages/SystemUI/res-product/values-pt/strings.xml b/packages/SystemUI/res-product/values-pt/strings.xml index 1a99a1618bd9..f21bbd0f61b2 100644 --- a/packages/SystemUI/res-product/values-pt/strings.xml +++ b/packages/SystemUI/res-product/values-pt/strings.xml @@ -66,6 +66,6 @@ <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloqueie seu dispositivo para ver mais opções"</string> <string name="media_transfer_playing_this_device" product="default" msgid="5795784619523545556">"Tocando neste smartphone"</string> <string name="media_transfer_playing_this_device" product="tablet" msgid="222514408550408633">"Mídia tocando neste tablet"</string> - <string name="finder_active" product="default" msgid="2734050945122991747">"Localize o smartphone com o Encontre Meu Dispositivo mesmo se ele estiver desligado"</string> - <string name="finder_active" product="tablet" msgid="8045583079989970505">"Localize o tablet com o Encontre Meu Dispositivo mesmo se ele estiver desligado"</string> + <string name="finder_active" product="default" msgid="2734050945122991747">"Você pode localizar o smartphone com o Encontre Meu Dispositivo mesmo se ele estiver desligado"</string> + <string name="finder_active" product="tablet" msgid="8045583079989970505">"Você pode localizar o tablet com o Encontre Meu Dispositivo mesmo se ele estiver desligado"</string> </resources> diff --git a/packages/SystemUI/res/layout/status_bar_notification_shelf.xml b/packages/SystemUI/res/layout/status_bar_notification_shelf.xml index 58c545036b27..071b07631ff9 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_shelf.xml +++ b/packages/SystemUI/res/layout/status_bar_notification_shelf.xml @@ -24,11 +24,11 @@ android:clickable="true" > - <com.android.systemui.statusbar.notification.row.NotificationBackgroundView + <com.android.systemui.statusbar.notification.shelf.NotificationShelfBackgroundView android:id="@+id/backgroundNormal" android:layout_width="match_parent" android:layout_height="match_parent" /> - <com.android.systemui.statusbar.phone.NotificationIconContainer + <com.android.systemui.statusbar.notification.shelf.NotificationShelfIconContainer android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index bad5711a1ccc..327075967dba 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -33,15 +33,25 @@ app:layout_constraintStart_toStartOf="@id/volume_dialog_main_slider_container" app:layout_constraintTop_toTopOf="@id/volume_ringer_drawer" /> + <View + android:id="@+id/volume_ringer_horizontal_background" + android:layout_width="0dp" + android:layout_height="0dp" + android:background="@drawable/volume_dialog_background" + app:layout_constraintBottom_toTopOf="@id/volume_dialog_main_slider_container" + app:layout_constraintEnd_toEndOf="@id/volume_ringer_drawer" + app:layout_constraintStart_toStartOf="@id/volume_ringer_drawer" + app:layout_constraintTop_toTopOf="@id/volume_dialog_background" /> + <include android:id="@id/volume_ringer_drawer" layout="@layout/volume_ringer_drawer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/volume_dialog_components_spacing" + android:layout_marginRight="@dimen/volume_dialog_ringer_drawer_diff_right_margin" app:layout_constraintBottom_toTopOf="@id/volume_dialog_main_slider_container" app:layout_constraintEnd_toEndOf="@id/volume_dialog_main_slider_container" - app:layout_constraintStart_toStartOf="@id/volume_dialog_main_slider_container" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="1" /> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 72b57cab8431..ebc19350805a 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Deurlopende kennisgewing vir \'n skermopnamesessie"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Neem jou skerm op?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Neem een app op"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Neem hele skerm op"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Neem hele skerm op: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Wanneer jy jou hele skerm opneem, word enigiets wat op jou skerm wys, opgeneem. Wees dus versigtig met dinge soos wagwoorde, betalingbesonderhede, boodskappe, foto’s, en oudio en video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Wanneer jy ’n app opneem, word enigiets wat in daardie app gewys of gespeel word, opgeneem. Wees dus versigtig met dinge soos wagwoorde, betalingbesonderhede, boodskappe, foto’s, en oudio en video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Neem skerm op"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Kon nie voorafstelling opdateer nie"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Voorafstelling"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Gekies"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Nutsgoed"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Intydse Onderskrifte"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Nota"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Wys laeprioriteit-kennisgewingikone"</string> <string name="other" msgid="429768510980739978">"Ander"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"verwyder teël"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"voeg teël aan einde by"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Skuif teël"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Voeg teël by"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Skuif na <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Voeg by posisie <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posisie is ongeldig."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"kies gebruiker"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Geen internet nie"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Maak <xliff:g id="ID_1">%s</xliff:g>-instellings oop."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Wysig volgorde van instellings."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aan/af-kieslys"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Bladsy <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Sluitskerm"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ontkoppel)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Kan nie wissel nie. Tik om weer te probeer."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Koppel ’n toestel"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Maak die app oop om hierdie sessie uit te saai."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Onbekende app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Hou op uitsaai"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Beskikbare toestelle vir oudio-uitsette."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klaar"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Probeer weer!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gaan terug"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Swiep links of regs met drie vingers op jou raakpaneel"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Mooi so!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Jy het die Gaan Terug-gebaar voltooi."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Swiep links of regs met drie vingers om terug te gaan met jou raakpaneel"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Gaan na tuisskerm"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Swiep op met drie vingers op jou raakpaneel"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Uitstekende werk!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Jy het die Gaan na Tuisskerm-gebaar voltooi"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Swiep op met drie vingers op jou raakpaneel om na jou tuisskerm te gaan"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Bekyk onlangse apps"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Swiep op en hou met drie vingers op jou raakpaneel"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Jy het die Bekyk Onlangse Apps-gebaar voltooi"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Druk die handelingsleutel op jou sleutelbord om al jou apps te bekyk"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutoriaalanimasie; klik om te onderbreek of hervat om te speel."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Sleutelbordlig"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Vlak %1$d van %2$d"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 586c204e02da..18bffac51025 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"ለአንድ የማያ ገፅ ቀረጻ ክፍለ-ጊዜ በመካሄድ ያለ ማሳወቂያ"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"ማያ ገፅዎን ይቀዳሉ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"አንድ መተግበሪያ ቅዳ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"መላው ማያ ገፅን ቅረጽ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ሙሉ ማያ ገፅን ቅዳ፦ %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"መላው ማያ ገፅዎን በሚቀዱበት ጊዜ፣ በማያ ገፅዎ ላይ የሚታየው ማንኛውም ነገር ይቀዳል። ስለዚህ እንደ የይለፍ ቃላት፣ የክፍያ ዝርዝሮች፣ መልዕክቶች፣ ፎቶዎች እና ኦዲዮ እና ቪድዮ ላሉ ነገሮች ጥንቃቄ ያድርጉ።"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"መተግበሪያን ሲቀዱ በዚያ መተግበሪያ ውስጥ የሚታይ ወይም የሚጫወት ማንኛውም ነገር ይቀዳል። ስለዚህ እንደ የይለፍ ቃላት፣ የክፍያ ዝርዝሮች፣ መልዕክቶች፣ ፎቶዎች እና ኦዲዮ እና ቪድዮ ላሉ ነገሮች ጥንቃቄ ያድርጉ።"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ማያ ገፅን ቅረጽ"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"ቅድመ-ቅምጥን ማዘመን አልተቻለም"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"ቅድመ-ቅምጥ"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"ተመርጧል"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"መሣሪያዎች"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"የቀጥታ መግለጫ ጽሑፍ"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"ማስታወሻ"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"አነስተኛ ቅድሚያ ያላቸው የማሳወቂያ አዶዎችን አሳይ"</string> <string name="other" msgid="429768510980739978">"ሌላ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ሰቅ አስወግድ"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ሰቅ መጨረሻው ላይ አክል"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ሰቁን ውሰድ"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ሰቅ ያክሉ"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"ወደ <xliff:g id="POSITION">%1$d</xliff:g> ውሰድ"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"ወደ <xliff:g id="POSITION">%1$d</xliff:g> ቦታ አክል"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"አቀማመጡ ተቀባይነት የለውም።"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ተጠቃሚ ይምረጡ"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ምንም በይነመረብ የለም"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"የ<xliff:g id="ID_1">%s</xliff:g> ቅንብሮችን ክፈት።"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"የቅንብሮድ ቅደም-ተከተል አርትዕ።"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"የኃይል ምናሌ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ገፅ <xliff:g id="ID_1">%1$d</xliff:g> ከ <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ማያ ገፅ ቁልፍ"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ተቋርጧል)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"መቀየር አይቻልም። እንደገና ለመሞከር መታ ያድርጉ።"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"አንድ መሣሪያ ያገናኙ"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ይህን ክፍለ ጊዜ cast ለማድረግ፣ እባክዎ መተግበሪያውን ይክፈቱ።"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"የማይታወቅ መተግበሪያ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Cast ማድረግ አቁም"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ለኦዲዮ ውጽዓት ተገኚ የሆኑ መሣሪያዎች"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ወደ መነሻ ሂድ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ተከናውኗል"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"እንደገና ይሞክሩ!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ወደኋላ ተመለስ"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"የመዳሰሻ ሰሌዳዎ ላይ ሦስት ጣቶችን በመጠቀም ወደ ግራ ወይም ወደ ቀኝ ያንሸራትቱ"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"አሪፍ!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ወደኋላ የመመለስ ምልክትን አጠናቅቀዋል።"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"የመዳሰሻ ሰሌዳዎን ወደመጠቀም ለመመለስ ሦስት ጣቶችን በመጠቀም ወደ ግራ ወይም ወደ ቀኝ ያንሸራትቱ"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ወደ መነሻ ሂድ"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"በመዳሰሻ ሰሌዳዎ ላይ በሦስት ጣቶች ወደ ላይ ያንሸራትቱ"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"ጥሩ ሥራ!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"ወደ መነሻ ሂድ ምልክትን አጠናቅቀዋል"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"ወደ መነሻ ማያ ገፅዎ ለመሄድ የመዳሰሻ ሰሌዳዎ ላይ በሦስት ጣቶች ወደ ላይ ያንሸራትቱ"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"የመዳሰሻ ሰሌዳዎ ላይ ሦስት ጣቶችን በመጠቀም ወደላይ ያንሸራትቱ እና ይያዙ"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ጥሩ ሠርተዋል!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"የቅርብ ጊዜ መተግበሪያዎች አሳይ ምልክትን አጠናቅቀዋል።"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"የቅርብ ጊዜ መተግበሪያዎችን ለማየት የመዳሰሻ ሰሌዳዎ ላይ ሦስት ጣቶችን በመጠቀም ወደላይ ያንሸራትቱ እና ይያዙ"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"የሁሉንም መተግበሪያዎች አሳይ ምልክትን አጠናቅቀዋል"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"ሁሉንም መተግበሪያዎችዎን ለማየት በቁልፍ ሰሌዳዎ ላይ ያለውን የድርጊት ቁልፍ ይጫኑ"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"የአጋዥ ሥልጠና እነማ፣ ማጫወትን ባለበት ለማቆም እና ከቆመበት ለመቀጠል ጠቅ ያድርጉ።"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"የቁልፍ ሰሌዳ የጀርባ ብርሃን"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"ደረጃ %1$d ከ %2$d"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 92d0cbb823bc..20668f821c9d 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"إشعار مستمر لجلسة تسجيل شاشة"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"هل تريد تسجيل الشاشة؟"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"تسجيل شاشة تطبيق واحد"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"تسجيل الشاشة بكاملها"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"تسجيل محتوى الشاشة بالكامل: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"أثناء تسجيل محتوى الشاشة بالكامل، يتم تسجيل كل المحتوى المعروض على شاشتك، لذا يُرجى توخي الحذر بشأن المعلومات الظاهرة، مثل كلمات المرور وتفاصيل الدفع والرسائل والصور والمقاطع الصوتية والفيديوهات."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"سيتم تسجيل كل المحتوى المعروض أو المشغَّل على شاشة التطبيق، لذا يُرجى توخي الحذر بشأن المعلومات الظاهرة، مثل كلمات المرور وتفاصيل الدفع والرسائل والصور والمقاطع الصوتية والفيديوهات."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"تسجيل الشاشة"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"تعذَّر تعديل الإعداد المسبق"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"الإعدادات المسبقة"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"تمّ اختياره"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"الأدوات"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"النسخ النصي التلقائي"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"ملاحظات"</string> @@ -753,20 +769,13 @@ <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"قمر صناعي، الاتصال متوفّر"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"اتصالات الطوارئ بالقمر الصناعي"</string> <string name="satellite_emergency_only_carrier_text" msgid="828510231597991206">"مكالمات الطوارئ أو ميزة \"اتصالات طوارئ بالقمر الصناعي\""</string> - <!-- no translation found for accessibility_phone_string_format (7798841417881811812) --> - <skip /> - <!-- no translation found for accessibility_no_signal (7052827511409250167) --> - <skip /> - <!-- no translation found for accessibility_one_bar (5342012847647834506) --> - <skip /> - <!-- no translation found for accessibility_two_bars (122628483354508429) --> - <skip /> - <!-- no translation found for accessibility_three_bars (5143286602926069024) --> - <skip /> - <!-- no translation found for accessibility_four_bars (8838495563822541844) --> - <skip /> - <!-- no translation found for accessibility_signal_full (1519655809806462972) --> - <skip /> + <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> + <string name="accessibility_two_bars" msgid="122628483354508429">"شريطا إشارة"</string> + <string name="accessibility_three_bars" msgid="5143286602926069024">"ثلاثة أشرطة إشارة"</string> + <string name="accessibility_four_bars" msgid="8838495563822541844">"أربعة أشرطة إشارة"</string> + <string name="accessibility_signal_full" msgid="1519655809806462972">"شريط إشارة كاملة"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"ملف العمل"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"متعة للبعض وليس للجميع"</string> <string name="tuner_warning" msgid="1861736288458481650">"توفر لك أداة ضبط واجهة مستخدم النظام طرقًا إضافية لتعديل واجهة مستخدم Android وتخصيصها. ويمكن أن تطرأ تغييرات على هذه الميزات التجريبية أو يمكن أن تتعطل هذه الميزات أو تختفي في الإصدارات المستقبلية. عليك متابعة الاستخدام مع توخي الحذر."</string> @@ -967,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"إظهار رموز الإشعارات ذات الأولوية المنخفضة"</string> <string name="other" msgid="429768510980739978">"غير ذلك"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"إزالة بطاقة"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"إضافة بطاقة إلى نهاية الإعدادات السريعة"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"نقل بطاقة"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"إضافة بطاقة"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"الانتقال إلى <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"الإضافة إلى الموضع <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"الموضِع غير صالح."</string> @@ -985,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"اختيار مستخدم"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"لا يتوفر اتصال إنترنت."</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"فتح إعدادات <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"تعديل ترتيب الإعدادات."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"قائمة زر التشغيل"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"الصفحة <xliff:g id="ID_1">%1$d</xliff:g> من <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"شاشة القفل"</string> @@ -1216,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(غير متّصل)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"لا يمكن التبديل. انقر لإعادة المحاولة."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ربط جهاز"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"لبث هذه الجلسة، يُرجى فتح التطبيق"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"تطبيق غير معروف"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"إيقاف البث"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"الأجهزة المتاحة لإخراج الصوت"</string> @@ -1475,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"الانتقال إلى الصفحة الرئيسية"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"عرض التطبيقات المستخدَمة مؤخرًا"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"تم"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"يُرجى إعادة المحاولة"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"رجوع"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"مرِّر سريعًا لليمين أو لليسار باستخدام 3 أصابع على لوحة اللمس"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"أحسنت."</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"لقد أكملت التدريب على إيماءة الرجوع."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"للرجوع باستخدام لوحة اللمس، يُرجى التمرير سريعًا لليمين أو لليسار باستخدام ثلاثة أصابع"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"الانتقال إلى الشاشة الرئيسية"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"مرّر سريعًا للأعلى باستخدام 3 أصابع على لوحة اللمس"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"أحسنت صنعًا."</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"لقد أكملت الدليل التوجيهي عن إيماءة \"الانتقال إلى الشاشة الرئيسية\""</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"يُرجى التمرير سريعًا للأعلى باستخدام ثلاثة أصابع على لوحة اللمس للانتقال إلى الشاشة الرئيسية"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"عرض التطبيقات المستخدَمة مؤخرًا"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"مرِّر سريعًا للأعلى مع الاستمرار باستخدام 3 أصابع على لوحة اللمس"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"أحسنت."</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"لقد أكملْت التدريب على إيماءة عرض التطبيقات المستخدَمة مؤخرًا."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"لعرض التطبيقات المستخدَمة مؤخرًا، يُرجى التمرير سريعًا للأعلى مع الاستمرار باستخدام ثلاثة أصابع على لوحة اللمس"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"لقد أكملْت التدريب على إيماءة عرض جميع التطبيقات"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"يمكنك الضغط على مفتاح الإجراء في لوحة المفاتيح لعرض جميع التطبيقات"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"صورة متحركة للدليل التوجيهي: يمكنك النقر عليها لإيقاف تشغيلها مؤقتًا واستئنافه."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"الإضاءة الخلفية للوحة المفاتيح"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"مستوى الإضاءة: %1$d من %2$d"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 89e5083fdc23..fb0030f28ed8 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রীন ৰেকৰ্ডিং ছেশ্বন চলি থকা সময়ত পোৱা জাননী"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"আপোনাৰ স্ক্ৰীনখন ৰেকৰ্ড কৰিবনে?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"এটা এপ্ ৰেকৰ্ড কৰক"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"গোটেই স্ক্ৰীনখন ৰেকৰ্ড কৰক"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"গোটেই স্ক্ৰীনখন ৰেকৰ্ড কৰক: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"আপুনি গোটেই স্ক্ৰীনখন ৰেকৰ্ডিং কৰিলে, আপোনাৰ স্ক্ৰীনখনত দেখুওৱা যিকোনো বস্তু ৰেকৰ্ড কৰা হয়। গতিকে, পাছৱৰ্ড, পৰিশোধৰ সবিশেষ, বাৰ্তা, ফট’ আৰু অডিঅ’ আৰু ভিডিঅ’ৰ ক্ষেত্ৰত সাৱধান হওক।"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"আপুনি কোনো এপ্ ৰেকৰ্ড কৰিলে, সেই এপত দেখুওৱা বা প্লে’ কৰা যিকোনো বস্তু ৰেকৰ্ড কৰা হয়। গতিকে, পাছৱৰ্ড, পৰিশোধৰ সবিশেষ, বাৰ্তা, ফট’ আৰু অডিঅ’ আৰু ভিডিঅ’ৰ ক্ষেত্ৰত সাৱধান হওক।"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"স্ক্ৰীনখন ৰেকৰ্ড কৰক"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"প্ৰিছেট আপডে’ট কৰিব পৰা নগ’ল"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"প্ৰিছেট"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"বাছনি কৰা হৈছে"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"সঁজুলি"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"লাইভ কেপশ্বন"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"টোকা"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"কম গুৰুত্বপূৰ্ণ জাননীৰ আইকনসমূহ দেখুৱাওক"</string> <string name="other" msgid="429768510980739978">"অন্যান্য"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"টাইল আঁতৰাবলৈ"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"টাইল শেষত যোগ দিবলৈ"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"টাইল স্থানান্তৰ কৰক"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"টাইল যোগ দিয়ক"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> নম্বৰলৈ স্থানান্তৰ কৰক"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> নম্বৰ স্থানত যোগ দিয়ক"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"স্থান অমান্য।"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ব্যৱহাৰকাৰী বাছনি কৰক"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ইণ্টাৰনেট সংযোগ নাই"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g>ৰ ছেটিং খোলক।"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ছেটিঙৰ ক্ৰম সম্পাদনা কৰক।"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"পাৱাৰ মেনু"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>ৰ পৃষ্ঠা <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"লক স্ক্ৰীন"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(সংযোগ বিচ্ছিন্ন কৰা হৈছে)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"সলনি কৰিব নোৱাৰি। আকৌ চেষ্টা কৰিবলৈ টিপক।"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ডিভাইচ সংযোগ কৰক"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"এই ছেশ্বনটো কাষ্ট কৰিবলৈ, অনুগ্ৰহ কৰি এপ্টো খোলক"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"অজ্ঞাত এপ্"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"কাষ্ট বন্ধ কৰক"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"অডিঅ\' আউটপুটৰ বাবে উপলব্ধ ডিভাইচ।"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"গৃহ পৃষ্ঠালৈ যাওক"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"শেহতীয়া এপ্সমূহ চাওক"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"হ’ল"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"পুনৰ চেষ্টা কৰক!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"উভতি যাওক"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"আপোনাৰ টাচ্চপেডত তিনিটা আঙুলি ব্যৱহাৰ কৰি বাওঁফাললৈ বা সোঁফাললৈ ছোৱাইপ কৰক"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"সুন্দৰ!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"আপুনি উভতি যোৱাৰ নিৰ্দেশটো সম্পূৰ্ণ কৰিলে।"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"আপোনাৰ টাচ্চপেড ব্যৱহাৰ কৰি উভতি যাবলৈ, তিনিটা আঙুলি ব্যৱহাৰ কৰি বাওঁ বা সোঁফালে ছোৱাইপ কৰক"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"গৃহ পৃষ্ঠালৈ যাওক"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"আপোনাৰ টাচ্চপেডত তিনিটা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰক"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"বঢ়িয়া!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"আপুনি গৃহ স্ক্ৰীনলৈ যোৱাৰ নিৰ্দেশটো সম্পূৰ্ণ কৰিলে"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"আপোনাৰ গৃহ স্ক্ৰীনলৈ যাবলৈ আপোনাৰ টাচ্চপেডত তিনিটা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰক"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"শেহতীয়া এপ্সমূহ চাওক"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"আপোনাৰ টাচ্চপেডত তিনিটা আঙুলি ব্যৱহাৰ কৰি ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"বঢ়িয়া!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"আপুনি শেহতীয়া এপ্ চোৱাৰ নিৰ্দেশনাটো সম্পূৰ্ণ কৰিছে।"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"শেহতীয়া এপ্সমূহ চাবলৈ, আপোনাৰ টাচ্চপেডত তিনিটা আঙুলি ব্যৱহাৰ কৰি ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"আপুনি আটাইবোৰ এপ্ চোৱাৰ নিৰ্দেশনাটো সম্পূৰ্ণ কৰিছে"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"আপোনাৰ আটাইবোৰ এপ্ চাবলৈ আপোনাৰ কীব’ৰ্ডত কাৰ্য কীটো টিপক"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"টিউট’ৰিয়েল এনিমেশ্বন, পজ কৰিবলৈ আৰু প্লে’ কৰাটো পুনৰ আৰম্ভ কৰিবলৈ ক্লিক কৰক।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"কীব’ৰ্ডৰ বেকলাইট"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dৰ %1$d স্তৰ"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 31238d0e0c41..532fcebf7ef3 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekranın video çəkimi ərzində silinməyən bildiriş"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Ekran qeydə alınsın?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Bir tətbiqi qeydə alın"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Bütün ekranı qeydə alın"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Bütün ekranı qeydə alın: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Bütün ekranı qeydə alarkən ekranda göstərilən bütün kontent qeydə alınır. Parol, ödəniş detalları, mesaj, foto, habelə audio və video kimi məlumatlarla bağlı diqqətli olun."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Tətbiq qeydə aldıqda həmin tətbiqdə göstərilən və ya işə salınan bütün kontent qeydə alınır. Parol, ödəniş detalları, mesaj, foto, habelə audio və video kimi məlumatlarla bağlı diqqətli olun."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Ekranı qeydə alın"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Hazır ayar güncəllənmədi"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Hazır Ayar"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Seçilib"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Alətlər"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Canlı Altyazı"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Qeyd"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Aşağı prioritet bildiriş işarələrini göstərin"</string> <string name="other" msgid="429768510980739978">"Digər"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"lövhəni silin"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"sona lövhə əlavə edin"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Lövhəni köçürün"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Lövhə əlavə edin"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> mövqeyinə köçürün"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> mövqeyinə əlavə edin"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Mövqe yanlışdır."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"istifadəçi seçin"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"İnternet yoxdur"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ayarlarını açın."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Ayarların sıralanmasını redaktə edin."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Qidalanma düyməsi menyusu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> səhifədən <xliff:g id="ID_1">%1$d</xliff:g> səhifə"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ekran kilidi"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(bağlantı kəsildi)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Dəyişmək olmur. Yenidən cəhd etmək üçün toxunun."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Cihaz qoşun"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Bu sessiyanı yayımlamaq üçün tətbiqi açın."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Naməlum tətbiq"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Yayımı dayandırın"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio çıxış üçün əlçatan cihazlar."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hazırdır"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <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> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Taçpeddə üç barmaqla sola və ya sağa sürüşdürün"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Əla!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Geri getmə jestini tamamladınız."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Taçpedi istifadə edərək geri qayıtmaq üçün üç barmağınızla sola və ya sağa çəkin"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Əsas səhifəyə keçin"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Taçpeddə üç barmaqla yuxarı sürüşdürün"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Əla!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Əsas səhifəyə keçid jestini tamamladınız"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Ana ekrana keçmək üçün taçpeddə üç barmağınızla yuxarı çəkin"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Son tətbiqlərə baxın"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Taçpeddə üç barmaqla yuxarı çəkib saxlayın"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"\"Bütün tətbiqlərə baxın\" jestini tamamladınız"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Bütün tətbiqlərinizə baxmaq üçün klaviaturada fəaliyyət düyməsini basın"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Öyrədici animasiya, oxudulmanı durdurmaq və davam etdirmək üçün klikləyin."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatura işığı"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Səviyyə %1$d/%2$d"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 68100187e717..d0c3fa33f398 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obaveštenje o sesiji snimanja ekrana je aktivno"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Želite da snimite ekran?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Snimi jednu aplikaciju"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Snimi ceo ekran"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Snimite ceo ekran: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kada snimate ceo ekran, snima se sve što je na njemu. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, audio i video sadržaj."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kada snimate aplikaciju, snima se sav sadržaj koji se prikazuje ili pušta u njoj. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, audio i video sadržaj."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Snimi ekran"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Ažuriranje zadatih podešavanja nije uspelo"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Unapred određena podešavanja"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Izabrano"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Alatke"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Titl uživo"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Beleška"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Prikaži ikone obaveštenja niskog prioriteta"</string> <string name="other" msgid="429768510980739978">"Drugo"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"uklonili pločicu"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"dodali pločicu na kraj"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Premestite pločicu"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Dodajte pločicu"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Premestite na <xliff:g id="POSITION">%1$d</xliff:g>. poziciju"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Dodajte na <xliff:g id="POSITION">%1$d</xliff:g>. poziciju"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Pozicija je nevažeća."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"odabrali korisnika"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nema interneta"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otvori podešavanja za <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Izmeni redosled podešavanja."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni dugmeta za uključivanje"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. strana od <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Zaključan ekran"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(veza je prekinuta)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Prebacivanje nije uspelo. Probajte ponovo."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Povežite uređaj"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Da biste prebacivali ovu sesiju, otvorite aplikaciju."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nepoznata aplikacija"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi prebacivanje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audio izlaz."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Probajte ponovo."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazad"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Prevucite ulevo ili udesno sa tri prsta na tačpedu"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Super!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Dovršili ste pokret za povratak."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Da biste se vratili pomoću tačpeda, prevucite ulevo ili udesno sa tri prsta"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Idi na početni ekran"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Prevucite nagore sa tri prsta na tačpedu"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Odlično!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Dovršili ste pokret za povratak na početnu stranicu."</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Da biste otišli na početni ekran, prevucite nagore sa tri prsta na tačpedu"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Prikaži nedavno korišćene aplikacije"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Prevucite nagore i zadržite sa tri prsta na tačpedu"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Dovršili ste pokret za prikazivanje svih aplikacija."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Pritisnite taster radnji na tastaturi da biste pregledali sve aplikacije"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacija vodiča, kliknite da biste pauzirali i nastavili reprodukciju."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvetljenje tastature"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. nivo od %2$d"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index d95fd67c5dad..b40801dcd09a 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Бягучае апавяшчэнне для сеанса запісу экрана"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Запісаць экран?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Запісаць адну праграму"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Запісаць змесціва ўсяго экрана"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Запісваць экран цалкам: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Пры запісе ўсяго экрана запісваецца ўсё, што паказваецца на экране. Таму прадухіліце паказ пароляў, плацежных рэквізітаў, паведамленняў, фота, відэа і аўдыя."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Пры запісе праграмы запісваецца ўсё, што паказваецца або прайграецца ў гэтай праграме. Таму прадухіліце паказ пароляў, плацежных рэквізітаў, паведамленняў, фота, відэа і аўдыя."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Запісаць экран"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Не ўдалося абнавіць набор налад"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Набор налад"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Выбрана"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Інструменты"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Аўтаматычныя субцітры"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Нататка"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Паказваць значкі апавяшчэнняў з нізкім прыярытэтам"</string> <string name="other" msgid="429768510980739978">"Іншае"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"выдаліць плітку"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"дадаць плітку ў канец"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Перамясціць плітку"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Дадаць плітку"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Перамясціць на пазіцыю <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Дадаць на пазіцыю <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Няправільнае месца."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"выбраць карыстальніка"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Няма падключэння да інтэрнэту"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Адкрыць налады <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Змяніць парадак налад."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопкі сілкавання"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Старонка <xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Экран блакіроўкі"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(адключана)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Не ўдалося пераключыцца. Дакраніцеся, каб паўтарыць спробу."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Падключыць прыладу"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Для трансляцыі гэтага сеанса адкрыйце праграму."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Невядомая праграма"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Спыніць трансляцыю"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Даступныя прылады для вываду аўдыя."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"На галоўную старонку"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прагляд нядаўніх праграм"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Гатова"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Паспрабуйце яшчэ раз!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Правядзіце па сэнсарнай панэлі трыма пальцамі ўлева ці ўправа"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Выдатна!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Вы навучыліся рабіць жэст вяртання."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Каб вярнуцца назад з дапамогай сэнсарнай панэлі, правядзіце трыма пальцамі ўлева ці ўправа"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"На галоўны экран"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Правядзіце па сэнсарнай панэлі трыма пальцамі ўверх"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Выдатная праца!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Вы навучыліся рабіць жэст для пераходу на галоўны экран"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Каб перайсці на галоўны экран, правядзіце трыма пальцамі ўверх па сэнсарным экране"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Прагляд нядаўніх праграм"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Правядзіце па сэнсарнай панэлі трыма пальцамі ўверх і затрымайце пальцы"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Выдатная праца!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Вы скончылі вывучэнне жэсту для прагляду нядаўніх праграм."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Каб праглядзець нядаўнія праграмы, правядзіце трыма пальцамі ўверх па сэнсарным экране і затрымайце пальцы"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Вы навучыліся рабіць жэст для прагляду ўсіх праграм"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Каб праглядзець усе праграмы, націсніце на клавішу дзеяння на клавіятуры"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анімацыя ў дапаможніку: націсніце, каб прыпыніць ці ўзнавіць прайграванне."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Падсветка клавіятуры"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Узровень %1$d з %2$d"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 344c011e74d4..83aa4e57b911 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущо известие за сесия за записване на екрана"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Да се записва ли екранът?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Записване на едно приложение"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Записване на целия екран"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Записване на целия екран: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Когато записвате целия си екран, се записва всичко, което се показва на него. Затова бъдете внимателни с неща като пароли, подробности за начини на плащане, съобщения, снимки, аудио и видео."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Когато записвате приложение, се записва всичко, което се показва или възпроизвежда в него. Затова бъдете внимателни с неща като пароли, подробности за начини на плащане, съобщения, снимки, аудио и видео."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Записване на екрана"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Предварително зададените настройки не бяха актуализирани"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Предварително зададено"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Избрано"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Инструменти"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Надписи на живо"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Бележка"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Показване на иконите за известията с нисък приоритет"</string> <string name="other" msgid="429768510980739978">"Друго"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"премахване на панел"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"добавяне на панел в края"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Преместване на панел"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Добавяне на панел"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Преместване към позиция <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Добавяне към позиция <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Невалидна позиция."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"изберете потребител"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Няма връзка с интернет"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Отваряне на настройките за <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Редактиране на подредбата на настройките."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню за включване/изключване"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Страница <xliff:g id="ID_1">%1$d</xliff:g> от <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Заключен екран"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(връзката е прекратена)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Не може да се превключи. Докоснете за нов опит."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Свързване на устройство"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"За да предавате тази сесия, моля, отворете приложението."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Неизвестно приложение"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Спиране на предаването"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Налични устройства за аудиоизход."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Към началния екран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Преглед на скорошните приложения"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Опитайте отново!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Плъзнете три пръста наляво или надясно по сензорния панел"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Чудесно!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Изпълнихте жеста за връщане назад."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"За да се върнете назад чрез сензорния панел, прекарайте три пръста наляво или надясно"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Към началния екран"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Плъзнете три пръста нагоре по сензорния панел"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Отлично!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Изпълнихте жеста за преминаване към началния екран"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Плъзнете три пръста нагоре по сензорния панел, за да преминете към началния екран"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Преглед на скорошните приложения"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Плъзнете три пръста нагоре по сензорния панел и задръжте"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Отлично!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Изпълнихте жеста за преглед на скорошните приложения."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"За да прегледате скорошните приложения, плъзнете три пръста нагоре по сензорния панел и задръжте"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Изпълнихте жеста за преглед на всички приложения"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Натиснете клавиша за действия на клавиатурата си, за да прегледате всичките си приложения"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анимация за урока. Кликнете, за да поставите на пауза и да възобновите възпроизвеждането."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Подсветка на клавиатурата"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Ниво %1$d от %2$d"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index d7b24c8fe2ee..b927ad19283a 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রিন রেকর্ডিং সেশন চলার বিজ্ঞপ্তি"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"আপনার স্ক্রিন রেকর্ড করবেন?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"একটি অ্যাপ রেকর্ড করুন"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"সম্পূর্ণ স্ক্রিন রেকর্ড করুন"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"পুরো স্ক্রিন রেকর্ড করুন: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"আপনার সম্পূর্ণ স্ক্রিন রেকর্ড করার সময়, আপনার স্ক্রিনে দেখানো সব কিছু রেকর্ড করা হয়। তাই পাসওয়ার্ড, পেমেন্টের বিবরণ, মেসেজ, ফটো এবং অডিও ও ভিডিওর মতো বিষয়ের ক্ষেত্রে সতর্ক থাকুন।"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"আপনি কোনও অ্যাপ রেকর্ড করার সময়, সেই অ্যাপে দেখানো বা চালানো সব কিছু রেকর্ড করা হয়। তাই পাসওয়ার্ড, পেমেন্টের বিবরণ, মেসেজ, ফটো এবং অডিও ও ভিডিওর মতো বিষয়ের ক্ষেত্রে সতর্ক থাকুন।"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"স্ক্রিন রেকর্ড করুন"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"প্রিসেট আপডেট করা যায়নি"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"প্রিসেট"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"বেছে নেওয়া হয়েছে"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"টুল"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"লাইভ ক্যাপশন"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"মনে রাখবেন"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"কম-গুরুত্বপূর্ণ বিজ্ঞপ্তির আইকন দেখুন"</string> <string name="other" msgid="429768510980739978">"অন্যান্য"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"টাইল সরান"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"শেষে টাইল যোগ করুন"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"টাইল সরান"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"টাইল যোগ করুন"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g>-এ সরান"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"অবস্থান <xliff:g id="POSITION">%1$d</xliff:g>-এ যোগ করুন"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"পজিশন সঠিক নয়।"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ব্যবহারকারী বেছে নিন"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ইন্টারনেট কানেকশন নেই"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> সেটিংস খুলুন৷"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ক্রম বা সেটিংস সম্পাদনা করুন৷"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"পাওয়ার মেনু"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>টির মধ্যে <xliff:g id="ID_1">%1$d</xliff:g> নং পৃষ্ঠা"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"লক স্ক্রিন"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ডিসকানেক্ট হয়ে গেছে)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"পাল্টানো যাচ্ছে না। আবার চেষ্টা করতে ট্যাপ করুন।"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ডিভাইস কানেক্ট করুন"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"এই সেশন কাস্ট করার জন্য, অ্যাপ খুলুন।"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"অজানা অ্যাপ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"কাস্ট করা বন্ধ করুন"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"অডিও আউটপুটের জন্য উপলভ্য ডিভাইস।"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"হোমে যান"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপ দেখুন"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"হয়ে গেছে"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"আবার চেষ্টা করুন!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ফিরে যান"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"আপনার টাচপ্যাডে তিনটি আঙুল ব্যবহার করে বাঁদিকে বা ডানদিকে সোয়াইপ করুন"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"সাবাস!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"জেসচার ব্যবহার করে কীভাবে ফিরে যাওয়া যায় সেই সম্পর্কে আপনি জেনেছেন।"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"নিজের টাচপ্যাড ব্যবহার করে ফিরে যেতে, তিনটি আঙুল ব্যবহার করে বাঁদিকে বা ডানদিকে সোয়াইপ করুন"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"হোমে যান"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"আপনার টাচপ্যাডে তিনটি আঙুলের সাহায্যে উপরের দিকে সোয়াইপ করুন"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"অসাধারণ!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"জেসচার ব্যবহার করে কীভাবে হোমে ফিরে যাওয়া যায় সেই সম্পর্কে আপনি জেনেছেন"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"আপনার হোম স্ক্রিনে যেতে নিজের টাচপ্যাডে তিনটি আঙুল ব্যবহার করে উপরের দিকে সোয়াইপ করুন"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপ দেখুন"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"আপনার টাচপ্যাডে তিনটি আঙুল ব্যবহার করে উপরের দিকে সোয়াইপ করে ধরে রাখুন"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"অসাধারণ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপের জেসচার দেখা সম্পূর্ণ করেছেন।"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"সাম্প্রতিক অ্যাপ দেখতে, নিজের টাচপ্যাডে তিনটি আঙুল ব্যবহার করে উপরের দিকে সোয়াইপ করে হোল্ড করুন"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"আপনি \'সব অ্যাপের জেসচার দেখুন\' টিউটোরিয়াল সম্পূর্ণ করেছেন"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"নিজের সব অ্যাপ দেখতে আপনার কীবোর্ডে অ্যাকশন \'কী\' প্রেস করুন"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"টিউটোরিয়াল অ্যানিমেশন পজ করুন এবং আবার চালু করতে ক্লিক করুন।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"কীবোর্ড ব্যাকলাইট"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-এর মধ্যে %1$d লেভেল"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index b85845940204..defc62e084c9 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obavještenje za sesiju snimanja ekrana je u toku"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Snimati ekran?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Snimaj jednu aplikaciju"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Snimaj cijeli ekran"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Snimi cijeli ekran: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kada snimate cijeli ekran, snimat će se sve što se prikazuje na ekranu. Stoga budite oprezni s informacijama kao što su lozinke, podaci o plaćanju, poruke, fotografije, audio i videozapisi."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kada snimate aplikaciju, snimat će se sve što se prikazuje ili reproducira u toj aplikaciji. Stoga budite oprezni s informacijama kao što su lozinke, podaci o plaćanju, poruke, fotografije, audio i videozapisi."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Snimaj ekran"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Ažuriranje zadane postavke nije uspjelo"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Zadana postavka"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Odabrano"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Alati"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Automatski titlovi"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Bilješka"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Prikaži ikone obavještenja niskog prioriteta"</string> <string name="other" msgid="429768510980739978">"Ostalo"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"uklanjanje kartice"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"dodavanje kartice na kraj"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"dodavanje kartice na posljednji položaj"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Pomjeranje kartice"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Dodavanje kartice"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Dodajte karticu na željeni položaj"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Pomjeranje u položaj <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Dodavanje u položaj <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Nevažeći položaj."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"odaberete korisnika"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nema internetske veze"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otvori postavke za: <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Urediti raspored postavki."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Uredite redoslijed brzih postavki."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni napajanja"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Zaključani ekran"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(veza je prekinuta)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nije moguće prebaciti. Dodirnite da pokušate ponovo."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Povežite uređaj"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Da emitirate ovu sesiju, otvorite aplikaciju."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nepoznata aplikacija"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi emitiranje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audio izlaz."</string> @@ -1468,32 +1483,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Pokušajte ponovo!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazad"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Prevucite ulijevo ili udesno s tri prsta na dodirnoj podlozi"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Lijepo!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Savladali ste pokret za vraćanje."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Da se vratite pomoću dodirne podloge, prevucite ulijevo ili udesno s tri prsta"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Odlazak na početni ekran"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Prevucite nagore s tri prsta na dodirnoj podlozi"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Sjajno!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Savladali ste pokret za odlazak na početni ekran"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Prevucite nagore s tri prsta na dodirnoj podlozi da odete na početni ekran"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Prikaz nedavnih aplikacija"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Prevucite nagore i zadržite s tri prsta na dodirnoj podlozi"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Izvršili ste pokret za prikaz svih aplikacija"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Pritisnite tipku radnji na tastaturi da pogledate sve aplikacije"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacija vodiča; pauziranje i nastavak reprodukcije klikom."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvjetljenje tastature"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. nivo od %2$d"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index c8f371cff8d3..05c9d8162021 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificació en curs d\'una sessió de gravació de la pantalla"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Vols gravar la pantalla?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Grava una aplicació"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Grava tota la pantalla"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Grava tota la pantalla: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Quan graves tota la pantalla, es grava tot el que es mostra en pantalla. Per aquest motiu, ves amb compte amb elements com les contrasenyes, les dades de pagament, els missatges, les fotos, i l\'àudio i el vídeo."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Quan graves una aplicació, es grava tot el que es mostra o es reprodueix en aquesta aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos, i l\'àudio i el vídeo."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Grava la pantalla"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"No s\'ha pogut actualitzar el valor predefinit"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Valors predefinits"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Seleccionat"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Eines"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Subtítols instantanis"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Nota"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Mostra les icones de notificació amb prioritat baixa"</string> <string name="other" msgid="429768510980739978">"Altres"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"suprimir el mosaic"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"afegir un mosaic al final"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mou el mosaic"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Afegeix una icona"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Mou a la posició <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Afegeix a la posició <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"La posició no és vàlida."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"triar un usuari"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Sense connexió a Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Obre la configuració per a <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edita l\'ordre de la configuració."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú d\'engegada"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Pàgina <xliff:g id="ID_1">%1$d</xliff:g> (<xliff:g id="ID_2">%2$d</xliff:g> en total)"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantalla de bloqueig"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(desconnectat)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"No es pot canviar. Torna-ho a provar."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Connecta un dispositiu"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Per emetre aquesta sessió, obre l\'aplicació."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplicació desconeguda"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Atura l\'emissió"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositius disponibles per a la sortida d\'àudio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fet"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Torna-ho a provar"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Torna"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Llisca cap a l\'esquerra o cap a la dreta amb tres dits al ratolí tàctil"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Molt bé!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Has completat el gest per tornar enrere."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Per tornar enrere amb el ratolí tàctil, llisca cap a l\'esquerra o cap a la dreta amb tres dits"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ves a la pantalla d\'inici"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Llisca cap amunt amb tres dits al ratolí tàctil"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Ben fet!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Has completat el gest per anar a la pantalla d\'inici"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Llisca cap amunt amb tres dits al ratolí tàctil per anar a la pantalla d\'inici"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Mostra les aplicacions recents"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Llisca cap amunt amb tres dits i mantén-los premuts al ratolí tàctil"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Has completat el gest per veure totes les aplicacions"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Prem la tecla d\'acció al teclat per veure totes les aplicacions"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animació del tutorial; fes clic per posar en pausa i reprendre la reproducció."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroil·luminació del teclat"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivell %1$d de %2$d"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index efc699b09317..7ae441627e87 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Trvalé oznámení o relaci nahrávání"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Pořídit nahrávku obrazovky?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Nahrát jednu aplikaci"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Nahrát celou obrazovku"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Nahrát celou obrazovku: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Při nahrávání celé obrazovky se zaznamenává veškerý obsah na obrazovce. Buďte proto opatrní, když jde o hesla, platební údaje, zprávy, fotografie, zvuk a video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Při nahrávání aplikace se zaznamenává všechno, co se v dané obrazovce zobrazuje nebo přehrává. Buďte proto opatrní, když jde o hesla, platební údaje, zprávy, fotografie, zvuk a video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Nahrát obrazovku"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Předvolbu nelze aktualizovat"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Předvolba"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Vybráno"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Nástroje"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Okamžité titulky"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Poznámka"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Zobrazit ikony oznámení s nízkou prioritou"</string> <string name="other" msgid="429768510980739978">"Jiné"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"odstranit dlaždici"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"přidat dlaždici na konec"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Přesunout dlaždici"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Přidat dlaždici"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Přesunout na pozici <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Přidat dlaždici na pozici <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Pozice není platná."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"zvolit uživatele"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nejste připojeni k internetu"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otevřít nastavení aplikace <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Upravit pořadí nastavení."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Nabídka vypínače"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Stránka <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Obrazovka uzamčení"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(odpojeno)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nelze přepnout. Klepnutím opakujte akci."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Připojit zařízení"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Pokud chcete odesílat relaci, otevřete aplikaci."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Neznámá aplikace"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zastavit odesílání"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupná zařízení pro zvukový výstup."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hotovo"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Zkuste to znovu."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Zpět"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Přejeďte po touchpadu třemi prsty doleva nebo doprava"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Skvělé!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Provedli jste gesto pro přechod zpět."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Pokud se chcete vrátit zpět pomocí touchpadu, přejeďte třemi prsty vlevo nebo vpravo"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Přejít na plochu"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Přejeďte po touchpadu třemi prsty nahoru"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Výborně!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Provedli jste gesto pro přechod na plochu"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Přejetím po touchpadu třemi prsty nahoru přejdete na plochu"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Zobrazit nedávné aplikace"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Přejeďte po touchpadu třemi prsty nahoru a podržte je"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Provedli jste gesto k zobrazení všech aplikací"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Stisknutím akční klávesy na klávesnici zobrazíte všechny aplikace"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Výuková animace, kliknutím pozastavíte nebo obnovíte."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podsvícení klávesnice"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Úroveň %1$d z %2$d"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 4336a853b33f..c168a306b4cd 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Konstant notifikation om skærmoptagelse"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Vil du optage din skærm?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Optag én app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Optag hele skærmen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Optag hele skærmen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Når du optager hele skærmen, bliver alt det, der vises på skærmen, optaget. Vær derfor forsigtig med ting såsom adgangskoder, betalingsoplysninger, beskeder, billeder, lyd og video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Når du optager en app, optages alt det, der vises eller afspilles i den pågældende app. Vær derfor forsigtig med ting såsom adgangskoder, betalingsoplysninger, beskeder, billeder, lyd og video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Optag skærm"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Forindstillingen kunne ikke opdateres"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Forindstilling"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Valgt"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Værktøjer"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Livetekstning"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Note"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Vis ikoner for notifikationer med lav prioritet"</string> <string name="other" msgid="429768510980739978">"Andet"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"fjern felt"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"føj feltet til slutningen"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Flyt felt"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Tilføj felt"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Flyt til <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Føj til lokation <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Positionen er ugyldig."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"vælge bruger"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Intet internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Åbn <xliff:g id="ID_1">%s</xliff:g>-indstillinger."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Rediger rækkefølgen af indstillinger."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu for afbryderknappen"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Side <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Låseskærm"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(afbrudt)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Det var ikke muligt at skifte. Tryk for at prøve igen."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Tilknyt en enhed"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Åbn appen for at caste denne session."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Ukendt app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop med at caste"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Enheder, der er tilgængelige for lydudgang."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Udfør"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Prøv igen!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gå tilbage"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Stryg til venstre eller højre med tre fingre på touchpladen"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Sådan!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Du har udført bevægelsen for Gå tilbage."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Du kan gå tilbage ved at stryge til venstre eller højre med tre fingre på touchpladen"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Gå til startskærmen"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Stryg opad med tre fingre på touchpladen"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Flot!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Du har udført bevægelsen for at gå til startsiden"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Stryg opad med tre fingre på touchpladen for at gå til din startskærm"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se seneste apps"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Stryg opad, og hold tre fingre på touchpladen"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du har udført bevægelsen for at se alle apps"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Tryk på handlingstasten på dit tastatur for at se alle dine apps"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation med vejledning. Klik for at sætte afspilningen på pause og genoptage den."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastaturets baggrundslys"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d af %2$d"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 6e8cffee3b03..eaa849db64b1 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Fortlaufende Benachrichtigung für eine Bildschirmaufzeichnung"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Bildschirm aufnehmen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Einzelne App aufnehmen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Gesamten Bildschirm aufnehmen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Gesamten Bildschirm aufnehmen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Wenn du den gesamten Bildschirm aufnimmst, ist in der Aufnahme alles zu sehen, was auf dem Bildschirm angezeigt wird. Sei also vorsichtig mit Informationen wie Passwörtern, Zahlungsdetails, Nachrichten, Fotos sowie Audio- und Videoinhalten."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Wenn du eine App aufnimmst, ist in der Aufnahme alles zu sehen, was in dieser App angezeigt oder abgespielt wird. Sei also vorsichtig mit Informationen wie Passwörtern, Zahlungsdetails, Nachrichten, Fotos sowie Audio- und Videoinhalten."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Bildschirm aufnehmen"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Voreinstellung konnte nicht aktualisiert werden"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Voreinstellung"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Ausgewählt"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Tools"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Automatische Untertitel"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Notiz"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Symbole für Benachrichtigungen mit einer niedrigen Priorität anzeigen"</string> <string name="other" msgid="429768510980739978">"Sonstiges"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"Entfernen der Kachel"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"Hinzufügen der Kachel am Ende"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Kachel verschieben"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Kachel hinzufügen"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Auf Position <xliff:g id="POSITION">%1$d</xliff:g> verschieben"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Zur Position <xliff:g id="POSITION">%1$d</xliff:g> hinzufügen"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Position ist ungültig."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"Auswählen des Nutzers"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Kein Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Einstellungen für <xliff:g id="ID_1">%s</xliff:g> öffnen."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Reihenfolge der Einstellungen bearbeiten."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Ein-/Aus-Menü"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Seite <xliff:g id="ID_1">%1$d</xliff:g> von <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Sperrbildschirm"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(nicht verbunden)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Wechseln nicht möglich. Tippe, um es noch einmal zu versuchen."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Gerät verbinden"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Öffne zum Streamen dieser Sitzung die App."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unbekannte App"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Streaming beenden"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Für die Audioausgabe verfügbare Geräte."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fertig"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Noch einmal versuchen"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Zurück"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Wische mit drei Fingern auf dem Touchpad nach links oder rechts"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Sehr gut!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Du hast das Tutorial für die „Zurück“-Touch-Geste abgeschlossen."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Wenn du mit dem Touchpad zurückgehen möchtest, wische mit drei Fingern nach links oder rechts"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Startbildschirm"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Wische an einer beliebigen Stelle auf dem Touchpad mit drei Fingern nach oben"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Gut gemacht!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Du hast den Schritt für die „Startbildschirm“-Touch-Geste abgeschlossen"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Wenn du zum Startbildschirm gelangen möchtest, wische auf dem Touchpad mit drei Fingern nach oben"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Letzte Apps aufrufen"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Wische mit drei Fingern nach oben und halte das Touchpad gedrückt"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du hast das Tutorial für die Touch-Geste zum Aufrufen aller Apps abgeschlossen"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Drücke die Aktionstaste auf deiner Tastatur, um alle deine Apps aufzurufen"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation während des Tutorials, zum Pausieren und Fortsetzen der Wiedergabe klicken."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastaturbeleuchtung"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d von %2$d"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 21822202c11d..dab393cffe56 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ειδοποίηση σε εξέλιξη για μια περίοδο λειτουργίας εγγραφής οθόνης"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Να γίνει εγγραφή της οθόνης σας;"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Εγγραφή μίας εφαρμογής"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Εγγραφή ολόκληρης της οθόνης"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Εγγραφή ολόκληρης της οθόνης: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Όταν κάνετε εγγραφή ολόκληρης της οθόνη σας, καταγράφεται οτιδήποτε εμφανίζεται σε αυτήν. Επομένως, να είστε προσεκτικοί με τους κωδικούς πρόσβασης, τα στοιχεία πληρωμής, τα μηνύματα, τις φωτογραφίες, τον ήχο και το βίντεο."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Όταν κάνετε εγγραφή μιας εφαρμογής, καταγράφεται οτιδήποτε εμφανίζεται ή αναπαράγεται στη συγκεκριμένη εφαρμογή. Επομένως, να είστε προσεκτικοί με τους κωδικούς πρόσβασης, τα στοιχεία πληρωμής, τα μηνύματα, τις φωτογραφίες, τον ήχο και το βίντεο."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Εγγραφή οθόνης"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Δεν ήταν δυνατή η ενημέρωση της προεπιλογής"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Προεπιλογή"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Έχει επιλεγεί"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Εργαλεία"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Ζωντανοί υπότιτλοι"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Σημείωση"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Εμφάνιση εικονιδίων ειδοποιήσεων χαμηλής προτεραιότητας"</string> <string name="other" msgid="429768510980739978">"Άλλο"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"κατάργηση πλακιδίου"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"προσθήκη πλακιδίου στο τέλος"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Μετακίνηση πλακιδίου"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Προσθήκη πλακιδίου"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Μετακίνηση στη θέση <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Προσθήκη στη θέση <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Μη έγκυρη θέση."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"επιλογή χρήστη"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Δεν υπάρχει σύνδεση στο διαδίκτυο"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Άνοιγμα ρυθμίσεων <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Επεξεργασία σειράς ρυθμίσεων."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Μενού λειτουργίας"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Σελίδα <xliff:g id="ID_1">%1$d</xliff:g> από <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Οθόνη κλειδώματος"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(αποσυνδέθηκε)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Δεν είναι δυνατή η εναλλαγή. Πατήστε για επανάληψη."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Σύνδεση συσκευής"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Για μετάδοση της περιόδου σύνδεσης, ανοίξτε την εφαρμογή."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Άγνωστη εφαρμογή"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Διακοπή μετάδοσης"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Διαθέσιμες συσκευές για έξοδο ήχου."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Αρχική"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Προβολή πρόσφατων εφαρμογών"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Τέλος"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Δοκιμάστε ξανά!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Επιστροφή"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Σύρετε προς τα αριστερά ή τα δεξιά με τρία δάχτυλα στην επιφάνεια αφής"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Ωραία!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ολοκληρώσατε την κίνηση επιστροφής."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Για επιστροφή με χρήση της επιφάνειας αφής, σύρετε προς τα αριστερά ή προς τα δεξιά με τρία δάχτυλα"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Αρχική"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Σύρετε προς τα επάνω με τρία δάχτυλα στην επιφάνεια αφής"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Μπράβο!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Ολοκληρώσατε την κίνηση μετάβασης στην αρχική οθόνη"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Για μετάβαση στην αρχική οθόνη, σύρετε προς τα επάνω με τρία δάχτυλα στην επιφάνεια αφής"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Προβολή πρόσφατων εφαρμογών"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Σύρετε προς τα επάνω με τρία δάχτυλα στην επιφάνεια αφής και μην τα σηκώσετε"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Μπράβο!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ολοκληρώσατε την κίνηση για την προβολή πρόσφατων εφαρμογών."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Για προβολή πρόσφατων εφαρμογών, σύρετε προς τα επάνω με τρία δάχτυλα και κρατήστε τα δάχτυλά σας στην επιφάνεια αφής"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Ολοκληρώσατε την κίνηση για την προβολή όλων των εφαρμογών"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Πατήστε το πλήκτρο ενέργειας στο πληκτρολόγιο, για να δείτε όλες τις εφαρμογές σας"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Κινούμενη εικόνα οδηγού, κάντε κλικ για παύση και συνέχιση της αναπαραγωγής."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Οπίσθιος φωτισμός πληκτρολογίου"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Επίπεδο %1$d από %2$d"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 779e3f684898..efab948b12bb 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Record your screen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Record one app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Record entire screen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Record entire screen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"When you\'re recording your entire screen, anything displayed on your screen is recorded. So be careful with things like passwords, payment details, messages, photos, audio and video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"When you\'re recording an app, anything displayed or played in that app is recorded. So be careful with things like passwords, payment details, messages, photos, audio and video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Record screen"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Couldn\'t update preset"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Preset"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selected"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Tools"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Live Caption"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Note"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Show low-priority notification icons"</string> <string name="other" msgid="429768510980739978">"Other"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"remove tile"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"add tile to end"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"add tile to the last position"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Move tile"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Add tile"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Add tile to desired position"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Move to <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Add to position <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Position invalid."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"No Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Edit order of Quick Settings."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(disconnected)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Can\'t switch. Tap to try again."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Connect a device"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"To cast this session, please open the app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> @@ -1468,32 +1483,27 @@ <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_done_button" msgid="176168488821755503">"Done"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Try again."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Swipe left or right using three fingers on your touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Nice!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"You completed the go back gesture."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"To go back using your touchpad, swipe left or right using three fingers"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Go home"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Swipe up with three fingers on your touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Well done!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"You completed the go home gesture"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Swipe up with three fingers on your touchpad to go to your home screen"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Swipe up and hold using three fingers on your touchpad"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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="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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"You completed the view all apps gesture"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Press the action key on your keyboard to view all of your apps"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial animation, click to pause and resume play."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 22916c337b97..8486688cbf8d 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -111,8 +111,8 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Record your screen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Record one app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Record entire screen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Record entire screen: %s"</string> + <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="4882406311415082016">"Record this screen"</string> + <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="4169494703993148253">"Record %s"</string> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"When you’re recording your entire screen, anything shown on your screen is recorded. So be careful with things like passwords, payment details, messages, photos, and audio and video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"When you’re recording an app, anything shown or played in that app is recorded. So be careful with things like passwords, payment details, messages, photos, and audio and video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Record screen"</string> @@ -415,6 +415,13 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Couldn\'t update preset"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Preset"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selected"</string> + <string name="hearing_devices_ambient_label" msgid="629440938614895797">"Surroundings"</string> + <string name="hearing_devices_ambient_control_left" msgid="3586965448230412600">"Left"</string> + <string name="hearing_devices_ambient_control_right" msgid="6192137602448918383">"Right"</string> + <string name="hearing_devices_ambient_expand_controls" msgid="2131816068187709200">"Expand to left and right separated controls"</string> + <string name="hearing_devices_ambient_collapse_controls" msgid="2261097656446201581">"Collapse to unified control"</string> + <string name="hearing_devices_ambient_mute" msgid="1836882837647429416">"Mute surroundings"</string> + <string name="hearing_devices_ambient_unmute" msgid="2187938085943876814">"Unmute surroundings"</string> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Tools"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Live Caption"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Note"</string> @@ -960,9 +967,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Show low-priority notification icons"</string> <string name="other" msgid="429768510980739978">"Other"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"remove tile"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"add tile to end"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"add tile to the last position"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Move tile"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Add tile"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Add tile to desired position"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Move to <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Add to position <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Position invalid."</string> @@ -978,7 +985,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"No internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Edit order of Quick Settings."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> @@ -1209,7 +1216,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(disconnected)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Can\'t switch. Tap to try again."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Connect a device"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"To cast this session, please open the app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 779e3f684898..efab948b12bb 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Record your screen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Record one app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Record entire screen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Record entire screen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"When you\'re recording your entire screen, anything displayed on your screen is recorded. So be careful with things like passwords, payment details, messages, photos, audio and video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"When you\'re recording an app, anything displayed or played in that app is recorded. So be careful with things like passwords, payment details, messages, photos, audio and video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Record screen"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Couldn\'t update preset"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Preset"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selected"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Tools"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Live Caption"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Note"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Show low-priority notification icons"</string> <string name="other" msgid="429768510980739978">"Other"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"remove tile"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"add tile to end"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"add tile to the last position"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Move tile"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Add tile"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Add tile to desired position"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Move to <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Add to position <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Position invalid."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"No Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Edit order of Quick Settings."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(disconnected)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Can\'t switch. Tap to try again."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Connect a device"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"To cast this session, please open the app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> @@ -1468,32 +1483,27 @@ <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_done_button" msgid="176168488821755503">"Done"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Try again."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Swipe left or right using three fingers on your touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Nice!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"You completed the go back gesture."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"To go back using your touchpad, swipe left or right using three fingers"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Go home"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Swipe up with three fingers on your touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Well done!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"You completed the go home gesture"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Swipe up with three fingers on your touchpad to go to your home screen"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Swipe up and hold using three fingers on your touchpad"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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="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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"You completed the view all apps gesture"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Press the action key on your keyboard to view all of your apps"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial animation, click to pause and resume play."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 779e3f684898..efab948b12bb 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Record your screen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Record one app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Record entire screen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Record entire screen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"When you\'re recording your entire screen, anything displayed on your screen is recorded. So be careful with things like passwords, payment details, messages, photos, audio and video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"When you\'re recording an app, anything displayed or played in that app is recorded. So be careful with things like passwords, payment details, messages, photos, audio and video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Record screen"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Couldn\'t update preset"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Preset"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selected"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Tools"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Live Caption"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Note"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Show low-priority notification icons"</string> <string name="other" msgid="429768510980739978">"Other"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"remove tile"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"add tile to end"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"add tile to the last position"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Move tile"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Add tile"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Add tile to desired position"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Move to <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Add to position <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Position invalid."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"No Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Edit order of Quick Settings."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(disconnected)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Can\'t switch. Tap to try again."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Connect a device"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"To cast this session, please open the app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> @@ -1468,32 +1483,27 @@ <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_done_button" msgid="176168488821755503">"Done"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Try again."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Go back"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Swipe left or right using three fingers on your touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Nice!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"You completed the go back gesture."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"To go back using your touchpad, swipe left or right using three fingers"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Go home"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Swipe up with three fingers on your touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Well done!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"You completed the go home gesture"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Swipe up with three fingers on your touchpad to go to your home screen"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"View recent apps"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Swipe up and hold using three fingers on your touchpad"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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="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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"You completed the view all apps gesture"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Press the action key on your keyboard to view all of your apps"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial animation, click to pause and resume play."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Keyboard backlight"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Level %1$d of %2$d"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 1f3aee8f6496..e9786e309aa9 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación constante para una sesión de grabación de pantalla"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"¿Quieres grabar la pantalla?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Grabar una app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Grabar toda la pantalla"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Grabar toda la pantalla: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Cuando grabes toda la pantalla, se grabará todo lo que se muestre en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Cuando grabes una app, se grabará todo lo que se muestre o reproduzca en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Grabar pantalla"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"No se pudo actualizar el ajuste predeterminado"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Ajuste predeterminado"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Seleccionado"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Herramientas"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Subtitulado instantáneo"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Nota"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Mostrar íconos de notificaciones con prioridad baja"</string> <string name="other" msgid="429768510980739978">"Otros"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"quitar tarjeta"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"agregar tarjeta al final"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mover la tarjeta"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Agregar tarjeta"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Mover a <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Agregar a la posición <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posición no válida"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"elegir usuario"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Sin Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir configuración de <xliff:g id="ID_1">%s</xliff:g>"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar orden de configuración"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de encendido"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantalla de bloqueo"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(desconectado)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"No se pudo conectar. Presiona para volver a intentarlo."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Conectar un dispositivo"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Para transmitir esta sesión, abre la app"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconocida"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Detener transmisión"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponibles para salida de audio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Listo"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Vuelve a intentarlo"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atrás"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Desliza hacia la izquierda o la derecha con tres dedos en el panel táctil"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"¡Muy bien!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Completaste el gesto para ir atrás."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Para volver con el panel táctil, desliza tres dedos hacia la izquierda o la derecha"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir a la página principal"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Desliza hacia arriba con tres dedos en el panel táctil"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"¡Bien hecho!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Completaste el gesto para ir a la página principal"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Desliza tres dedos hacia arriba en el panel táctil para ir a la pantalla principal"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver apps recientes"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Desliza hacia arriba con tres dedos en el panel táctil y mantenlos presionados"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Completaste el gesto para ver todas las apps"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Presiona la tecla de acción en el teclado para ver todas las apps"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animación del instructivo. Haz clic para pausar y reanudar la reproducción."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación del teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 8ae684a0c859..946087472777 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación continua de una sesión de grabación de la pantalla"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"¿Grabar la pantalla?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Grabar una aplicación"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Grabar toda la pantalla"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Grabar toda la pantalla: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Cuando grabas toda la pantalla, se graba todo lo que se muestre en ella. Debes tener cuidado con elementos como contraseñas, detalles de pagos, mensajes, fotos, audio y vídeo."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Cuando grabas una aplicación, se graba todo lo que se muestre o reproduzca en ella. Debes tener cuidado con elementos como contraseñas, detalles de pagos, mensajes, fotos, audio y vídeo."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Grabar pantalla"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"No se ha podido actualizar el preajuste"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Preajuste"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Seleccionado"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Herramientas"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Subtítulos automáticos"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Nota"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Mostrar iconos de notificaciones con prioridad baja"</string> <string name="other" msgid="429768510980739978">"Otros"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"quitar recuadro"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"añadir recuadro al final"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mover recuadro"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Añadir recuadro"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Mover a <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Añadir a la posición <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posición no válida."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"elegir un usuario"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Sin Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir ajustes de <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Cambiar el orden de los ajustes."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de encendido"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantalla de bloqueo"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(desconectado)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"No se puede cambiar. Toca para volver a intentarlo."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Conectar un dispositivo"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Para enviar esta sesión, abre la aplicación."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplicación desconocida"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Dejar de enviar contenido"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponibles para la salida de audio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hecho"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Vuelve a intentarlo."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atrás"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Desliza hacia la izquierda o la derecha con tres dedos en el panel táctil"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"¡Genial!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Has completado el gesto para volver."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Para volver atrás usando el panel táctil, desliza tres dedos hacia la izquierda o la derecha"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir a Inicio"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Desliza hacia arriba con tres dedos en el panel táctil"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"¡Bien hecho!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Has completado el gesto para ir a la pantalla de inicio"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Desliza tres dedos hacia arriba en el panel táctil para ir a la pantalla de inicio"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver aplicaciones recientes"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Desliza hacia arriba con tres dedos y mantén pulsado en el panel táctil"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Has completado el gesto para ver todas las aplicaciones"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Pulsa la tecla de acción de tu teclado para ver todas tus aplicaciones"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animación del tutorial, haz clic para pausar y reanudar la reproducción."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación del teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index e3e72635ca5c..3999042fdd2d 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pooleli märguanne ekraanikuva salvestamise seansi puhul"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Kas salvestada ekraanikuvast video?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Ühe rakenduse salvestamine"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Kogu ekraanikuva salvestamine"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Kogu ekraanikuva salvestamine: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kui salvestate kogu ekraani, salvestatakse kõik ekraanil kuvatud andmed. Seega olge ettevaatlik selliste andmetega nagu paroolid, makseteave, sõnumid, fotod ning heli ja video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kui salvestate rakendust, salvestatakse kõik, mida selles rakenduses näidatakse või esitatakse. Seega olge ettevaatlik selliste andmetega nagu paroolid, makseteave, sõnumid, fotod ning heli ja video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Salvesta ekraanikuva"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Eelseadistust ei saanud värskendada"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Eelseadistus"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Valitud"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Tööriistad"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Reaalajas subtiitrid"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Märkus"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Kuva madala prioriteediga märguande ikoonid"</string> <string name="other" msgid="429768510980739978">"Muu"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"paani eemaldamiseks"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"paani lõppu lisamiseks"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Teisalda paan"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Lisa paan"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Teisaldamine asendisse <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Lisamine asendisse <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Sobimatu asukoht."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"valige kasutaja"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Interneti-ühendus puudub"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Ava teenuse <xliff:g id="ID_1">%s</xliff:g> seaded."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Muuda seadete järjestust."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Toitemenüü"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Leht <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lukustuskuva"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ühendus on katkestatud)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Ei saa lülitada. Puudutage uuesti proovimiseks."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Seadme ühendamine"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Selle seansi ülekandmiseks avage rakendus."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Tundmatu rakendus"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Lõpeta ülekanne"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Saadaolevad seadmed heli esitamiseks."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Valmis"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Proovige uuesti!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Tagasi"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Pühkige puuteplaadil kolme sõrmega vasakule või paremale"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Tubli töö!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Tegite tagasiliikumise liigutuse."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Puuteplaadi abil tagasi liikumiseks pühkige kolme sõrmega vasakule või paremale"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Avakuvale"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Pühkige puuteplaadil kolme sõrmega üles"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Väga hea!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Tegite avakuvale minemise liigutuse"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Avakuvale liikumiseks pühkige puuteplaadil kolme sõrmega üles"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Hiljutiste rakenduste vaatamine"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Pühkige üles ja hoidke kolme sõrme puuteplaadil"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Tegite kõigi rakenduste vaatamise liigutuse"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Kõigi oma rakenduste kuvamiseks vajutage klaviatuuril toiminguklahvi"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Õpetlik animatsioon, klõpsake esitamise peatamiseks ja jätkamiseks."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatuuri taustavalgustus"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tase %1$d/%2$d"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index e284597d9f90..88a46c19bb83 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pantailaren grabaketa-saioaren jakinarazpen jarraitua"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Pantaila grabatu nahi duzu?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Grabatu aplikazio bat"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Grabatu pantaila osoa"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Grabatu pantaila osoa: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Pantaila osoa grabatzen ari zarenean, pantailan agertzen den guztia grabatzen da. Beraz, kontuz ibili pasahitzekin, ordainketen xehetasunekin, mezuekin, argazkiekin, audioekin eta bideoekin, besteak beste."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Aplikazio bat grabatzen ari zarenean, aplikazio horretan agertzen den edo bertan erreproduzitzen ari den guztia grabatzen da. Beraz, kontuz ibili pasahitzekin, ordainketen xehetasunekin, mezuekin, argazkiekin, audioekin eta bideoekin, besteak beste."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Grabatu pantaila"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Ezin izan da eguneratu aurrezarpena"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Aurrezarpena"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Hautatuta"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Tresnak"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Istanteko azpitituluak"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Oharra"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Erakutsi lehentasun txikiko jakinarazpenen ikonoak"</string> <string name="other" msgid="429768510980739978">"Beste bat"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"kendu lauza"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"gehitu lauza amaieran"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mugitu lauza"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Gehitu lauza"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Eraman <xliff:g id="POSITION">%1$d</xliff:g>garren lekura"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Gehitu <xliff:g id="POSITION">%1$d</xliff:g>garren lekuan"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Kokapenak ez du balio."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"erabiltzailea aukeratzeko"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Ez dago Interneteko konexiorik"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Ireki <xliff:g id="ID_1">%s</xliff:g> ezarpenak."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editatu ezarpenen ordena."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Itzaltzeko menua"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g> orria"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantaila blokeatua"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(deskonektatuta)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Ezin da aldatu. Berriro saiatzeko, sakatu hau."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Konektatu gailu bat"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Saioa ireki nahi baduzu, ireki aplikazioa."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplikazio ezezaguna"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Gelditu igorpena"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio-irteerarako gailu erabilgarriak."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Eginda"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Saiatu berriro!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Egin atzera"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Pasatu 3 hatz ezkerrera edo eskuinera ukipen-panelean"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Ederki!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ikasi duzu atzera egiteko keinua."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Ukipen-panelaren bidez atzera egiteko, pasatu 3 hatz ezkerrera edo eskuinera"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Joan orri nagusira"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Pasatu 3 hatz gora ukipen-panelean"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bikain!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Ikasi duzu orri nagusira joateko keinua"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Orri nagusira joateko, pasatu 3 hatz gora ukipen-panelean"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ikusi azkenaldiko aplikazioak"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Pasatu 3 hatz gora eta eduki sakatuta ukipen-panelean"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Azkenaldiko aplikazioak ikusteko, pasatu 3 hatz gora eta eduki sakatuta ukipen-panelean"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Osatu duzu aplikazio guztiak ikusteko keinua"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Sakatu teklatuko ekintza-tekla aplikazio guztiak ikusteko"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorialeko animazioa. Sakatu pausatzeko eta erreproduzitzeari berrekiteko."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Teklatuaren hondoko argia"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d/%2$d maila"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 0abbd26714ed..5e851dc5db52 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"اعلان درحال انجام برای جلسه ضبط صفحهنمایش"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"صفحهنمایش ضبط شود؟"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ضبط یک برنامه"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"ضبط کل صفحهنمایش"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ضبط کردن کل صفحهنمایش: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"وقتی کل صفحهنمایش را ضبط میکنید، هر چیزی که در صفحهنمایش نشان داده شود ضبط خواهد شد. درنتیجه مراقب چیزهایی مثل گذرواژهها، جزئیات پرداخت، پیامها، عکسها، و صدا و تصویر باشید."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"وقتی برنامهای را ضبط میکنید، هر چیزی که در آن برنامه نشان داده شود یا پخش شود ضبط خواهد شد. درنتیجه مراقب چیزهایی مثل گذرواژهها، جزئیات پرداخت، پیامها، عکسها، و صدا و تصویر باشید."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ضبط صفحهنمایش"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"پیشتنظیم بهروزرسانی نشد"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"پیشتنظیم"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"انتخابشده"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ابزارها"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"زیرنویس زنده ناشنوایان"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"یادداشت"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"نمایش نمادهای اعلان کماهمیت"</string> <string name="other" msgid="429768510980739978">"موارد دیگر"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"برداشتن کاشی"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"افزودن کاشی به انتها"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"انتقال کاشی"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"افزودن کاشی"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"انتقال به <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"افزودن به موقعیت <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"موقعیت نامعتبر است."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"انتخاب کاربر"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"عدم اتصال به اینترنت"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"باز کردن تنظیمات <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ویرایش ترتیب تنظیمات."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"منوی روشن/خاموش"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"صفحه <xliff:g id="ID_1">%1$d</xliff:g> از <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"صفحه قفل"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(اتصال قطع شد)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"عوض نمیشود. برای تلاش مجدد تکضرب بزنید."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"متصل کردن دستگاه"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"برای ارسال محتوای این جلسه، لطفاً برنامه را باز کنید."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"برنامه ناشناس"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"توقف پخش محتوا"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"دستگاههای دردسترس برای خروجی صوتی."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"رفتن به صفحه اصلی"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"مشاهده برنامههای اخیر"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"تمام"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"دوباره امتحان کنید!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"برگشتن"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"با سه انگشت روی صفحه لمسی تند به چپ یا راست بکشید."</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"چه خوب!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"اشاره برگشت را تکمیل کردید."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"برای برگشتن بااستفاده از صفحه لمسی، با سه انگشت تند بهچپ یا راست بکشید"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"رفتن به صفحه اصلی"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"با سه انگشت روی صفحه لمسی تند به بالا بکشید"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"عالی است!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"اشاره رفتن به صفحه اصلی را تکمیل کردید"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"برای رفتن به صفحه اصلی، با سه انگشت تند بهبالا بکشید"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"مشاهده برنامههای اخیر"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"با سه انگشت روی صفحه لمسی تند به بالا بکشید و نگه دارید"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"عالی است!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"اشاره «مشاهده برنامههای اخیر» را تمام کردید"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"برای مشاهده برنامههای اخیر، با سه انگشت روی صفحه لمسی تند بهبالا بکشید و نگه دارید"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"اشاره «مشاهده همه برنامهها» را تمام کردید"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"برای مشاهده همه برنامهها، دکمه کنش را روی صفحهکلید فشار دهید"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"پویانمایی آموزش گامبهگام، برای توقف موقت و ازسرگیری پخش کلیک کنید."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"نور پسزمینه صفحهکلید"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"سطح %1$d از %2$d"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 03d1441444be..b257a89f6e26 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pysyvä ilmoitus näytön tallentamisesta"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Tallennetaanko näytön toimintaa?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Tallenna yhdestä sovelluksesta"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Tallenna koko näyttö"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Tallenna koko näyttö: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kun tallennat koko näyttöä, kaikki näytöllä näkyvä sisältö tallennetaan. Ole siis varovainen, kun lisäät salasanoja, maksutietoja, viestejä, kuvia, audiota tai videoita."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kun tallennat sovellusta, kaikki sovelluksessa näkyvä tai toistettu sisältö tallennetaan. Ole siis varovainen, kun lisäät salasanoja, maksutietoja, viestejä, kuvia, audiota tai videoita."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Tallenna näyttö"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Esiasetusta ei voitu muuttaa"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Esiasetus"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Valittu"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Työkalut"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Livetekstitys"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Muistiinpano"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Näytä vähemmän tärkeät ilmoituskuvakkeet"</string> <string name="other" msgid="429768510980739978">"Muu"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"poista kiekko"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"lisää kiekko loppuun"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Siirrä kiekkoa"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Lisää kiekko"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Siirrä paikkaan <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Lisää paikkaan <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Virheellinen sijainti."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"valitse käyttäjä"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Ei internetyhteyttä"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Avaa kohteen <xliff:g id="ID_1">%s</xliff:g> asetukset."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Muokkaa asetusten järjestystä."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Virtavalikko"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Sivu <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lukitusnäyttö"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(yhteys katkaistu)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Vaihtaminen ei onnistunut. Yritä uudelleen."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Yhdistä laite"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Jos haluat striimata tämän käyttökerran, avaa sovellus."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Tuntematon sovellus"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Lopeta striimaus"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Käytettävissä olevat audiolaitteet"</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Valmis"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Yritä uudelleen."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Takaisin"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Pyyhkäise kosketuslevyllä vasemmalle tai oikealle kolmella sormella"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Hienoa!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Olet oppinut Takaisin-eleen."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Jos haluat palata takaisin kosketuslevyn avulla, pyyhkäise vasemmalle tai oikealle kolmella sormella"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Siirry etusivulle"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Pyyhkäise ylös kolmella sormella kosketuslevyllä"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Hienoa!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Olet oppinut eleen, jolla pääset takaisin aloitusnäytölle"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Siirry aloitusnäytölle pyyhkäisemällä kosketuslevyll\' ylös kolmella sormella"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Katso viimeisimmät sovellukset"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Pyyhkäise ylös ja pidä kosketuslevyä painettuna kolmella sormella"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Olet oppinut Näytä kaikki sovellukset ‑eleen."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Katso kaikki sovellukset painamalla näppäimistön toimintonäppäintä"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Ohjeanimaatio, klikkaa keskeyttääksesi ja jatkaaksesi."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Näppämistön taustavalo"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Taso %1$d/%2$d"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index f55fb0011423..8481f0fbb790 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement d\'écran"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Enregistrer votre écran?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Enregistrer une appli"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Enregistrer l\'écran entier"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Enregistrer tout l\'écran : %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Lorsque vous enregistrez l\'intégralité de votre écran, tout ce qui s\'affiche sur votre écran est enregistré. Par conséquent, soyez prudent avec les mots de passe, les détails du mode de paiement, les messages, les photos et les contenus audio et vidéo."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Lorsque vous enregistrez une appli, tout ce qui est affiché ou lu dans cette appli est enregistré. Par conséquent, soyez prudent avec les mots de passe, les détails du mode de paiement, les messages, les photos et les contenus audio et vidéo."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Enregistrer l\'écran"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Impossible de mettre à jour le préréglage"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Préréglage"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Sélectionné"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Outils"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Sous-titres instantanés"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Note"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Afficher les icônes de notification de faible priorité"</string> <string name="other" msgid="429768510980739978">"Autre"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"retirer la tuile"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ajouter la tuile à la fin"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Déplacer la tuile"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Ajouter la tuile"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Déplacer vers <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Ajouter à la position <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Position incorrecte."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choisir un utilisateur"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Aucune connexion Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Ouvrir les paramètres <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Modifier l\'ordre des paramètres."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu de l\'interrupteur"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Écran de verrouillage"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(déconnecté)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Changement impossible. Touchez pour réessayer."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Connecter un appareil"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Pour diffuser cette session, veuillez ouvrir l\'appli."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Appli inconnue"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Arrêter la diffusion"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Appareils disponibles pour la sortie audio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"OK"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Réessayez!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Retour"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Balayez votre pavé tactile vers la gauche ou vers la droite avec trois doigts"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bien!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Vous avez appris le geste de retour en arrière."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Pour revenir en arrière à l\'aide de votre pavé tactile, balayez vers la gauche ou vers la droite avec trois doigts"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Retour à la page d\'accueil"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Balayez votre pavé tactile vers le haut avec trois doigts"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bon travail!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Vous avez appris le geste pour revenir à l\'écran d\'accueil"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Pour accéder à votre écran d\'accueil, balayez votre pavé tactile vers le haut avec trois doigts"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Afficher les applis récentes"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Balayez votre pavé tactile vers le haut avec trois doigts, puis maintenez-les en place"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Vous avez appris le geste pour afficher toutes les applis"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Appuyez sur la touche d\'action de votre clavier pour afficher toutes vos applis"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation du tutoriel; cliquer ici pour mettre en pause et reprendre la lecture."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Rétroéclairage du clavier"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d de %2$d"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml index 782c05528fc0..ffacde22416a 100644 --- a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml @@ -73,7 +73,7 @@ </string-array> <string-array name="tile_states_airplane"> <item msgid="1985366811411407764">"Non disponible"</item> - <item msgid="4801037224991420996">"Désactivée"</item> + <item msgid="4801037224991420996">"Désactivé"</item> <item msgid="1982293347302546665">"Activé"</item> </string-array> <string-array name="tile_states_location"> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 138cfc92dbcd..80f9cd9adffe 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement de l\'écran"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Enregistrer l\'écran ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Enregistrer une appli"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Enregistrer tout l\'écran"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Enregistrer tout l\'écran : %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Lorsque vous enregistrez l\'intégralité de votre écran, tout ce qui s\'y affiche est enregistré. Faites donc attention aux éléments tels que les mots de passe, les détails de mode de paiement, les messages, les photos, et les contenus audio et vidéo."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Lorsque vous enregistrez une appli, tout ce qui est affiché ou lu dans celle-ci est enregistré. Faites donc attention aux éléments tels que les mots de passe, détails de mode de paiement, messages, photos et contenus audio et vidéo."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Enregistrer l\'écran"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Impossible de mettre à jour les préréglages"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Préréglage"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Sélectionné"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Outils"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Sous-titres instantanés"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Note"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Afficher les icônes de notification à faible priorité"</string> <string name="other" msgid="429768510980739978">"Autre"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"supprimer le bloc"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ajouter le bloc à la fin"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"ajouter le bloc à la dernière position"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Déplacer le bloc"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Ajouter un bloc"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Ajouter le bloc à la position souhaitée"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Déplacer vers <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Ajouter à la position <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Emplacement non valide."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choisir un utilisateur"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Aucun accès à Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Ouvrir les paramètres <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Modifier l\'ordre des paramètres."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Modifier l\'ordre des Réglages rapides."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu Marche/Arrêt"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Écran de verrouillage"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(déconnecté)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Impossible de changer. Appuyez pour réessayer."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Connecter un appareil"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Pour caster cette session, veuillez ouvrir l\'appli."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Appli inconnue"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Arrêter la diffusion"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Appareils disponibles pour la sortie audio."</string> @@ -1468,32 +1483,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"OK"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Essayez encore."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Retour"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Balayez vers la gauche ou la droite avec trois doigts sur le pavé tactile"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bravo !"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Vous avez appris le geste pour revenir en arrière"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Pour revenir en arrière à l\'aide du pavé tactile, balayez vers la gauche ou la droite avec trois doigts"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Retour à l\'accueil"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Balayez vers le haut avec trois doigts sur le pavé tactile"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bravo !"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Vous avez appris le geste pour revenir à l\'écran d\'accueil"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Balayez vers le haut avec trois doigts sur le pavé tactile pour accéder à l\'écran d\'accueil"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Afficher les applis récentes"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Avec trois doigts, balayez le pavé tactile vers le haut et maintenez la position"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Vous avez appris le geste pour afficher toutes les applis"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Appuyez sur la touche d\'action de votre clavier pour afficher toutes vos applis"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation du tutoriel, cliquez pour mettre en pause et reprendre la lecture."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Rétroéclairage du clavier"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d sur %2$d"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index d04d04325ddf..4837954b1161 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación de actividade en curso sobre unha sesión de gravación de pantalla"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Queres gravar a túa pantalla?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Gravar unha aplicación"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Gravar pantalla completa"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Gravar pantalla completa: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Cando gravas a pantalla completa, recóllese todo o que se mostra nela. Recomendámosche que teñas coidado con determinada información, como os contrasinais, os detalles de pago, as mensaxes e as fotos, así como co contido de audio e de vídeo."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Cando gravas unha aplicación, recóllese todo o que se mostra ou reproduce nela. Recomendámosche que teñas coidado con determinada información, como os contrasinais, os detalles de pago, as mensaxes e as fotos, así como co contido de audio e de vídeo."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Gravar pantalla"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Non se puido actualizar a configuración predeterminada"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Configuración predeterminada"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Elemento seleccionado"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Ferramentas"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Subtítulos instantáneos"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Nota"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Mostrar iconas das notificacións que teñan baixa prioridade"</string> <string name="other" msgid="429768510980739978">"Outros"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"quitar tarxeta"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"engadir tarxeta ao final"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mover tarxeta"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Engadir tarxeta"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Mover a <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Engadir á posición <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posición non válida."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"escoller usuario"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Non hai conexión a Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir configuración de <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar a orde das opcións de configuración."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de acendido"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Páxina <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantalla de bloqueo"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(desconectado)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Non se puido realizar o cambio. Toca para tentalo de novo."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Conectar un dispositivo"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Para emitir esta sesión, abre a aplicación."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplicación descoñecida"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Deter emisión"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos dispoñibles para a saída de audio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Feito"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Téntao de novo."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Volver"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Pasa tres dedos cara á esquerda ou cara á dereita no panel táctil"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Excelente!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Completaches o titorial do xesto de retroceso."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Para retroceder usando o panel táctil, pasa tres dedos cara á esquerda ou cara á dereita"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir ao inicio"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Pasa tres dedos cara arriba no panel táctil"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Ben feito!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Completaches o titorial do xesto para ir á pantalla de inicio"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Pasa tres dedos cara arriba no panel táctil para ir á pantalla de inicio"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Consultar aplicacións recentes"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Pasa tres dedos cara arriba e mantenos premidos no panel táctil"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Completaches o titorial do xesto de ver todas as aplicacións"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Preme a tecla de acción do teclado para ver todas as aplicacións"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animación do titorial, fai clic para poñelo en pausa ou retomar a reprodución."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroiluminación do teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivel %1$d de %2$d"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 327753dadbc1..ceefccc26312 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"સ્ક્રીન રેકોર્ડિંગ સત્ર માટે ચાલુ નોટિફિકેશન"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"તમારી સ્ક્રીન રેકોર્ડ કરીએ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"એક ઍપ રેકોર્ડ કરો"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"પૂર્ણ સ્ક્રીન રેકોર્ડ કરો"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"પૂરી સ્ક્રીન રેકોર્ડ કરો: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"જ્યારે તમે તમારી પૂર્ણ સ્ક્રીન રેકોર્ડ કરી રહ્યાં હો, ત્યારે તમારી સ્ક્રીન પર બતાવવામાં આવતી હોય તેવી બધી વસ્તુ રેકોર્ડ કરવામાં આવે છે. તેથી પાસવર્ડ, ચુકવણીની વિગતો, મેસેજ, ફોટા અને ડિવાઇસ પર વાગી રહેલા ઑડિયો તથા વીડિયો જેવી બાબતોને લઈને સાવચેત રહો."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"જ્યારે તમે કોઈ ઍપને રેકોર્ડ કરી રહ્યાં હો, ત્યારે એ ઍપમાં બતાવવામાં કે ચલાવવામાં આવતી હોય તેવી બધી વસ્તુ રેકોર્ડ કરવામાં આવે છે. તેથી પાસવર્ડ, ચુકવણીની વિગતો, મેસેજ, ફોટા અને ડિવાઇસ પર વાગી રહેલા ઑડિયો તથા વીડિયો જેવી બાબતોને લઈને સાવચેત રહો."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"સ્ક્રીન રેકોર્ડ કરો"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"પ્રીસેટ અપડેટ કરી શક્યા નથી"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"પ્રીસેટ"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"પસંદ કરી છે"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ટૂલ"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"લાઇવ કૅપ્શન"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"નોંધ"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"ઓછી પ્રાધાન્યતાનું નોટિફિકેશન આઇકન બતાવો"</string> <string name="other" msgid="429768510980739978">"અન્ય"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ટાઇલ કાઢી નાખો"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ટાઇલને અંતે ઉમેરો"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ટાઇલ ખસેડો"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ટાઇલ ઉમેરો"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> પર ખસેડો"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"જગ્યા પર <xliff:g id="POSITION">%1$d</xliff:g> ઉમેરો"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"સ્થિતિ અમાન્ય છે."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"વપરાશકર્તા પસંદ કરો"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"કોઈ ઇન્ટરનેટ નથી"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> સેટિંગ ખોલો."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"સેટિંગના ક્રમમાં ફેરફાર કરો."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"પાવર મેનૂ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> માંથી <xliff:g id="ID_1">%1$d</xliff:g> પૃષ્ઠ"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"લૉક સ્ક્રીન"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ડિસ્કનેક્ટ કરેલું)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"સ્વિચ કરી શકતા નથી. ફરી પ્રયાસ કરવા માટે ટૅપ કરો."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ડિવાઇસ કનેક્ટ કરો"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"આ સત્ર કાસ્ટ કરવા માટે, કૃપા કરીને ઍપ ખોલો."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"અજાણી ઍપ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"કાસ્ટ કરવાનું રોકો"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ઑડિયો આઉટપુટ માટે ઉપલબ્ધ ડિવાઇસ."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"હોમ પર જાઓ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"તાજેતરની ઍપ જુઓ"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"થઈ ગયું"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"ફરી પ્રયાસ કરો!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"પાછા જાઓ"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"તમારા ટચપૅડ પર ત્રણ આંગળીનો ઉપયોગ કરીને ડાબે કે જમણે સ્વાઇપ કરો"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"સરસ!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"તમે પાછા જવાનો સંકેત પૂર્ણ કર્યો છે."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"તમારા ટચપૅડ વડે પાછા જવા માટે, ત્રણ આંગળીનો ઉપયોગ કરીને ડાબે કે જમણે સ્વાઇપ કરો"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"હોમ પર જાઓ"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"તમારા ટચપૅડ પર ત્રણ આંગળી વડે ઉપરની તરફ સ્વાઇપ કરો"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"ખૂબ સરસ કામ!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"તમે હોમ સ્ક્રીન પર જવાનો સંકેત પૂર્ણ કર્યો"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"તમારી હોમ સ્ક્રીન પર જવા માટે, તમારા ટચપૅડ પર ત્રણ આંગળી વડે ઉપરની તરફ સ્વાઇપ કરો"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"તાજેતરની ઍપ જુઓ"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"તમારા ટચપૅડ પર ત્રણ આંગળીઓનો ઉપયોગ કરીને ઉપર સ્વાઇપ કરો અને દબાવી રાખો"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ખૂબ સરસ કામ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"તમે \'તાજેતરની ઍપ જુઓ\' સંકેત પૂર્ણ કર્યો."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"તાજેતરની ઍપ જોવા માટે, તમારા ટચપૅડ પર ત્રણ આંગળી વડે ઉપરની તરફ સ્વાઇપ કરો અને દબાવી રાખો"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"તમે \'બધી ઍપ જુઓ\' સંકેત પૂર્ણ કર્યો"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"તમારી બધી ઍપ જોવા માટે તમારા કીબોર્ડ પરની ઍક્શન કી દબાવો"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ટ્યૂટૉરિઅલ ઍનિમેશન થોભાવવાનું અને ચલાવવાનું ફરી શરૂ કરવા માટે ક્લિક કરો."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"કીબોર્ડની બૅકલાઇટ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dમાંથી %1$d લેવલ"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 1d3280c9193d..91e17df566d8 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रिकॉर्ड सेशन के लिए जारी सूचना"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"क्या आपको स्क्रीन को रिकॉर्ड करना है?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"एक ऐप्लिकेशन रिकॉर्ड करें"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"पूरी स्क्रीन रिकॉर्ड करें"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"पूरी स्क्रीन रिकॉर्ड करें: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"पूरी स्क्रीन रिकॉर्ड करते समय, स्क्रीन पर दिखने वाली हर चीज़ रिकॉर्ड की जाती है. इसलिए पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, डिवाइस पर चल रहे ऑडियो और वीडियो, और फ़ोटो जैसी चीज़ों को लेकर सावधानी बरतें."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"किसी ऐप्लिकेशन को रिकॉर्ड करने के दौरान, उस पर दिख रहा कॉन्टेंट या चल रहा मीडिया भी रिकॉर्ड होता है. इसलिए, रिकॉर्ड करते समय पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, ऑडियो, और वीडियो को लेकर सावधानी बरतें."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"स्क्रीन रिकॉर्ड करें"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"प्रीसेट अपडेट नहीं किया जा सका"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"प्रीसेट"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"चुना गया"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"टूल"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"लाइव कैप्शन"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"नोट"</string> @@ -753,20 +769,13 @@ <string name="accessibility_status_bar_satellite_available" msgid="6514855015496916829">"सैटलाइट कनेक्शन उपलब्ध है"</string> <string name="satellite_connected_carrier_text" msgid="118524195198532589">"सैटलाइट एसओएस"</string> <string name="satellite_emergency_only_carrier_text" msgid="828510231597991206">"आपातकालीन कॉल या एसओएस"</string> - <!-- no translation found for accessibility_phone_string_format (7798841417881811812) --> - <skip /> - <!-- no translation found for accessibility_no_signal (7052827511409250167) --> - <skip /> - <!-- no translation found for accessibility_one_bar (5342012847647834506) --> - <skip /> - <!-- no translation found for accessibility_two_bars (122628483354508429) --> - <skip /> - <!-- no translation found for accessibility_three_bars (5143286602926069024) --> - <skip /> - <!-- no translation found for accessibility_four_bars (8838495563822541844) --> - <skip /> - <!-- no translation found for accessibility_signal_full (1519655809806462972) --> - <skip /> + <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> + <string name="accessibility_two_bars" msgid="122628483354508429">"दो सिग्नल बार"</string> + <string name="accessibility_three_bars" msgid="5143286602926069024">"तीन सिग्नल बार"</string> + <string name="accessibility_four_bars" msgid="8838495563822541844">"चार सिग्नल बार"</string> + <string name="accessibility_signal_full" msgid="1519655809806462972">"सिग्नल पूरे हैं"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"वर्क प्रोफ़ाइल"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"कुछ के लिए मज़ेदार लेकिन सबके लिए नहीं"</string> <string name="tuner_warning" msgid="1861736288458481650">"सिस्टम यूज़र इंटरफ़ेस (यूआई) ट्यूनर, आपको Android यूज़र इंटरफ़ेस में सुधार लाने और उसे अपनी पसंद के हिसाब से बदलने के कुछ और तरीके देता है. प्रयोग के तौर पर इस्तेमाल हो रहीं ये सुविधाएं आगे चल कर रिलीज़ की जा सकती हैं, रोकी जा सकती हैं या दिखाई देना बंद हो सकती हैं. सावधानी से आगे बढ़ें."</string> @@ -967,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"कम प्राथमिकता वाली सूचना के आइकॉन दिखाएं"</string> <string name="other" msgid="429768510980739978">"अन्य"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"टाइल हटाएं"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"टाइल को आखिरी पोज़िशन पर जोड़ें"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"टाइल को किसी और पोज़िशन पर ले जाएं"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"टाइल जोड़ें"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"टाइल को <xliff:g id="POSITION">%1$d</xliff:g> पोज़िशन पर ले जाएं"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"टाइल को <xliff:g id="POSITION">%1$d</xliff:g> पोज़िशन पर जोड़ें"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"मौजूदा जगह अमान्य है."</string> @@ -985,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"उपयोगकर्ता चुनें"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"इंटरनेट कनेक्शन नहीं है"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> सेटिंग खोलें."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"सेटिंग के क्रम को बदलें"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पावर मेन्यू"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"पेज <xliff:g id="ID_2">%2$d</xliff:g> में से <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"लॉक स्क्रीन"</string> @@ -1216,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(डिसकनेक्ट हो गया)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"स्विच नहीं किया जा सकता. फिर से कोशिश करने के लिए टैप करें."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"कोई डिवाइस कनेक्ट करें"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"इस सेशन को कास्ट करने के लिए, कृपया ऐप्लिकेशन खोलें."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"अनजान ऐप्लिकेशन"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"कास्ट करना बंद करें"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ऑडियो आउटपुट के लिए उपलब्ध डिवाइस."</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 6fc209fb8ad8..0696dbfb003a 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Tekuća obavijest za sesiju snimanja zaslona"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Želite li snimati zaslon?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Snimanje jedne aplikacije"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Snimanje cijelog zaslona"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Snimanje cijelog zaslona: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kad snimate cijeli zaslon, snima se sve što se prikazuje na zaslonu. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kad snimate aplikaciju, snima se sve što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Snimanje zaslona"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Ažuriranje unaprijed definiranih postavki nije uspjelo"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Unaprijed definirana postavka"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Odabrano"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Alati"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Automatski titlovi"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Napomena"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Prikaži ikone obavijesti niskog prioriteta"</string> <string name="other" msgid="429768510980739978">"Ostalo"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"uklanjanje kartice"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"dodavanje kartice na kraj"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"dodavanje kartice na posljednji položaj"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Premještanje kartice"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Dodavanje kartice"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Dodajte karticu na željeni položaj"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Premještanje u prostoriju <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Dodavanje na položaj <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Položaj nije važeći."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"odaberi korisnika"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nema interneta"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otvaranje postavki za <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Uređivanje redoslijeda postavki."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Uredite redoslijed brzih postavki."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Izbornik tipke za uključivanje/isključivanje"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Zaključani zaslon"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(nije povezano)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nije prebačeno. Dodirnite da biste pokušali ponovo."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Povežite uređaj"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Da biste emitirali ovu sesiju, otvorite aplikaciju."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nepoznata aplikacija"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi emitiranje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audioizlaz."</string> @@ -1468,32 +1483,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotovo"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Pokušajte ponovno!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Natrag"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Prijeđite ulijevo ili udesno trima prstima na dodirnoj podlozi"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Odlično!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Napravili ste pokret za povratak."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Da biste se vratili pomoću dodirne podloge, prijeđite trima prstima ulijevo ili udesno"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Na početnu stranicu"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Prijeđite prema gore trima prstima na dodirnoj podlozi"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Sjajno!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Napravili ste pokret za otvaranje početnog zaslona"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Da biste otvorili početni zaslon, prijeđite trima prstima prema gore na dodirnoj podlozi"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Pregled nedavnih aplikacija"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Prijeđite prema gore trima prstima na dodirnoj podlozi i zadržite pritisak"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Napravili ste pokret za prikaz svih aplikacija"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Pritisnite tipku za radnju na tipkovnici za prikaz svih aplikacija"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacija u vodiču, kliknite za pauziranje i nastavak reprodukcije."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Pozadinsko osvjetljenje tipkovnice"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Razina %1$d od %2$d"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 669d59672c63..d2f6e8fc951c 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Folyamatban lévő értesítés képernyőrögzítési munkamenethez"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Rögzíti a képernyőt?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Egyetlen alkalmazás rögzítése"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Teljes képernyő rögzítése"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Teljes képernyő rögzítése: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"A teljes képernyő rögzítése esetén a képernyőn megjelenő minden tartalom rögzítésre kerül. Ezért legyen elővigyázatos a jelszavakkal, a fizetési adatokkal, az üzenetekkel, a fotókkal, valamint a hang- és videófelvételekkel."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Alkalmazás rögzítésekor az adott alkalmazásban megjelenített vagy lejátszott minden tartalom rögzítésre kerül. Ezért legyen elővigyázatos a jelszavakkal, a fizetési adatokkal, az üzenetekkel, a fotókkal, valamint a hang- és videófelvételekkel."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Képernyő rögzítése"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Nem sikerült frissíteni a beállításkészletet"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Beállításkészlet"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Kiválasztva"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Eszközök"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Élő feliratozás"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Megjegyzés"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Alacsony prioritású értesítési ikonok mutatása"</string> <string name="other" msgid="429768510980739978">"Egyéb"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"mozaik eltávolításához"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"mozaiknak a végéhez való hozzáadásához"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mozaik áthelyezése"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Mozaik hozzáadása"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Áthelyezés ide: <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Hozzáadás a következő pozícióhoz: <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Érvénytelen pozíció."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"felhasználó kiválasztása"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nincs internetkapcsolat"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"A(z) <xliff:g id="ID_1">%s</xliff:g> beállításainak megnyitása."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Beállítások sorrendjének szerkesztése."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Bekapcsológombhoz tartozó menü"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. oldal, összesen: <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lezárási képernyő"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(leválasztva)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"A váltás nem sikerült. Próbálja újra."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Eszköz csatlakoztatása"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"A munkamenet átküldéséhez nyissa meg az alkalmazást."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Ismeretlen alkalmazás"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Átküldés leállítása"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Rendelkezésre álló eszközök a hangkimenethez."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Kész"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Próbálja újra"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Vissza"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Csúsztassa gyorsan három ujját balra vagy jobbra az érintőpadon."</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Remek!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Teljesítette a visszalépési kézmozdulatot."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Ha az érintőpadot használva szeretne visszalépni, csúsztasson gyorsan három ujjal balra vagy jobbra."</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ugrás a főoldalra"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Csúsztasson gyorsan felfelé három ujjával az érintőpadon."</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Kiváló!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Teljesítette a kezdőképernyőre lépés kézmozdulatát."</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"A kezdőképernyőre való ugráshoz csúsztasson gyorsan három ujjal felfelé az érintőpadon."</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Legutóbbi alkalmazások megtekintése"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Csúsztasson gyorsan felfelé három ujjal az érintőpadon, és tartsa rajta lenyomva az ujjait."</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Teljesítette az összes alkalmazás megtekintésének kézmozdulatát."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Az összes alkalmazás megtekintéséhez nyomja meg a billentyűzeten a műveletbillentyűt."</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Útmutató animáció. Kattintson a szüneteltetéshez és a lejátszás folytatásához."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"A billentyűzet háttérvilágítása"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Fényerő: %2$d/%1$d"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 095c2adf1a8b..f65f604a3aa8 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Էկրանի տեսագրման աշխատաշրջանի ընթացիկ ծանուցում"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Տեսագրե՞լ ձեր էկրանը"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Տեսագրել մեկ հավելված"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Տեսագրել ամբողջ էկրանը"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Տեսագրել ամբողջ էկրանը՝ %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Երբ դուք տեսագրում եք ամբողջ էկրանը, էկրանին ցուցադրվող ամեն ինչ տեսագրվում է։ Ուստի ուշադիր եղեք այնպիսի բաների հետ, ինչպիսիք են գաղտնաբառերը, վճարային տվյալները, հաղորդագրությունները, լուսանկարները, աուդիո և վիդեո բովանդակությունը։"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Երբ դուք որևէ հավելված եք տեսագրում, հավելվածում ցուցադրվող կամ նվագարկվող ամեն ինչ տեսագրվում է։ Ուստի ուշադիր եղեք այնպիսի բաների հետ, ինչպիսիք են գաղտնաբառերը, վճարային տվյալները, հաղորդագրությունները, լուսանկարները, աուդիո և վիդեո բովանդակությունը։"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Տեսագրել էկրանը"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Չհաջողվեց թարմացնել կարգավորումների հավաքածուն"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Կարգավորումների հավաքածու"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Ընտրված է"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Գործիքներ"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Կենդանի ենթագրեր"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Նշում"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Ցուցադրել ցածր առաջնահերթության ծանուցումների պատկերակները"</string> <string name="other" msgid="429768510980739978">"Այլ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"հեռացնել սալիկը"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ավելացնել սալիկը վերջում"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Տեղափոխել սալիկը"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Ավելացնել սալիկ"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Տեղափոխել դիրք <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Ավելացնել դիրք <xliff:g id="POSITION">%1$d</xliff:g>-ում"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Դիրքն անվավեր է։"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ընտրել օգտատեր"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Ինտերնետ կապ չկա"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Բացել <xliff:g id="ID_1">%s</xliff:g> կարգավորումները:"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Խմբագրել կարգավորումների հերթականությունը:"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Սնուցման կոճակի ընտրացանկ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Էջ <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Կողպէկրան"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(անջատված է)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Սխալ առաջացավ։ Հպեք՝ կրկնելու համար։"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Միացնել սարք"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Այս աշխատաշրջանը հեռարձակելու համար բացեք հավելվածը"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Անհայտ հավելված"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Կանգնեցնել հեռարձակումը"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Հասանելի սարքեր ձայնի արտածման համար։"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Ինչպես անցնել հիմնական էկրան"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Դիտել վերջին հավելվածները"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Պատրաստ է"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Նորից փորձեք։"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Հետ գնալ"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Հպահարթակի վրա երեք մատով սահեցրեք ձախ կամ աջ"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Գերազանց է"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Դուք սովորեցիք հետ գնալու ժեստը։"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Հպահարթակին վերադառնալու համար երեք մատը սահեցրեք ձախ կամ աջ"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Անցում հիմնական էկրան"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Հպահարթակի վրա երեք մատով սահեցրեք վերև"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Կեցցե՛ք"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Դուք սովորեցիք հիմնական էկրան անցնելու ժեստը"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Հիմնական էկրանին անցնելու համար հպահարթակի վրա երեք մատը սահեցրեք վերև"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Դիտել վերջին հավելվածները"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Երեք մատով սահեցրեք վերև և սեղմած պահեք հպահարթակին"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Կեցցե՛ք"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Դուք կատարեցիք վերջին օգտագործված հավելվածների դիտման ժեստը։"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Վերջին հավելվածները տեսնելու համար երեք մատը սահեցրեք վերև և սեղմած պահեք հպահարթակին"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Դուք սովորեցիք բոլոր հավելվածները դիտելու ժեստը"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Ձեր բոլոր հավելվածները տեսնելու համար սեղմեք գործողության ստեղնը ստեղնաշարի վրա"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Ուղեցույցի անիմացիա․ սեղմեք՝ նվագարկումը դադարեցնելու/վերսկսելու համար։"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Հետին լուսավորությամբ ստեղնաշար"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d՝ %2$d-ից"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index b5b588891eee..527c8e8da9bc 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifikasi yang sedang berjalan untuk sesi rekaman layar"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Rekam layar Anda?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Rekam satu aplikasi"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Rekam seluruh layar"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Rekam seluruh layar: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Saat Anda merekam seluruh layar, semua hal yang ditampilkan di layar akan direkam. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Jika Anda merekam aplikasi, semua hal yang ditampilkan atau diputar di aplikasi tersebut akan direkam. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Rekam layar"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Tidak dapat memperbarui preset"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Preset"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Dipilih"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Alat"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Teks Otomatis"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Catatan"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Tampilkan ikon notifikasi prioritas rendah"</string> <string name="other" msgid="429768510980739978">"Lainnya"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"menghapus kartu"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"menambahkan kartu ke akhir"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Pindahkan kartu"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Tambahkan kartu"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Pindahkan ke <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Tambahkan ke posisi <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posisi tidak valid."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"memilih pengguna"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Tidak ada internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Buka setelan <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit urutan setelan."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu daya"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Halaman <xliff:g id="ID_1">%1$d</xliff:g> dari <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Layar kunci"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(tidak terhubung)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Tidak dapat beralih. Ketuk untuk mencoba lagi."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Hubungkan perangkat"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Buka aplikasi untuk mentransmisikan sesi ini."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplikasi tidak dikenal"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Hentikan transmisi"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Perangkat yang tersedia untuk output audio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Selesai"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Coba lagi"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kembali"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Geser ke kiri atau kanan menggunakan tiga jari di touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Sip!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Anda telah menyelesaikan gestur untuk kembali."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Untuk kembali menggunakan touchpad, geser ke kiri atau kanan menggunakan tiga jari"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Buka layar utama"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Geser ke atas dengan tiga jari di touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bagus!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Anda telah menyelesaikan gestur buka layar utama"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Geser ke atas dengan tiga jari di touchpad untuk membuka layar utama"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Lihat aplikasi terbaru"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Geser ke atas dan tahan menggunakan tiga jari di touchpad"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Untuk melihat aplikasi terbaru, geser ke atas dan tahan menggunakan tiga jari di touchpad"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Anda telah menyelesaikan gestur untuk melihat semua aplikasi"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Tekan tombol tindakan di keyboard untuk melihat semua aplikasi"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animasi tutorial, klik untuk menjeda dan melanjutkan pemutaran."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Lampu latar keyboard"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tingkat %1$d dari %2$d"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index a1ad51e84082..3d1b025f8dfa 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Áframhaldandi tilkynning fyrir skjáupptökulotu"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Viltu taka upp skjáinn?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Taka upp eitt forrit"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Taka upp allan skjáinn"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Taka upp allan skjáinn: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Þegar þú tekur upp allan skjáinn verður allt sem er sýnilegt á skjánum tekið upp. Passaðu því upp á aðgangsorð, greiðsluupplýsingar, skilaboð, myndir, hljóð og myndskeið."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Þegar þú tekur upp forrit verður allt sem er sýnilegt eða spilað í forritinu tekið upp. Passaðu því upp á aðgangsorð, greiðsluupplýsingar, skilaboð, myndir, hljóð og myndskeið."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Taka upp skjá"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Tókst ekki að uppfæra forstillingu"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Forstilling"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Valið"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Verkfæri"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Skjátextar í rauntíma"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Glósa"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Sýna tákn fyrir tilkynningar með litlum forgangi"</string> <string name="other" msgid="429768510980739978">"Annað"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"fjarlægja flís"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"bæta flís við aftast"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Færa flís"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Bæta flís við"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Færa í <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Bæta við í stöðu <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Staða ógild."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"velja notanda"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Engin nettenging"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Opna <xliff:g id="ID_1">%s</xliff:g> stillingar."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Breyta röð stillinga."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aflrofavalmynd"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Blaðsíða <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lásskjár"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(aftengt)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Ekki er hægt að skipta. Ýttu til að reyna aftur."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Tengja tæki"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Opnaðu forritið til að senda þessa lotu út."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Óþekkt forrit"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stöðva útsendingu"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Tæki í boði fyrir hljóðúttak."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Lokið"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Reyndu aftur!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Til baka"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Strjúktu til hægri eða vinstri á snertifletinum með þremur fingrum"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Flott!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Þú laukst við að kynna þér bendinguna „til baka“."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Strjúktu til hægri eða vinstri á snertifletinum með þremur fingrum til að fara til baka"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Heim"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Strjúktu upp á snertifletinum með þremur fingrum"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Vel gert!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Þú framkvæmdir bendinguna „Fara á heimaskjá“"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Strjúktu upp á snertifletinum með þremur fingrum til að fara á heimaskjáinn"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Sjá nýleg forrit"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Strjúktu upp og haltu þremur fingrum inni á snertifletinum."</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Þú framkvæmdir bendinguna „Sjá öll forrit“"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Ýttu á aðgerðalykilinn á lyklaborðinu´til að sjá öll forritin þín"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Leiðsagnarhreyfimynd, smelltu til að gera hlé og halda áfram að spila."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Baklýsing lyklaborðs"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Stig %1$d af %2$d"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 03a6f54e9e61..b6059205bffa 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifica costante per una sessione di registrazione dello schermo"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Registrare lo schermo?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Registra un\'app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Registra l\'intero schermo"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Registra l\'intero schermo: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Quando registri l\'intero schermo, tutto ciò che viene mostrato sullo schermo viene registrato. Presta quindi attenzione a password, dati di pagamento, messaggi, foto, audio e video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Quando registri un\'app, tutto ciò che viene mostrato o riprodotto al suo interno viene registrato. Presta quindi attenzione a password, dati di pagamento, messaggi, foto, audio e video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Registra lo schermo"</string> @@ -415,6 +417,13 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Impossibile aggiornare preset"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Preset"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selezionato"</string> + <string name="hearing_devices_ambient_label" msgid="629440938614895797">"Audio ambientale"</string> + <string name="hearing_devices_ambient_control_left" msgid="3586965448230412600">"Sinistra"</string> + <string name="hearing_devices_ambient_control_right" msgid="6192137602448918383">"Destra"</string> + <string name="hearing_devices_ambient_expand_controls" msgid="2131816068187709200">"Espandi controlli separati a sinistra e a destra"</string> + <string name="hearing_devices_ambient_collapse_controls" msgid="2261097656446201581">"Comprimi in controllo unificato"</string> + <string name="hearing_devices_ambient_mute" msgid="1836882837647429416">"Disattiva audio ambientale"</string> + <string name="hearing_devices_ambient_unmute" msgid="2187938085943876814">"Riattiva audio ambientale"</string> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Strumenti"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Sottotitoli in tempo reale"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Nota"</string> @@ -960,9 +969,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Mostra icone di notifiche con priorità bassa"</string> <string name="other" msgid="429768510980739978">"Altro"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"rimuovere il riquadro"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"aggiungere il riquadro alla fine"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Sposta riquadro"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Aggiungi riquadro"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Sposta nella posizione <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Aggiungi alla posizione <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posizione non valida."</string> @@ -978,7 +989,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"selezionare l\'utente"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nessuna connessione a Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Apri le impostazioni <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Modifica l\'ordine delle impostazioni."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu del tasto di accensione"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> di <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Schermata di blocco"</string> @@ -1209,7 +1221,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(disconnesso)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Non puoi cambiare. Tocca per riprovare."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Connetti un dispositivo"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Per trasmettere questa sessione devi aprire l\'app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App sconosciuta"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Interrompi trasmissione"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivi disponibili per l\'uscita audio."</string> @@ -1468,32 +1479,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Fine"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Riprova."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Indietro"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Scorri verso sinistra o destra con tre dita sul touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bene!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Hai completato il gesto Indietro."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Per tornare indietro usando il touchpad, scorri verso sinistra o destra con tre dita"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Vai alla schermata Home"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Scorri in alto con tre dita sul touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Ottimo lavoro!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Hai completato il gesto Vai alla schermata Home"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Scorri verso l\'alto con tre dita sul touchpad per andare alla schermata Home"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Visualizza app recenti"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Scorri verso l\'alto e tieni premuto con tre dita sul touchpad"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Hai completato il gesto Visualizza tutte le app."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Premi il tasto azione sulla tastiera per visualizzare tutte le tue app"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animazione del tutorial: fai clic per mettere in pausa e riprendere la riproduzione."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Retroilluminazione della tastiera"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Livello %1$d di %2$d"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 1d74a496aba2..d0f26ba3704b 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"התראה מתמשכת לסשן הקלטת מסך"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"להקליט את המסך?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"הקלטה של אפליקציה אחת"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"הקלטה של כל המסך"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"הקלטת התוכן של כל המסך: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"כשמקליטים את כל המסך, כל מה שמופיע במסך מוקלט. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"כשמקליטים אפליקציה, כל מה שרואים או מפעילים בה מוקלט. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"הקלטת המסך"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"לא ניתן לעדכן את ההגדרה הקבועה מראש"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"הגדרה קבועה מראש"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"נבחר"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"כלים"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"כתוביות מיידיות"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"פתק"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"הצגת סמלי התראות בעדיפות נמוכה"</string> <string name="other" msgid="429768510980739978">"אחר"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"הסרת הלחצן"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"הוספת הלחצן בסוף הרשימה"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"העברת הלחצן"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"הוספת לחצן"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"העברה למיקום <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"הוספה למיקום <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"המיקום לא תקין."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"בחירת משתמש"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"אין אינטרנט"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"פתיחת הגדרות של <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"עריכת סדר ההגדרות."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"תפריט הפעלה"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"דף <xliff:g id="ID_1">%1$d</xliff:g> מתוך <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"מסך נעילה"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(מנותק)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"לא ניתן להחליף. צריך להקיש כדי לנסות שוב."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"חיבור מכשיר"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"כדי להפעיל Cast של הסשן הזה, צריך לפתוח את האפליקציה."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"אפליקציה לא ידועה"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"עצירת ההעברה (casting)"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"מכשירים זמינים לפלט אודיו."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"חזרה לדף הבית"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"הצגת האפליקציות האחרונות"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"סיום"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"צריך לנסות שוב."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"חזרה"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"מחליקים שמאלה או ימינה עם שלוש אצבעות על לוח המגע"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"איזה יופי!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"סיימת לתרגל את התנועה \'הקודם\'."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"כדי לחזור אחורה באמצעות לוח המגע, צריך להחליק שמאלה או ימינה עם שלוש אצבעות"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"מעבר למסך הבית"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"מחליקים כלפי מעלה עם שלוש אצבעות על לוח המגע"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"מעולה!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"סיימת לתרגל את תנועת החזרה למסך הבית"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"כדי לעבור למסך הבית, צריך להחליק כלפי מעלה עם שלוש אצבעות על לוח המגע"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"הצגת האפליקציות האחרונות"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"מחליקים למעלה עם שלוש אצבעות על לוח המגע ומשאירים אותן במגע עם הלוח"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"מעולה!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"סיימת לתרגל את התנועה להצגת האפליקציות האחרונות."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"כדי לראות את האפליקציות האחרונות, צריך להחליק למעלה וללחוץ לחיצה ארוכה עם שלוש אצבעות על לוח המגע"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"סיימת לתרגל את התנועה להצגת כל האפליקציות"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"כדי לראות את כל האפליקציות, צריך להקיש על מקש הפעולה במקלדת"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"אנימציה של הדרכה, אפשר ללחוץ כדי להשהות ולהמשיך את ההפעלה."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"התאורה האחורית במקלדת"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"רמה %1$d מתוך %2$d"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index da74e231ef03..dd9eb2a22857 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"画面の録画セッション中の通知"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"画面を録画しますか?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"1 つのアプリを録画"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"画面全体を録画"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"画面全体を録画: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"画面全体を録画すると、画面に表示されるものがすべて録画されます。パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"アプリを録画すると、そのアプリで表示または再生される内容がすべて録画されます。パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"画面を録画"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"プリセットを更新できませんでした"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"プリセット"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"選択中"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ツール"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"自動字幕起こし"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"注"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"優先度の低い通知アイコンを表示"</string> <string name="other" msgid="429768510980739978">"その他"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"タイルを削除"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"タイルを最後に追加"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"タイルを最後の位置に追加する"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"タイルを移動"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"タイルを追加"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"タイルを目的の位置に追加する"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> に移動"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"ポジション <xliff:g id="POSITION">%1$d</xliff:g> に追加"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"位置が無効です。"</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ユーザーを選択"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"インターネットに接続されていません"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> の設定を開きます。"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"設定の順序を編集します。"</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"クイック設定の順序を編集します。"</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源ボタン メニュー"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ページ <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ロック画面"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(接続解除済み)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"切り替えられません。タップしてやり直してください。"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"デバイスを接続"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"このセッションをキャストするには、アプリを開いてください。"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"不明なアプリ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"キャストを停止"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"音声出力ができるデバイスです。"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 5a2015821fd0..e2459f39c6a8 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"უწყვეტი შეტყობინება ეკრანის ჩაწერის სესიისთვის"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"გსურთ თქვენი ეკრანის ჩაწერა?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ერთი აპის ჩაწერა"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"მთლიანი ეკრანის ჩაწერა"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"მთლიანი ეკრანის ჩაწერა: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"მთლიანი ეკრანის ჩაწერისას ჩაიწერება ყველაფერი, რაც თქვენს ეკრანზე გამოჩნდება. ამიტომ სიფრთხილე გამოიჩინეთ ისეთ ინფორმაციასთან, როგორიცაა პაროლები, გადახდის დეტალები, შეტყობინებები, ფოტოები, აუდიო და ვიდეო."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"აპის ჩაწერისას ჩაიწერება ყველაფერი, რაც ამ აპში გამოჩნდება ან დაიკვრება. ამიტომ სიფრთხილე გამოიჩინეთ ისეთ ინფორმაციასთან, როგორიცაა პაროლები, გადახდის დეტალები, შეტყობინებები, ფოტოები, აუდიო და ვიდეო."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ეკრანის ჩაწერა"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"წინასწარ დაყენებული პარამეტრების განახლება ვერ მოხერხდა"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"წინასწარ დაყენებული"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"არჩეულია"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ხელსაწყოები"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"ავტოსუბტიტრები"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"ჩანიშვნა"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"დაბალი პრიორიტეტის მქონე შეტყობინებების ხატულების ჩვენება"</string> <string name="other" msgid="429768510980739978">"სხვა"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"მოზაიკის ფილის წაშლა"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ფილის ბოლოში დამატება"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"მოზაიკის გადატანა"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"მოზაიკის დამატება"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"გადატანა <xliff:g id="POSITION">%1$d</xliff:g>-ზე"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"დამატება პოზიციაზე <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"პოზიცია არასწორია."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"მომხმარებლის არჩევა"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ინტერნეტ-კავშირი არ არის"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> პარამეტრების გახსნა."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"პარამეტრების მიმდევრობის რედაქტირება."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ჩართვის მენიუ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"გვერდი <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>-დან"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ჩაკეტილი ეკრანი"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(კავშირი გაწყვეტილია)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"ვერ გადაირთო. შეეხეთ ხელახლა საცდელად."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"მოწყობილობასთან დაკავშირება"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ამ სესიის ტრანსლირებისთვის გახსენით აპი."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"უცნობი აპი"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ტრანსლირების შეწყვეტა"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ხელმისაწვდომი მოწყობილობები გამომავალი აუდიოსთვის."</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 5bd63b1b4d04..c325c9681287 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды бейнеге жазудың ағымдағы хабарландыруы"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Қолданба экранын жазасыз ба?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Бір қолданба экранын жазу"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Бүкіл экранды жазу"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Бүкіл экранды жазу: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Бүкіл экранды жазған кезде, онда көрінетін барлық нәрсе жазылады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Қолданбаны жазған кезде, онда көрінетін не ойнатылатын барлық нәрсе жазылады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Экранды жазу"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Параметрлер жинағын жаңарту мүмкін болмады."</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Параметрлер жинағы"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Таңдалды"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Құралдар"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Live Caption"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Ескертпе"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Маңызды емес хабарландыру белгішелерін көрсету"</string> <string name="other" msgid="429768510980739978">"Басқа"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"бөлшекті өшіру"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"бөлшекті соңына қосу"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Бөлшекті жылжыту"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Бөлшек қосу"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> орнына жылжыту"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> орнына қосу"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Орын жарамсыз."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"пайдаланушыны таңдаңыз"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Интернетпен байланыс жоқ"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> параметрлерін ашу."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Параметрлер тәртібін өзгерту."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Қуат мәзірі"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> ішінен <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Құлыптаулы экран"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ажыратулы)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Ауысу мүмкін емес. Әрекетті қайталау үшін түртіңіз."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Құрылғы жалғау"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Бұл сеансты трансляциялау үшін қолданбаны ашыңыз."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Белгісіз қолданба"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Трансляцияны тоқтату"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Аудио шығыс үшін қолжетімді құрылғылар бар."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Негізгі бетке өту"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Соңғы қолданбаларды көру"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Дайын"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Қайталап көріңіз"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Артқа"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Сенсорлық тақтада үш саусақпен оңға немесе солға сырғытыңыз."</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Керемет!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Артқа қайту қимылын аяқтадыңыз."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Сенсорлық тақта арқылы артқа оралу үшін үш саусақпен солға немесе оңға сырғытыңыз."</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Негізгі экранға өту"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Сенсорлық тақтада үш саусақпен жоғары сырғытыңыз."</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Жарайсыз!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Негізгі экранға қайту қимылын орындадыңыз."</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Негізгі экранға өту үшін сенсорлық тақтада үш саусақпен жоғары сырғытыңыз."</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Соңғы қолданбаларды көру"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Сенсорлық тақтада үш саусақпен жоғары сырғытып, басып тұрыңыз."</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Жарайсыз!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Соңғы қолданбаларды көру қимылын орындадыңыз."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Соңғы қолданбаларды көру үшін сенсорлық тақтада үш саусақпен жоғары сырғытып, ұстап тұрыңыз."</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Барлық қолданбаны көру қимылын орындадыңыз."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Барлық қолданбаңызды көру үшін пернетақтадағы әрекет пернесін басыңыз."</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Оқулықтың анимациясы, ойнатуды кідірту және жалғастыру үшін басыңыз."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Пернетақта жарығы"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Деңгей: %1$d/%2$d"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index fa3fc664c0f8..a6e25d1aafda 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"ការជូនដំណឹងដែលកំពុងដំណើរការសម្រាប់រយៈពេលប្រើការថតសកម្មភាពអេក្រង់"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"ថតអេក្រង់របស់អ្នកឬ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ថតកម្មវិធីទោល"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"ថតអេក្រង់ទាំងមូល"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ថតអេក្រង់ទាំងមូល៖ %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"នៅពេលអ្នកកំពុងថតអេក្រង់ទាំងមូលរបស់អ្នក អ្វីគ្រប់យ៉ាងដែលបង្ហាញនៅលើអេក្រង់របស់អ្នកត្រូវបានថត។ ដូច្នេះ សូមប្រុងប្រយ័ត្នចំពោះអ្វីៗដូចជា ពាក្យសម្ងាត់ ព័ត៌មានលម្អិតអំពីការទូទាត់ប្រាក់ សារ រូបថត ព្រមទាំងសំឡេង និងវីដេអូ។"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"នៅពេលអ្នកកំពុងថតកម្មវិធីណាមួយ អ្វីគ្រប់យ៉ាងដែលបង្ហាញ ឬចាក់នៅក្នុងកម្មវិធីនោះត្រូវបានថត។ ដូច្នេះ សូមប្រុងប្រយ័ត្នចំពោះអ្វីៗដូចជា ពាក្យសម្ងាត់ ព័ត៌មានលម្អិតអំពីការទូទាត់ប្រាក់ សារ រូបថត ព្រមទាំងសំឡេង និងវីដេអូ។"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ថតអេក្រង់"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"មិនអាចប្ដូរការកំណត់ជាមុនបានទេ"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"កំណត់ជាមុន"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"បានជ្រើសរើស"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ឧបករណ៍"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"អក្សររត់ក្នុងពេលជាក់ស្ដែង"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"កំណត់ចំណាំ"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"បង្ហាញរូបការជូនដំណឹងដែលមានអាទិភាពទាប"</string> <string name="other" msgid="429768510980739978">"ផ្សេងៗ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ដកប្រអប់ចេញ"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"បញ្ចូលប្រអប់ទៅខាងចុង"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ផ្លាស់ទីប្រអប់"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"បញ្ចូលប្រអប់"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"ផ្លាស់ទីទៅ <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"បញ្ចូលទៅទីតាំងទី <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"ទីតាំងគ្មានសុពលភាព។"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ជ្រើសរើសអ្នកប្រើប្រាស់"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"គ្មានអ៊ីនធឺណិតទេ"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"បើការកំណត់ <xliff:g id="ID_1">%s</xliff:g>"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"កែលំដាប់ការកំណត់"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ម៉ឺនុយថាមពល"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ទំព័រ <xliff:g id="ID_1">%1$d</xliff:g> នៃ <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"អេក្រង់ចាក់សោ"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(បានដាច់)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"មិនអាចប្ដូរបានទេ។ សូមចុចដើម្បីព្យាយាមម្ដងទៀត។"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ភ្ជាប់ឧបករណ៍"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ដើម្បីភ្ជាប់វគ្គនេះ សូមបើកកម្មវិធី។"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"កម្មវិធីដែលមិនស្គាល់"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"បញ្ឈប់ការភ្ជាប់"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ឧបករណ៍ដែលអាចប្រើបានសម្រាប់ឧបករណ៍បញ្ចេញសំឡេង។"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index e53988c8c648..2ddb1a8e9a92 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಸೆಶನ್ಗಾಗಿ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ನೋಟಿಫಿಕೇಶನ್"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಬೇಕೇ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ಒಂದು ಆ್ಯಪ್ ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"ಸಂಪೂರ್ಣ ಸ್ಕ್ರೀನ್ ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ಸಂಪೂರ್ಣ ಸ್ಕ್ರೀನ್ ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಿ: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"ನಿಮ್ಮ ಸಂಪೂರ್ಣ ಸ್ಕ್ರೀನ್ ಅನ್ನು ನೀವು ರೆಕಾರ್ಡ್ ಮಾಡುತ್ತಿರುವಾಗ, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುವ ಎಲ್ಲವನ್ನೂ ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಮತ್ತು ಆಡಿಯೋ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಬಗ್ಗೆ ಜಾಗರೂಕರಾಗಿರಿ."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ, ಆ ಆ್ಯಪ್ನಲ್ಲಿ ತೋರಿಸಿರುವ ಅಥವಾ ಪ್ಲೇ ಮಾಡಿದ ಎಲ್ಲವನ್ನೂ ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಮತ್ತು ಆಡಿಯೋ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಬಗ್ಗೆ ಜಾಗರೂಕರಾಗಿರಿ."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"ಪ್ರಿಸೆಟ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"ಪ್ರಿಸೆಟ್"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ಟೂಲ್ಗಳು"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"ಲೈವ್ ಕ್ಯಾಪ್ಶನ್"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"ಟಿಪ್ಪಣಿ"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"ಕಡಿಮೆ-ಆದ್ಯತೆ ಸೂಚನೆಯ ಐಕಾನ್ಗಳನ್ನು ತೋರಿಸಿ"</string> <string name="other" msgid="429768510980739978">"ಇತರ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ಟೈಲ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ಕೊನೆಯಲ್ಲಿ ಟೈಲ್ ಸೇರಿಸಿ"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ಟೈಲ್ ಸರಿಸಿ"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ಟೈಲ್ ಸೇರಿಸಿ"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"ಇಲ್ಲಿಗೆ ಸರಿಸಿ <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> ಸ್ಥಾನಕ್ಕೆ ಸೇರಿಸಿ"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"ಸ್ಥಾನವು ಅಮಾನ್ಯವಾಗಿದೆ."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ಬಳಕೆದಾರರನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ಸೆಟ್ಟಿಂಗ್ಗಳ ಕ್ರಮವನ್ನು ಎಡಿಟ್ ಮಾಡಿ."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ಪವರ್ ಮೆನು"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="ID_1">%1$d</xliff:g> ಪುಟ"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ಲಾಕ್ ಸ್ಕ್ರೀನ್"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ಡಿಸ್ಕನೆಕ್ಟ್ ಆಗಿದೆ)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"ಬದಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ಸಾಧನವನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಿ"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ಈ ಸೆಶನ್ ಕಾಸ್ಟ್ ಮಾಡಲು, ಆ್ಯಪ್ ಅನ್ನು ತೆರೆಯಿರಿ."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"ಅಪರಿಚಿತ ಆ್ಯಪ್"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ಬಿತ್ತರಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ಆಡಿಯೋ ಔಟ್ಪುಟ್ಗಾಗಿ ಲಭ್ಯವಿರುವ ಸಾಧನಗಳು."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ಮುಖಪುಟಕ್ಕೆ ಹೋಗಿ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ಮುಗಿದಿದೆ"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"ಪುನಃ ಪ್ರಯತ್ನಿಸಿ!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ಹಿಂತಿರುಗಿ"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿ ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಎಡ ಅಥವಾ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"ಚೆನ್ನಾಗಿದೆ!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ನೀವು ಗೋ ಬ್ಯಾಕ್ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ ಬಳಸಿಕೊಂಡು ಹಿಂತಿರುಗಲು, ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಎಡಕ್ಕೆ ಅಥವಾ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ಮುಖಪುಟಕ್ಕೆ ಹೋಗಿ"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿ ಮೂರು ಬೆರಳಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"ಭೇಷ್!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"ನೀವು ಗೋ ಹೋಮ್ ಜೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್ಗೆ ಹೋಗಲು ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿ ಮೂರು ಬೆರಳುಗಳಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿ ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ಭೇಷ್!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ನೀವು ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳ ಜೆಸ್ಚರ್ ವೀಕ್ಷಣೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿ ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ನೀವು ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳ ಜೆಸ್ಚರ್ ವೀಕ್ಷಣೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"ನಿಮ್ಮ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ನಲ್ಲಿ ಆ್ಯಕ್ಷನ್ ಕೀಯನ್ನು ಒತ್ತಿ"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ಟುಟೋರಿಯಲ್ ಆ್ಯನಿಮೇಷನ್, ವಿರಾಮಗೊಳಿಸಲು ಮತ್ತು ಪ್ಲೇ ಪುನರಾರಂಭಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ಕೀಬೋರ್ಡ್ ಬ್ಯಾಕ್ಲೈಟ್"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ರಲ್ಲಿ %1$d ಮಟ್ಟ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index dc6fcda09d8f..caa76340dc29 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"화면 녹화 세션에 관한 지속적인 알림"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"화면을 녹화하시겠습니까?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"단일 앱 녹화"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"전체 화면 녹화"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"전체 화면 녹화: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"전체 화면을 녹화하면 화면에 표시되는 모든 항목이 녹화됩니다. 따라서 비밀번호, 결제 세부정보, 메시지, 사진, 오디오 및 동영상 등이 노출되지 않도록 주의하세요."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"앱을 녹화하면 앱에 표시되거나 앱에서 재생되는 모든 항목이 녹화됩니다. 따라서 비밀번호, 결제 세부정보, 메시지, 사진, 오디오 및 동영상 등이 노출되지 않도록 주의하세요."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"화면 녹화"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"사전 설정을 업데이트할 수 없음"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"미리 설정"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"선택됨"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"도구"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"실시간 자막"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"메모"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"우선순위가 낮은 알림 아이콘 표시"</string> <string name="other" msgid="429768510980739978">"기타"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"타일 삭제"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"끝에 타일 추가"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"타일 이동"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"타일 추가"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> 위치로 이동"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> 위치에 추가"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"위치가 잘못되었습니다."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"사용자 선택"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"인터넷 연결 없음"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> 설정 열기"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"설정 순서 수정"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"전원 메뉴"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>페이지 중 <xliff:g id="ID_1">%1$d</xliff:g>페이지"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"잠금 화면"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(연결 끊김)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"전환할 수 없습니다. 다시 시도하려면 탭하세요."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"기기 연결"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"세션을 전송하려면 앱을 열어 주세요"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"알 수 없는 앱"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"전송 중지"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"오디오 출력에 사용 가능한 기기입니다."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"홈으로 이동"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"최근 앱 보기"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"완료"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"다시 시도해 보세요"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"뒤로"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"세 손가락을 사용해 터치패드에서 왼쪽 또는 오른쪽으로 스와이프하세요."</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"훌륭합니다"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"돌아가기 동작을 완료했습니다."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"터치패드를 사용해 뒤로 돌아가려면 세 손가락을 사용해 왼쪽이나 오른쪽으로 스와이프하세요."</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"홈으로 이동"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"세 손가락을 사용해 터치패드에서 위로 스와이프하세요."</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"잘하셨습니다"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"홈으로 이동 동작을 완료했습니다."</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"홈 화면으로 이동하려면 터치패드에서 세 손가락을 사용해 위로 스와이프하세요."</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"최근 앱 보기"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"세 손가락을 사용해 터치패드에서 위로 스와이프한 후 잠시 기다리세요."</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"아주 좋습니다"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"최근 앱 보기 동작을 완료했습니다."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"최근 앱을 보려면 터치패드에서 세 손가락을 사용해 위로 스와이프한 채로 유지하세요."</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"모든 앱 보기 동작을 완료했습니다."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"모든 앱을 확인하려면 키보드의 작업 키를 누르세요."</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"튜토리얼 애니메이션입니다. 일시중지하고 재생을 재개하려면 클릭하세요."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"키보드 백라이트"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d단계 중 %1$d단계"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 83ec250da016..836179edb217 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Экранды жаздырасызбы?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Бир колдонмону жаздыруу"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Бүтүндөй экранды жаздыруу"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Толук экранды жаздыруу: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Бүтүндөй экранды жаздырганда, андагы нерселердин баары видеого түшүп калат. Андыктан этият болуп, сырсөздөр, төлөм ыкмалары, билдирүүлөр, сүрөттөр, аудио жана видео материалдар сыяктуу купуя нерселерди көрсөтүп албаңыз."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Колдонмону жаздырганда, андагы нерселердин баары видеого түшүп калат. Андыктан сырсөздөр, төлөмдүн чоо-жайы, билдирүүлөр, сүрөттөр, аудио жана видео сыяктуу нерселер менен этият болуңуз."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Экранды жаздыруу"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Алдын ала коюлган параметрлер жаңыртылган жок"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Алдын ала коюлган параметрлер"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Тандалды"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Куралдар"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Ыкчам коштомо жазуулар"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Учкай маалымат"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Анча маанилүү эмес билдирменин сүрөтчөлөрүн көрсөтүү"</string> <string name="other" msgid="429768510980739978">"Башка"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ыкчам баскычты өчүрүү"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ыкчам баскычты аягына кошуу"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Ыкчам баскычты жылдыруу"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Ыкчам баскыч кошуу"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Төмөнкүгө жылдыруу: <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g>-позицияга кошуу"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Абал жараксыз."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"колдонуучуну тандоо"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Интернет жок"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> параметрлерин ачуу."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Параметрлердин иретин өзгөртүү."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Кубат баскычынын менюсу"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> ичинен <xliff:g id="ID_1">%1$d</xliff:g>-бет"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Кулпуланган экран"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ажыратылды)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Которулбай жатат. Кайталоо үчүн басыңыз."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Түзмөктү туташтыруу"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Бул сеансты тышкы экранга чыгаруу үчүн колдонмону ачыңыз."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Белгисиз колдонмо"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Тышкы экранга чыгарууну токтотуу"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Аудио чыгаруу үчүн жеткиликтүү түзмөктөр."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Башкы бетке өтүү"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Акыркы колдонмолорду көрүү"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Бүттү"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Кайталап көрүңүз!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Артка кайтуу"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Сенсордук тактаны үч манжаңыз менен солго же оңго сүрүңүз"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Сонун!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"\"Артка\" жаңсоосун үйрөндүңүз."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Сенсордук такта менен артка кайтуу үчүн үч манжаңыз менен солго же оңго сүрүңүз"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Башкы бетке өтүү"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Сенсордук тактаны үч манжаңыз менен жогору сүрүңүз"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Азаматсыз!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"\"Башкы бетке өтүү\" жаңсоосун үйрөндүңүз"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Башкы экранга өтүү үчүн сенсордук тактаны үч манжаңыз менен жогору сүрүңүз"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Акыркы колдонмолорду көрүү"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Сенсордук тактаны үч манжаңыз менен өйдө сүрүп, кармап туруңуз"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Азаматсыз!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Акыркы колдонмолорду көрүү жаңсоосун аткардыңыз."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Соңку колдонмолорду көрүү үчүн сенсордук тактаны үч манжаңыз менен жогору сүрүп, кармап туруңуз"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Бардык колдонмолорду көрүү жаңсоосун аткардыңыз"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Бардык колдонмолоруңузду көрүү үчүн баскычтобуңуздагы аракет баскычын басыңыз"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Үйрөткүч анимация, ойнотууну тындыруу же улантуу үчүн чыкылдатыңыз."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Баскычтоптун жарыгы"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ичинен %1$d-деңгээл"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 53d3bca20fa5..47a431b04f0d 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"ການແຈ້ງເຕືອນສຳລັບເຊດຊັນການບັນທຶກໜ້າຈໍໃດໜຶ່ງ"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"ບັນທຶກໜ້າຈໍຂອງທ່ານບໍ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ບັນທຶກແອັບດຽວ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"ບັນທຶກໝົດໜ້າຈໍ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ບັນທຶກໜ້າຈໍທັງໝົດ: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"ເມື່ອທ່ານບັນທຶກໝົດໜ້າຈໍຂອງທ່ານ, ລະບົບຈະບັນທຶກທຸກສິ່ງທີ່ສະແດງຢູ່ໜ້າຈໍຂອງທ່ານ. ດັ່ງນັ້ນ, ໃຫ້ລະມັດລະວັງສິ່ງຕ່າງໆ ເຊັ່ນ: ລະຫັດຜ່ານ, ລາຍລະອຽດການຈ່າຍເງິນ, ຂໍ້ຄວາມ, ຮູບພາບ, ພ້ອມທັງສຽງ ແລະ ວິດີໂອ."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"ເມື່ອທ່ານບັນທຶກແອັບ, ລະບົບຈະບັນທຶກທຸກສິ່ງທີ່ສະແດງ ຫຼື ຫຼິ້ນຢູ່ໃນແອັບນັ້ນ. ດັ່ງນັ້ນ, ໃຫ້ລະມັດລະວັງສິ່ງຕ່າງໆ ເຊັ່ນ: ລະຫັດຜ່ານ, ລາຍລະອຽດການຈ່າຍເງິນ, ຂໍ້ຄວາມ, ຮູບພາບ, ພ້ອມທັງສຽງ ແລະ ວິດີໂອ."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ບັນທຶກໜ້າຈໍ"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"ບໍ່ສາມາດອັບເດດການຕັ້ງຄ່າລ່ວງໜ້າໄດ້"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"ຄ່າທີ່ກຳນົດລ່ວງໜ້າ"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"ເລືອກແລ້ວ"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ເຄື່ອງມື"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"ຄຳບັນຍາຍສົດ"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"ບັນທຶກ"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"ສະແດງໄອຄອນການແຈ້ງເຕືອນຄວາມສຳຄັນຕ່ຳ"</string> <string name="other" msgid="429768510980739978">"ອື່ນໆ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ລຶບແຜ່ນອອກ"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ເພີ່ມແຜ່ນໃສ່ທ້າຍ"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ຍ້າຍແຜ່ນ"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ເພີ່ມແຜ່ນ"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"ຍ້າຍໄປ <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"ເພີ່ມໃສ່ຕຳແໜ່ງ <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"ຕຳແໜ່ງບໍ່ຖືກຕ້ອງ."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ເລືອກຜູ້ໃຊ້"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ບໍ່ມີອິນເຕີເນັດ"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"ເປີດການຕັ້ງຄ່າ <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ແກ້ໄຂລຳດັບການຕັ້ງຄ່າ."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ເມນູເປີດປິດ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ໜ້າຈໍລັອກ"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ຕັດການເຊື່ອມຕໍ່ແລ້ວ)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"ບໍ່ສາມາດສະຫຼັບໄດ້. ແຕະເພື່ອລອງໃໝ່."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ເຊື່ອມຕໍ່ຫາອຸປະກອນ"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ເພື່ອສົ່ງສັນຍານເຊດຊັນນີ້, ກະລຸນາເປີດແອັບ."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"ແອັບທີ່ບໍ່ຮູ້ຈັກ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ຢຸດການສົ່ງສັນຍານ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ອຸປະກອນທີ່ສາມາດໃຊ້ໄດ້ສຳລັບເອົ້າພຸດສຽງ."</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index bfdd89fe1c4a..5fba5b2fd43b 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Šiuo metu rodomas ekrano įrašymo sesijos pranešimas"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Įrašyti ekraną?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Įrašyti vieną programą"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Įrašyti visą ekraną"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Įrašyti visą ekraną: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kai įrašote visą ekraną, įrašomas visas ekrane rodomas turinys. Todėl būkite atsargūs naudodami slaptažodžius, išsamią mokėjimo metodo informaciją, pranešimus, nuotraukas ir garso bei vaizdo įrašus."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kai įrašote programą, įrašomas visas toje programoje rodomas ar leidžiamas turinys. Todėl būkite atsargūs naudodami slaptažodžius, išsamią mokėjimo metodo informaciją, pranešimus, nuotraukas ir garso bei vaizdo įrašus."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Įrašyti ekraną"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Išankstinių nustatymų atnaujinti nepavyko"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Išankstiniai nustatymai"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Pasirinkta"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Įrankiai"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Subtitrai realiuoju laiku"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Pastaba"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Rodyti mažo prioriteto pranešimų piktogramas"</string> <string name="other" msgid="429768510980739978">"Kita"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"pašalintumėte išklotinės elementą"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"pridėtumėte išklotinės elementą gale"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Perkelti išklotinės elementą"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Pridėti išklotinės elementą"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Perkelkite į <xliff:g id="POSITION">%1$d</xliff:g> poziciją"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Pridėkite <xliff:g id="POSITION">%1$d</xliff:g> pozicijoje"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Padėtis netinkama."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"pasirinktumėte naudotoją"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nėra interneto ryšio"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Atidaryti „<xliff:g id="ID_1">%s</xliff:g>“ nustatymus."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Redaguoti nustatymų tvarką."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Įjungimo meniu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g> psl. iš <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Užrakinimo ekranas"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(atjungta)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nepavyko perjungti. Bandykite vėl palietę."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Įrenginio prijungimas"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Jei norite perduoti šį seansą, atidarykite programą."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nežinoma programa"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Sustabdyti perdavimą"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Pasiekiami garso išvesties įrenginiai."</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 9208c7efb0ca..a407750fb35f 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Aktīvs paziņojums par ekrāna ierakstīšanas sesiju"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Vai ierakstīt ekrānu?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Ierakstīt vienu lietotni"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Ierakstīt visu ekrānu"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Ierakstīt visu ekrānu: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Ierakstot visu ekrānu, viss, kas redzams ekrānā, tiek ierakstīts. Tāpēc piesardzīgi apejieties ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Ierakstot lietotni, tiek ierakstīts viss attiecīgajā lietotnē rādītais vai atskaņotais. Tāpēc piesardzīgi apejieties ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Ierakstīt ekrānu"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Nevarēja atjaunināt pirmsiestatījumu"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Pirmsiestatījums"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Atlasīts"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Rīki"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Subtitri reāllaikā"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Piezīme"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Rādīt zemas prioritātes paziņojumu ikonas"</string> <string name="other" msgid="429768510980739978">"Citi"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"noņemt elementu"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"pievienot elementu beigās"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Pārvietot elementu"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Pievienot elementu"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Pārvietot uz pozīciju numur <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Pievienot elementu pozīcijā numur <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Nederīga pozīcija."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"izvēlēties lietotāju"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nav piekļuves internetam"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Atvērt <xliff:g id="ID_1">%s</xliff:g> iestatījumus."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Rediģēt iestatījumu secību."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Barošanas izvēlne"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. lpp. no <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Bloķēšanas ekrāns"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(savienojums pārtraukts)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nevar pārslēgt. Pieskarieties, lai mēģinātu vēlreiz."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Savienot ar ierīci"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Lai apraidītu šo sesiju, lūdzu, atveriet lietotni."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nezināma lietotne"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Apturēt apraidi"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio izvadei pieejamās ierīces."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gatavs"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Mēģiniet vēlreiz."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Atpakaļ"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Skārienpaliktnī ar trīs pirkstiem velciet pa kreisi vai pa labi."</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Lieliski!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Jūs sekmīgi veicāt atgriešanās žestu."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Lai pārietu atpakaļ, izmantojot skārienpaliktni, ar trīs pirkstiem velciet pa kreisi vai pa labi"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Pāreja uz sākuma ekrānu"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Skārienpaliktnī ar trīs pirkstiem velciet augšup."</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Lieliski!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Jūs sekmīgi veicāt sākuma ekrāna atvēršanas žestu."</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Lai pārietu uz sākuma ekrānu, skārienpaliktnī ar trīs pirkstiem velciet augšup"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Nesen izmantoto lietotņu skatīšana"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Skārienpaliktnī ar trīs pirkstiem velciet augšup un turiet."</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Jūs sekmīgi veicāt visu lietotņu skatīšanas žestu."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Lai skatītu visas savas lietotnes, tastatūrā nospiediet darbību taustiņu."</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Mācību animācija. Noklikšķiniet, lai pārtrauktu un atsāktu atskaņošanu."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Tastatūras fona apgaismojums"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Līmenis numur %1$d, kopā ir %2$d"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 15f24353bc61..f71ca44fcc06 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Да се снима екранот?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Снимање на една апликација"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Снимање на целиот екран"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Снимање на целиот екран: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Додека го снимате целиот екран, сѐ што е прикажано на екранот се снима. Затоа, бидете внимателни со лозинките, деталите за плаќање, пораките, фотографиите и аудиото и видеото."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Додека снимате апликација, може да се сними сѐ што се прикажува или пушта во таа апликација. Затоа, бидете внимателни со лозинките, деталите за плаќање, пораките, фотографиите и аудиото и видеото."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Снимај го екранот"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Не можеше да се ажурира зададената вредност"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Зададени вредности"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Избрано"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Алатки"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Автоматски титлови"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Белешка"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Прикажувај икони за известувања со низок приоритет"</string> <string name="other" msgid="429768510980739978">"Друго"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"отстранување на плочката"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"додавање на плочката на крај"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Преместување на плочката"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Додавање плочка"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Преместување на <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Додавање на позиција <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Позицијата е погрешна."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"изберете корисник"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Нема интернет"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Отворете ги поставките на <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Уредете го редоследот на поставките."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Мени на копчето за вклучување"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Страница <xliff:g id="ID_1">%1$d</xliff:g> од <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Заклучен екран"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(врската е прекината)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Не се префрла. Допрете и обидете се пак."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Поврзете уред"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"За да ја емитувате сесијава, отворете ја апликацијата."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Непозната апликација"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Сопри со емитување"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Достапни уреди за аудиоизлез."</string> @@ -1468,33 +1486,28 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Оди на почетниот екран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прикажи ги неодамнешните апликации"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Обидете се повторно!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Повлечете налево или надесно со три прста на допирната подлога"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Одлично!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Го научивте движењето за враќање назад."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"За да се вратите назад со допирната подлога, повлечете налево или надесно со три прста"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Одете на почетниот екран"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Повлечете нагоре со три прсти на допирната подлога"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Одлично!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Го завршивте движењето за враќање на почетниот екран"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Повлечете нагоре со три прста на допирната подлога за да одите на почетниот екран"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Прикажи ги неодамнешните апликации"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Повлечете нагоре и задржете со три прста на допирната подлога"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Одлично!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Го завршивте движењето за прегледување на неодамнешните апликации."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Повлечете нагоре со три прста на допирната подлога и задржете за да ги видите неодамнешните апликации"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Го завршивте движењето за прегледување на сите апликации"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> - <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анимација за упатство, кликнете за ја паузирате и да ја продолжите репродукцијата."</string> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Притиснете го копчето за дејство на тастатурата за да ги видите сите апликации"</string> + <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анимација за упатство, кликнете за да го паузирате и да го продолжите пуштањето."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Осветлување на тастатура"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Ниво %1$d од %2$d"</string> <string name="home_controls_dream_label" msgid="6567105701292324257">"Контроли за домот"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 0f8417e82ec3..db3e91ae241d 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"ഒരു സ്ക്രീൻ റെക്കോർഡിംഗ് സെഷനായി നിലവിലുള്ള അറിയിപ്പ്"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"നിങ്ങളുടെ സ്ക്രീൻ റെക്കോർഡ് ചെയ്യണോ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ഒരു ആപ്പ് റെക്കോർഡ് ചെയ്യുക"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"സ്ക്രീൻ പൂർണ്ണമായി റെക്കോർഡ് ചെയ്യുക"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"മുഴുവൻ സ്ക്രീനും റെക്കോർഡ് ചെയ്യുക: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"നിങ്ങളുടെ സ്ക്രീൻ പൂർണ്ണമായി റെക്കോർഡ് ചെയ്യുമ്പോൾ, സ്ക്രീനിൽ ദൃശ്യമാകുന്ന എല്ലാം റെക്കോർഡ് ചെയ്യപ്പെടും. അതിനാൽ പാസ്വേഡുകൾ, പേയ്മെന്റ് വിശദാംശങ്ങൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, ഓഡിയോ, വീഡിയോ എന്നിവ പോലുള്ള കാര്യങ്ങൾ നൽകുമ്പോൾ സൂക്ഷിക്കുക."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"നിങ്ങളുടെ ആപ്പ് റെക്കോർഡ് ചെയ്യുമ്പോൾ, ആ ആപ്പിൽ കാണിക്കുന്നതോ പ്ലേ ചെയ്യുന്നതോ ആയ എല്ലാ കാര്യങ്ങളും റെക്കോർഡ് ചെയ്യപ്പെടും. അതിനാൽ പാസ്വേഡുകൾ, പേയ്മെന്റ് വിശദാംശങ്ങൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, ഓഡിയോ, വീഡിയോ എന്നിവ പോലുള്ള കാര്യങ്ങൾ നൽകുമ്പോൾ സൂക്ഷിക്കുക."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"സ്ക്രീൻ റെക്കോർഡ് ചെയ്യുക"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"പ്രീസെറ്റ് അപ്ഡേറ്റ് ചെയ്യാനായില്ല"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"പ്രീസെറ്റ്"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"തിരഞ്ഞെടുത്തു"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ടൂളുകൾ"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"തത്സമയ ക്യാപ്ഷൻ"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"കുറിപ്പ്"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"പ്രാധാന്യം കുറഞ്ഞ അറിയിപ്പ് ചിഹ്നങ്ങൾ"</string> <string name="other" msgid="429768510980739978">"മറ്റുള്ളവ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ടൈൽ നീക്കം ചെയ്യുക"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ടൈൽ, അവസാന ഭാഗത്ത് ചേർക്കുക"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"അവസാന ഭാഗത്ത് ടൈൽ ചേർക്കുക"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ടൈൽ നീക്കുക"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ടൈൽ ചേർക്കുക"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"ഇഷ്ടമുള്ള ഭാഗത്ത് ടൈൽ ചേർക്കുക"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> എന്നതിലേക്ക് നീക്കുക"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> എന്ന സ്ഥാനത്തേക്ക് ചേർക്കുക"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"സ്ഥാനം അസാധുവാണ്."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ഉപയോക്താവിനെ തിരഞ്ഞെടുക്കുക"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ഇന്റർനെറ്റ് ഇല്ല"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ക്രമീകരണം തുറക്കുക."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ക്രമീകരണ ക്രമം എഡിറ്റുചെയ്യുക."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"ദ്രുത ക്രമീകരണത്തിന്റെ ക്രമം എഡിറ്റ് ചെയ്യുക."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"പവർ മെനു"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"പേജ് <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ലോക്ക് സ്ക്രീൻ"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(വിച്ഛേദിച്ചു)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"മാറാനാകുന്നില്ല. വീണ്ടും ശ്രമിക്കാൻ ടാപ്പ് ചെയ്യുക."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ഒരു ഉപകരണം കണക്റ്റ് ചെയ്യുക"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ഈ സെഷൻ കാസ്റ്റ് ചെയ്യാൻ, ആപ്പ് തുറക്കുക."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"അജ്ഞാതമായ ആപ്പ്"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"കാസ്റ്റ് ചെയ്യുന്നത് നിർത്തുക"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ഓഡിയോ ഔട്ട്പുട്ടിന് ലഭ്യമായ ഉപകരണങ്ങൾ."</string> @@ -1468,32 +1483,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ഹോമിലേക്ക് പോകുക"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"പൂർത്തിയായി"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"വീണ്ടും ശ്രമിക്കുക!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"മടങ്ങുക"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"ടച്ച്പാഡിൽ മൂന്ന് വിരലുകൾ കൊണ്ട് ഇടത്തേക്കോ വലത്തേക്കോ സ്വൈപ്പ് ചെയ്യുക"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"കൊള്ളാം!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"മടങ്ങുക ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"നിങ്ങളുടെ ടച്ച്പാഡ് ഉപയോഗിച്ച് തിരികെ പോകാൻ, മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് ഇടത്തോട്ടോ വലത്തോട്ടോ സ്വൈപ്പ് ചെയ്യുക"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ഹോമിലേക്ക് പോകൂ"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"ടച്ച്പാഡിൽ മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"കൊള്ളാം!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"ഹോം ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"നിങ്ങളുടെ ഹോം സ്ക്രീനിലേക്ക് പോകാൻ ടച്ച്പാഡിൽ മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"നിങ്ങളുടെ ടച്ച്പാഡിൽ മൂന്ന് വിരലുകൾ കൊണ്ട് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"കൊള്ളാം!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക എന്ന ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"സമീപകാല ആപ്പുകൾ കാണുന്നതിന്, നിങ്ങളുടെ ടച്ച്പാഡിൽ മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"\'എല്ലാ ആപ്പുകളും കാണുക\' ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"നിങ്ങളുടെ എല്ലാ ആപ്പുകളും കാണുന്നതിന് കീബോർഡിലെ ആക്ഷൻ കീ അമർത്തുക"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ട്യൂട്ടോറിയൽ ആനിമേഷൻ, താൽക്കാലികമായി നിർത്താനും പ്ലേ പുനരാരംഭിക്കാനും ക്ലിക്ക് ചെയ്യുക."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"കീബോഡ് ബാക്ക്ലൈറ്റ്"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-ൽ %1$d-ാമത്തെ ലെവൽ"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 47a546894d8b..75471baeca35 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Дэлгэц бичих горимын үргэлжилж буй мэдэгдэл"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Дэлгэцээ бичих үү?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Нэг аппыг бичих"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Бүтэн дэлгэцийг бичих"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Дэлгэцийг бүхэлд нь бичих: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Таныг бүтэн дэлгэцээ бичиж байхад дэлгэц дээр тань харуулж буй аливаа зүйлийг бичдэг. Тиймээс нууц үг, төлбөрийн дэлгэрэнгүй, мессеж, зураг, аудио, видео зэрэг зүйлд болгоомжтой хандаарай."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Таныг апп бичиж байхад тухайн аппад харуулж эсвэл тоглуулж буй аливаа зүйлийг бичдэг. Тиймээс нууц үг, төлбөрийн дэлгэрэнгүй, мессеж, зураг, аудио, видео зэрэг зүйлд болгоомжтой хандаарай."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Дэлгэцийг бичих"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Урьдчилсан тохируулгыг шинэчилж чадсангүй"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Урьдчилсан тохируулга"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Сонгосон"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Хэрэгсэл"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Шууд тайлбар"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Тэмдэглэл"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Бага ач холбогдолтой мэдэгдлийн дүрс тэмдгийг харуулах"</string> <string name="other" msgid="429768510980739978">"Бусад"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"хавтанг хасна уу"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"дуусгахын тулд хавтан нэмэх"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Хавтанг зөөх"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Хавтан нэмэх"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> руу зөөнө үү"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> байрлалд нэмнэ үү"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Байрлал буруу байна."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"хэрэглэгчийг сонгох"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Интернэт алга"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> тохиргоог нээнэ үү."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Тохиргооны дарааллыг өөрчилнө үү."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Асаах/унтраах цэс"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>-н <xliff:g id="ID_1">%1$d</xliff:g>-р хуудас"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Түгжээтэй дэлгэц"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(салсан)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Сэлгэх боломжгүй. Дахин оролдохын тулд товшино уу."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Төхөөрөмж холбох"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Энэ үйл явдлыг дамжуулахын тулд аппыг нээнэ үү."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Үл мэдэгдэх апп"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Дамжуулахыг зогсоох"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Аудио гаралт хийх боломжтой төхөөрөмжүүд."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Нүүр хуудас руу очих"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Саяхны аппуудыг харах"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Болсон"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Дахин оролдоно уу!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Буцах"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Мэдрэгч самбар дээрээ гурван хуруугаа ашиглан зүүн эсвэл баруун тийш шударна уу"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Янзтай!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Та буцах зангааг гүйцэтгэлээ."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Мэдрэгч самбараа буцааж ашиглахын тулд гурван хуруугаараа зүүн эсвэл баруун тийш шударна уу"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Үндсэн нүүр лүү очих"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Мэдрэгч самбар дээрээ гурван хуруугаараа дээш шударна уу"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Үнэхээр сайн ажиллалаа!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Та үндсэн нүүр лүү очих зангааг гүйцэтгэлээ"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Үндсэн нүүр лүүгээ очихын тулд мэдрэгч самбар дээрээ гурван хуруугаараа дээш шударна уу"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Саяхны аппуудыг харах"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Мэдрэгч самбар дээрээ гурван хуруугаа ашиглан дээш шудраад, удаан дарна уу"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Сайн байна!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Та саяхны аппуудыг харах зангааг гүйцэтгэсэн."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Саяхны аппуудыг харахын тулд мэдрэгч самбар дээрээ гурван хуруугаараа дээш шудраад, удаан дарна уу"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Та бүх аппыг харах зангааг гүйцэтгэлээ"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Бүх аппаа харахын тулд гар дээрээ байх тусгай товчлуурыг дарна уу"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Зааврын анимаци, түр зогсоохын тулд товшиж, үргэлжлүүлэн тоглуулна уу."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Гарын арын гэрэл"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d-с %1$d-р түвшин"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index b5c298b3a257..bd6cb131c972 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रेकॉर्ड सत्रासाठी सुरू असलेली सूचना"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"तुमची स्क्रीन रेकॉर्ड करायची आहे का?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"एक अॅप रेकॉर्ड करा"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"पूर्ण स्क्रीन रेकॉर्ड करा"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"संपूर्ण स्क्रीन रेकॉर्ड करा: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"तुम्ही तुमची पूर्ण स्क्रीन रेकॉर्ड करता, तेव्हा तुमच्या स्क्रीनवर दाखवलेली कोणतीही गोष्ट रेकॉर्ड केली जाते. त्यामुळे पासवर्ड, पेमेंट तपशील, मेसेज, फोटो आणि ऑडिओ व व्हिडिओ यांसारख्या गोष्टींबाबत सावधगिरी बाळगा."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"तुम्ही अॅप रेकॉर्ड करता, तेव्हा त्या अॅपमध्ये दाखवलेली किंवा प्ले केलेली कोणतीही गोष्ट रेकॉर्ड केली जाते. त्यामुळे पासवर्ड, पेमेंट तपशील, मेसेज, फोटो आणि ऑडिओ व व्हिडिओ यांसारख्या गोष्टींबाबत सावधगिरी बाळगा."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"स्क्रीन रेकॉर्ड करा"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"प्रीसेट अपडेट करता आले नाही"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"प्रीसेट"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"निवडला आहे"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"टूल"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"लाइव्ह कॅप्शन"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"टीप"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"कमी प्राधान्य सूचना आयकन दर्शवा"</string> <string name="other" msgid="429768510980739978">"अन्य"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"टाइल काढून टाका"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"टाइल शेवटच्या स्थानावर जोडा"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"टाइल हलवा"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"टाइल जोडा"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> यावर हलवा"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> स्थानावर जोडा"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"स्थान चुकीचे आहे."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"वापरकर्ता निवडा"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"इंटरनेट नाही"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> सेटिंग्ज उघडा."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"सेटिंग्जचा क्रम संपादित करा."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पॉवर मेनू"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> पैकी <xliff:g id="ID_1">%1$d</xliff:g> पेज"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"लॉक स्क्रीन"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(डिस्कनेक्ट केलेले)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"स्विच करू शकत नाही. पुन्हा प्रयत्न करण्यासाठी टॅप करा."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"डिव्हाइस कनेक्ट करा"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"हे सेशन कास्ट करण्यासाठी, कृपया ॲप उघडा."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"अज्ञात अॅप"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"कास्ट करणे थांबवा"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ऑडिओ आउटपुटसाठी उपलब्ध डिव्हाइस."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"होमवर जा"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"अलीकडील अॅप्स पहा"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"पूर्ण झाले"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"पुन्हा प्रयत्न करा!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"मागे जा"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"तुमच्या टचपॅडवर तीन बोटांनी डावीकडे किंवा उजवीकडे स्वाइप करा"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"छान!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"तुम्ही गो बॅक जेश्चर पूर्ण केले."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"तुमचा टचपॅड वापरून परत जाण्यासाठी, तीन बोटांनी डावीकडे किंवा उजवीकडे स्वाइप करा"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"होमवर जा"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"तुमच्या टचपॅडवर तीन बोटांनी वर स्वाइप करा"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"उत्तम कामगिरी!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"तुम्ही गो होम जेश्चर पूर्ण केले आहे"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"तुमच्या होम स्क्रीनवर जाण्यासाठी तुमच्या टचपॅडवर तीन बोटांनी वर स्वाइप करा"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"अलीकडील अॅप्स पहा"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"तुमच्या टचपॅडवर तीन बोटांनी वर स्वाइप करून धरून ठेवा"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"उत्तम कामगिरी!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"तुम्ही अलीकडील ॲप्स पाहण्याचे जेश्चर पूर्ण केले आहे."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"अलीकडील अॅप्स पाहण्यासाठी, तुमच्या टचपॅडवर तीन बोटांनी वर स्वाइप करून धरून ठेवा"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"तुम्ही ॲप्स पाहण्याचे जेश्चर पूर्ण केले आहे"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"तुमचे सर्व ॲप्स पाहण्यासाठी तुमच्या कीबोर्डवरील अॅक्शन की प्रेस करा"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ट्यूटोरियल अॅनिमेशन थांबवण्यासाठी किंवा पुन्हा सुरू करण्यासाठी प्ले करा वर क्लिक करा."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"कीबोर्ड बॅकलाइट"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d पैकी %1$d पातळी"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 481f6628d0f0..3af595760c85 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pemberitahuan breterusan untuk sesi rakaman skrin"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Rakam skrin anda?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Rakam satu apl"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Rakam seluruh skrin"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Rakam keseluruhan skrin: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Apabila anda merakam seluruh skrin anda, apa-apa sahaja yang dipaparkan pada skrin anda akan dirakam. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Apabila anda merakam apl, apa-apa sahaja yang dipaparkan atau dimainkan dalam apl tersebut akan dirakam. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Rakam skrin"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Tidak dapat mengemaskinikan pratetapan"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Pratetapan"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Dipilih"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Alatan"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Sari Kata Langsung"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Nota"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Tunjukkan ikon pemberitahuan keutamaan rendah"</string> <string name="other" msgid="429768510980739978">"Lain-lain"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"alih keluar jubin"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"tambahkan jubin pada bahagian hujung"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"tambahkan jubin pada kedudukan terakhir"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Alihkan jubin"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Tambahkan jubin"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Tambahkan jubin pada kedudukan yang dikehendaki"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Alih ke <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Tambahkan pada kedudukan <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Kedudukan tidak sah."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"pilih pengguna"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Tiada Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Buka tetapan <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit susunan tetapan."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Edit urutan Tetapan Pantas."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu kuasa"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Halaman <xliff:g id="ID_1">%1$d</xliff:g> daripada <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Kunci skrin"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(diputuskan sambungan)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Tidak dapat menukar. Ketik untuk mencuba lagi."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Sambungkan peranti"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Untuk menghantar sesi ini, sila buka apl."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Apl yang tidak diketahui"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Berhenti menghantar"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Peranti tersedia untuk audio output."</string> @@ -1468,32 +1483,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Selesai"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Cuba lagi!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kembali"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Leret ke kiri atau ke kanan menggunakan tiga jari pada pad sentuh"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bagus!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Anda telah melengkapkan gerak isyarat kembali."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Untuk kembali menggunakan pad sentuh anda, leret ke kiri atau ke kanan menggunakan tiga jari"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Akses laman utama"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Leret ke atas dengan tiga jari pada pad sentuh anda"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bagus!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Anda telah melengkapkan gerak isyarat akses laman utama"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Leret ke atas dengan tiga jari pada pad sentuh anda untuk mengakses skrin utama anda"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Lihat apl terbaharu"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Leret ke atas dan tahan menggunakan tiga jari pada pad sentuh"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Anda telah melengkapkan gerak isyarat lihat semua apl"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Tekan kekunci tindakan pada papan kekunci anda untuk melihat semua apl anda"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animasi tutorial, klik untuk menjeda dan menyambung semula main."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Cahaya latar papan kekunci"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Tahap %1$d daripada %2$d"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index bde5f576f322..a8a2eaac0654 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"ဖန်သားပြင် ရိုက်ကူးသည့် စက်ရှင်အတွက် ဆက်တိုက်လာနေသော အကြောင်းကြားချက်"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"ဖန်သားပြင်ကို ရိုက်ကူးမလား။"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"အက်ပ်တစ်ခုကို ရိုက်ကူးရန်"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"ဖန်သားပြင်တစ်ခုလုံးကို ရိုက်ကူးရန်"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ဖန်သားပြင်တစ်ခုလုံးကို ရိုက်ကူးရန်- %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"သင့်ဖန်သားပြင်တစ်ခုလုံး ရိုက်ကူးနေချိန်တွင် ဖန်သားပြင်တွင် ပြထားသည့် အရာအားလုံးကို ရိုက်ကူးသည်။ စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့ အရာများကို ဂရုစိုက်ပါ။"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"အက်ပ်ကို ရိုက်ကူးနေချိန်တွင် ယင်းအက်ပ်တွင် ပြထားသော (သို့) ဖွင့်ထားသော အရာအားလုံးကို ရိုက်ကူးသည်။ စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့ အရာများကို ဂရုစိုက်ပါ။"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ဖန်သားပြင်ကို ရိုက်ကူးရန်"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"အသင့်သုံးကို အပ်ဒိတ်လုပ်၍မရပါ"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"ကြိုတင်သတ်မှတ်ချက်"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"ရွေးထားသည်"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"တူးလ်များ"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"တိုက်ရိုက်စာတန်း"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"မှတ်စု"</string> @@ -707,7 +723,7 @@ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ခေါင်းလှုပ်ရှားမှု"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ဖုန်းခေါ်သံမုဒ်သို့ ပြောင်းရန် တို့ပါ"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"အသံမြည်မုဒ်"</string> - <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>၊ ဖုန်းခေါ်သံမုဒ်သို့ ပြောင်းရန် တို့ပါ"</string> + <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>၊ ဖုန်းခေါ်သံမုဒ် ပြောင်းရန် တို့ပါ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"အသံပိတ်ရန်"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"အသံဖွင့်ရန်"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"တုန်ခါမှု"</string> @@ -880,7 +896,7 @@ <string name="keyboard_shortcut_group_system_multitasking" msgid="6967816258924795558">"တစ်ပြိုင်နက် များစွာလုပ်ခြင်း"</string> <string name="system_multitasking_rhs" msgid="8779289852395243004">"အက်ပ်ကို ညာ၌ထားကာ မျက်နှာပြင် ခွဲ၍ပြသခြင်း သုံးရန်"</string> <string name="system_multitasking_lhs" msgid="7348595296208696452">"အက်ပ်ကို ဘယ်၌ထားကာ မျက်နှာပြင် ခွဲ၍ပြသခြင်း သုံးရန်"</string> - <string name="system_multitasking_full_screen" msgid="4940465971687159429">"ဖန်သားပြင်အပြည့် ပြောင်းခြင်း"</string> + <string name="system_multitasking_full_screen" msgid="4940465971687159429">"ဖန်သားပြင်အပြည့် ပြောင်းရန်"</string> <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"မျက်နှာပြင်ခွဲ၍ပြသခြင်း သုံးစဉ် ညာ (သို့) အောက်ရှိအက်ပ်သို့ ပြောင်းရန်"</string> <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းသုံးစဉ် ဘယ် (သို့) အထက်ရှိအက်ပ်သို့ ပြောင်းရန်"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"မျက်နှာပြင် ခွဲ၍ပြသစဉ်- အက်ပ်တစ်ခုကို နောက်တစ်ခုနှင့် အစားထိုးရန်"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"အရေးမကြီးသော အကြောင်းကြားချက် သင်္ကေတများ ပြရန်"</string> <string name="other" msgid="429768510980739978">"အခြား"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"အကွက်ငယ်ကို ဖယ်ရှားရန်"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"အဆုံးတွင် အကွက်ငယ်ထည့်ရန်"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"အကွက်ငယ်ကို ရွှေ့ရန်"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"အကွက်ငယ်ကို ထည့်ရန်"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> သို့ ရွှေ့ရန်"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> အနေအထားသို့ ပေါင်းထည့်ရန်"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"နေရာ မမှန်ပါ။"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"အသုံးပြုသူရွေးရန်"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"အင်တာနက် မရှိပါ"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ဆက်တင်များကို ဖွင့်ပါ။"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ဆက်တင်များ၏ အစီအစဉ်ကို တည်းဖြတ်ပါ။"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ပါဝါမီနူး"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"စာမျက်နှာ <xliff:g id="ID_2">%2$d</xliff:g> အနက်မှ စာမျက်နှာ <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"လော့ခ်မျက်နှာပြင်"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ချိတ်ဆက်မှု မရှိပါ)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"ပြောင်း၍ မရပါ။ ပြန်စမ်းကြည့်ရန် တို့ပါ။"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"စက်တစ်ခုနှင့် ချိတ်ဆက်ရန်"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"အက်ပ်ဖွင့်ပြီး ဤစက်ရှင်ကို ကာစ်လုပ်နိုင်သည်။"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"အမည်မသိ အက်ပ်"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ကာစ် ရပ်ရန်"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"အသံအထွက်အတွက် ရရှိနိုင်သောစက်များ။"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ပင်မစာမျက်နှာသို့ သွားရန်"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"မကြာသေးမီကအက်ပ်များကို ကြည့်ရန်"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ပြီးပြီ"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"ထပ်စမ်းကြည့်ပါ။"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ပြန်သွားရန်"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"သင့်တာ့ချ်ပက်တွင် လက်သုံးချောင်းဖြင့် ဘယ် (သို့) ညာသို့ ပွတ်ဆွဲပါ"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"ကောင်းပါသည်။"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"နောက်သို့လက်ဟန် အပြီးသတ်လိုက်ပါပြီ"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"တာ့ချ်ပက်ပြန်သုံးရန် လက်သုံးချောင်းဖြင့် ဘယ်/ညာ ပွတ်ဆွဲပါ"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ပင်မစာမျက်နှာသို့ သွားရန်"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"တာ့ချ်ပက်ပေါ်တွင် လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"တော်ပါပေသည်။"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"ပင်မစာမျက်နှာသို့သွားသည့် လက်ဟန် အပြီးသတ်လိုက်ပါပြီ"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"ပင်မစာမျက်နှာသို့ သွားရန် တာ့ချ်ပက်တွင် လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"မကြာသေးမီကအက်ပ်များကို ကြည့်ခြင်း"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"သင့်တာ့ချ်ပက်တွင် လက်သုံးချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"တော်ပါပေသည်။"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"မကြာသေးမီကအက်ပ်များကို ကြည့်ခြင်းလက်ဟန် သင်ခန်းစာပြီးပါပြီ။"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"လတ်တလောအက်ပ်များကြည့်ရန် တာ့ချ်ပက်တွင် လက်သုံးချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"အက်ပ်အားလုံးကို ကြည့်ခြင်းလက်ဟန် သင်ခန်းစာပြီးပါပြီ"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"အက်ပ်အားလုံးကြည့်ရန် ကီးဘုတ်ပေါ်ရှိ လုပ်ဆောင်ချက်ကီးကို နှိပ်ပါ"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ရှင်းလင်းပို့ချချက် လှုပ်ရှားသက်ဝင်ပုံ၊ ခဏရပ်ပြီး ဆက်ဖွင့်ရန် နှိပ်ပါ။"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ကီးဘုတ်နောက်မီး"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"အဆင့် %2$d အနက် %1$d"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 9dd0f99397c4..ae135cc5f09c 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Vedvarende varsel for et skjermopptak"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Vil du ta opp skjermen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Ta opp én app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Ta opp hele skjermen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Ta opp hele skjermen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Når du tar opp hele skjermen, blir alt som vises på skjermen, tatt opp. Derfor bør du være forsiktig med for eksempel passord, betalingsopplysninger, meldinger, bilder, lyd og video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Når du tar opp en app, blir alt som vises eller spilles av i appen, tatt opp. Derfor bør du være forsiktig med for eksempel passord, betalingsopplysninger, meldinger, bilder, lyd og video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Ta opp skjermen"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Kunne ikke oppdatere forhåndsinnstillingen"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Forhåndsinnstilling"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Valgt"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Verktøy"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Direkteteksting"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Merknad"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Vis ikoner for varsler med lav prioritet"</string> <string name="other" msgid="429768510980739978">"Annet"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"fjerne infobrikken"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"legge til en infobrikke på slutten"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Flytt infobrikken"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Legg til en infobrikke"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Flytt til <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Legg til posisjonen <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posisjonen er ugyldig."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"velge en bruker"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Ingen internettilkobling"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Åpne <xliff:g id="ID_1">%s</xliff:g>-innstillingene."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Endre rekkefølgen på innstillingene."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Av/på-meny"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Side <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Låseskjerm"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(frakoblet)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Kan ikke bytte. Trykk for å prøve igjen."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Koble til en enhet"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"For å caste denne økten, åpne appen."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Ukjent app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stopp castingen"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Tilgjengelige enheter for lydutgang."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Ferdig"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Prøv på nytt."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Gå tilbake"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Sveip til venstre eller høyre med tre fingre på styreflaten"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bra!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Du har fullført bevegelsen for å gå tilbake."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"For å gå tilbake med styreflaten, sveip til venstre eller høyre med tre fingre"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Gå til startsiden"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Sveip opp med tre fingre på styreflaten"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bra jobbet!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Du har fullført bevegelsen for å gå til startskjermen"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Sveip opp med tre fingre på styreflaten for å gå til startskjermen"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se nylige apper"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Sveip opp og hold med tre fingre på styreflaten"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"For å se nylige apper, sveip opp og hold med tre fingre på styreflaten"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du har fullført bevegelsen for å se alle apper"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Trykk på handlingstasten på tastaturet for å se alle appene dine"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Veiledningsanimasjon. Klikk for å sette avspillingen på pause og gjenoppta den."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Bakgrunnslys for tastatur"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivå %1$d av %2$d"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 968fd518f068..c701ebc6b4fd 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -54,7 +54,7 @@ <string name="usb_debugging_always" msgid="4003121804294739548">"यो कम्प्युटरबाट सधैँ अनुमति दिनुहोस्"</string> <string name="usb_debugging_allow" msgid="1722643858015321328">"अनुमति दिनुहोस्"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB डिबग गर्न अनुमति छैन"</string> - <string name="usb_debugging_secondary_user_message" msgid="1888835696965417845">"हालैमा यस डिभाइसमा साइन इन भएका प्रयोगकर्ताले USB डिबगिङ सक्रिय गर्न सक्दैनन्। यो सुविधा प्रयोग गर्न कृपया खाताका एड्मिनका रूपमा साइन इन गर्नुहोस्।"</string> + <string name="usb_debugging_secondary_user_message" msgid="1888835696965417845">"हाल यस डिभाइसमा साइन इन भएका प्रयोगकर्ताले USB डिबगिङ सक्रिय गर्न सक्दैनन्। यो सुविधा प्रयोग गर्न कृपया खाताका एड्मिनका रूपमा साइन इन गर्नुहोस्।"</string> <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"तपाईं सिस्टमको भाषा बदलेर <xliff:g id="LANGUAGE">%1$s</xliff:g> बनाउन चाहनुहुन्छ?"</string> <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"अर्को डिभाइसले सिस्टमको भाषा परिवर्तन गर्न अनुरोध गरेको छ"</string> <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"भाषा परिवर्तन गर्नुहोस्"</string> @@ -65,7 +65,7 @@ <string name="wifi_debugging_always" msgid="2968383799517975155">"यस नेटवर्कमा सधैँ अनुमति दिनुहोस्"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"अनुमति दिनुहोस्"</string> <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"वायरलेस डिबगिङ सेवालाई अनुमति दिइएको छैन"</string> - <string name="wifi_debugging_secondary_user_message" msgid="9085779370142222881">"हालैमा यस डिभाइसमा साइन इन भएका प्रयोगकर्ताले USB डिबगिङ सक्रिय गर्न सक्दैनन्। यो सुविधा प्रयोग गर्न कृपया खाताका एड्मिनका रूपमा साइन इन गर्नुहोस्।"</string> + <string name="wifi_debugging_secondary_user_message" msgid="9085779370142222881">"हाल यस डिभाइसमा साइन इन भएका प्रयोगकर्ताले USB डिबगिङ अन गर्न सक्दैनन्। यो सुविधा प्रयोग गर्न कृपया खाताका एड्मिनका रूपमा साइन इन गर्नुहोस्।"</string> <string name="usb_contaminant_title" msgid="894052515034594113">"USB पोर्ट असक्षम पारियो"</string> <string name="usb_contaminant_message" msgid="7730476585174719805">"तपाईंको यन्त्रलाई तरल पदार्थ वा धुलोबाट जोगाउन यसको USB पोर्ट असक्षम पारिएको छ र यसले कुनै पनि सहायक उपकरणहरू पहिचान गर्ने छैन।\n\nउक्त USB पोर्ट फेरि प्रयोग गर्दा हुन्छ भने तपाईंलाई यसबारे सूचित गरिने छ।"</string> <string name="usb_port_enabled" msgid="531823867664717018">"चार्जर तथा सामानहरू पत्ता लगाउन सक्षम पारिएको USB पोर्ट"</string> @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"तपाईंको स्क्रिन रेकर्ड गर्ने हो?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"एउटा एप रेकर्ड गर्नुहोस्"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"पूरै स्क्रिन रेकर्ड गर्नुहोस्"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"सम्पूर्ण स्क्रिन रेकर्ड गर्नुहोस्: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"तपाईंले आफ्नो पूरै स्क्रिन रेकर्ड गरिरहेका बेला तपाईंको स्क्रिनमा देखाइने सबै सामग्री रेकर्ड गरिन्छ। त्यसैले पासवर्ड, भुक्तानीसम्बन्धी विवरण, म्यासेज, फोटो र अडियो तथा भिडियो जस्ता कुरा हेर्दा वा प्ले गर्दा सावधानी अपनाउनुहोला।"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"तपाईंले यो एप रेकर्ड गरिरहेका बेला यो एपमा देखाइने वा प्ले गरिने सबै सामग्री रेकर्ड गरिन्छ। त्यसैले पासवर्ड, भुक्तानीसम्बन्धी विवरण, म्यासेज, फोटो र अडियो तथा भिडियो जस्ता कुरा हेर्दा वा प्ले गर्दा सावधानी अपनाउनुहोला।"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"स्क्रिन रेकर्ड गर्नुहोस्"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"प्रिसेट अपडेट गर्न सकिएन"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"पूर्वनिर्धारित"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"चयन गरिएको छ"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"टुल"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"लाइभ क्याप्सन"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"नोट"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"कम प्राथमिकताका सूचना आइकनहरू देखाउनुहोस्"</string> <string name="other" msgid="429768510980739978">"अन्य"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"टाइल हटाउनुहोस्"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"टाइल अन्त्यमा हाल्नुहोस्"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"टाइल सार्नुहोस्"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"टाइल हाल्नुहोस्"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"टाइल सारेर <xliff:g id="POSITION">%1$d</xliff:g> मा लैजानुहोस्"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"टाइल यो अवस्था <xliff:g id="POSITION">%1$d</xliff:g> मा हाल्नुहोस्"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"पोजिसन अवैध छ।"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"प्रयोगकर्ता छान्नुहोस्"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"इन्टरनेट छैन"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> सम्बन्धी सेटिङहरूलाई खोल्नुहोस्।"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"सेटिङहरूको क्रमलाई सम्पादन गर्नुहोस्।"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पावर मेनु"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> मध्ये पृष्ठ <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"लक स्क्रिन"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(डिस्कनेक्ट गरिएको छ)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"बदल्न सकिएन। फेरि प्रयास गर्न ट्याप गर्नुहोस्।"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"कुनै डिभाइस कनेक्ट गर्नुहोस्"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"यो सत्र कास्ट गर्न चाहनुहुन्छ भने कृपया एप खोल्नुहोस्।"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"अज्ञात एप"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"कास्ट गर्न छाड्नुहोस्"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"अडियो आउटपुटका लागि उपलब्ध डिभाइसहरू।"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"होम स्क्रिनमा जानुहोस्"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"हालसालै चलाइएका एपहरू हेर्नुहोस्"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"सम्पन्न भयो"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"फेरि प्रयास गर्नुहोस्!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"पछाडि जानुहोस्"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"तीन वटा औँला प्रयोग गरी टचप्याडमा बायाँ वा दायाँतिर स्वाइप गर्नुहोस्"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"राम्रो!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"तपाईंले जेस्चर प्रयोग गरी पछाडि जाने तरिका सिक्नुभएको छ।"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"टचप्याड प्रयोग गरी पछाडि जान तीन औँला प्रयोग गरी बायाँ वा दायाँतिर स्वाइप गर्नुहोस्"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"होमपेजमा जानुहोस्"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"टचप्याडमा तीन वटा औँलाले माथितिर स्वाइप गर्नुहोस्"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"अद्भुत!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"तपाईंले \"होम स्क्रिनमा जानुहोस्\" नामक जेस्चर प्रयोग गर्ने तरिका सिक्नुभयो"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"होम स्क्रिनमा जान टचप्याडमा तीन औँलाले माथितिर स्वाइप गर्नुहोस्"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"हालसालै चलाइएका एपहरू हेर्नुहोस्"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"तीन वटा औँला प्रयोग गरी टचप्याडमा माथितिर स्वाइप गर्नुहोस् र होल्ड गर्नुहोस्"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"अद्भुत!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"तपाईंले जेस्चर प्रयोग गरी हालसालै चलाइएका एपहरू हेर्ने तरिका सिक्नुभएको छ।"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"हालसालैका एपहरू हेर्न तीन औँला प्रयोग गरी टचप्याडमा माथितिर स्वाइप गर्नुहोस् र होल्ड गर्नुहोस्"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"तपाईंले जेस्चर प्रयोग गरी सबै एपहरू हेर्ने तरिका सिक्नुभएको छ"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"आफ्ना सबै एपहरू हेर्न आफ्नो किबोर्डमा भएको एक्सन की थिच्नुहोस्"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ट्युटोरियलको एनिमेसन, पज वा सुचारु गर्न क्लिक गर्नुहोस्।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"किबोर्ड ब्याकलाइट"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d मध्ये %1$d औँ स्तर"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index adc157b31eb2..55b701e8dd03 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Doorlopende melding voor een schermopname-sessie"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Je scherm opnemen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Eén app opnemen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Hele scherm opnemen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Hele scherm opnemen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Als je je hele scherm opneemt, wordt alles opgenomen wat op je scherm wordt getoond. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Als je een app opneemt, wordt alles opgenomen wat wordt getoond of afgespeeld in die app. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Scherm opnemen"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Kan voorinstelling niet updaten"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Voorinstelling"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Geselecteerd"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Tools"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Live ondertiteling"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Notitie"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Iconen voor meldingen met lage prioriteit tonen"</string> <string name="other" msgid="429768510980739978">"Overig"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"tegel verwijderen"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"tegel toevoegen aan einde"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"tegel toevoegen op de laatste positie"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Tegel verplaatsen"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Tegel toevoegen"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Tegel toevoegen op gewenste positie"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Verplaatsen naar <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Toevoegen aan positie <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Positie ongeldig."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"gebruiker kiezen"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Geen internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g>-instellingen openen."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Volgorde van instellingen bewerken."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Volgorde van Snelle instellingen bewerken."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aan/uit-menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Vergrendelscherm"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(verbinding verbroken)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Kan niet schakelen. Tik om het opnieuw te proberen."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Apparaat koppelen"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Als je deze sessie wilt casten, open je de app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Onbekende app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Casten stoppen"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Beschikbare apparaten voor audio-uitvoer."</string> @@ -1468,32 +1483,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klaar"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Probeer het nog eens."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Terug"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Swipe met 3 vingers naar links of rechts op de touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Goed zo!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Je weet nu hoe je het gebaar voor terug maakt."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Als je met de touchpad wilt teruggaan, swipe je met 3 vingers naar links of rechts"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Naar startscherm"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Swipe met 3 vingers omhoog op de touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Goed gedaan!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Je weet nu hoe je het gebaar Naar startscherm maakt"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Swipe met 3 vingers omhoog op de touchpad om naar het startscherm te gaan"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Recente apps bekijken"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Swipe met 3 vingers omhoog en houd vast op de touchpad"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Je weet nu hoe je het gebaar Alle apps bekijken maakt"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Druk op de actietoets op je toetsenbord om al je apps te bekijken"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial-animatie, klik om het afspelen te onderbreken en te hervatten."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Achtergrondverlichting van toetsenbord"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveau %1$d van %2$d"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 12a13ff65968..1ac2170b8ae3 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"ଏକ ସ୍କ୍ରିନ୍ ରେକର୍ଡ୍ ସେସନ୍ ପାଇଁ ଚାଲୁଥିବା ବିଜ୍ଞପ୍ତି"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ରେକର୍ଡ କରିବେ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ଗୋଟିଏ ଆପ ରେକର୍ଡ କରନ୍ତୁ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"ସମ୍ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ ରେକର୍ଡ କରନ୍ତୁ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ସମ୍ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ରେକର୍ଡ କରନ୍ତୁ: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"ଆପଣ ଆପଣଙ୍କର ସମ୍ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ ରେକର୍ଡ କରିବା ସମୟରେ, ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା ସବୁକିଛି ରେକର୍ଡ ହୋଇଥାଏ। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"ଆପଣ ଏକ ଆପ ରେକର୍ଡ କରିବା ସମୟରେ, ସେହି ଆପରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛି ରେକର୍ଡ ହୋଇଥାଏ। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ସ୍କ୍ରିନ ରେକର୍ଡ କରନ୍ତୁ"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"ପ୍ରିସେଟକୁ ଅପଡେଟ କରାଯାଇପାରିଲା ନାହିଁ"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"ପ୍ରିସେଟ"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"ଚୟନ କରାଯାଇଛି"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ଟୁଲ"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"ଲାଇଭ କେପ୍ସନ"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"ନୋଟ"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"କମ୍-ଅଗ୍ରାଧିକାର ବିଜ୍ଞପ୍ତି ଆଇକନ୍ ଦେଖାନ୍ତୁ"</string> <string name="other" msgid="429768510980739978">"ଅନ୍ୟ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ଟାଇଲ୍ କାଢ଼ି ଦିଅନ୍ତୁ"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ଶେଷରେ ଟାଇଲ୍ ଯୋଗ କରନ୍ତୁ"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ଟାଇଲ୍ ମୁଭ୍ କରନ୍ତୁ"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ଟାଇଲ୍ ଯୋଗ କରନ୍ତୁ"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g>କୁ ମୁଭ୍ କରନ୍ତୁ"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> ଅବସ୍ଥିତିରେ ଯୋଗ କରନ୍ତୁ"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"ଅବସ୍ଥିତି ଅବୈଧ ଅଟେ।"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ୟୁଜର ବାଛନ୍ତୁ"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"କୌଣସି ଇଣ୍ଟରନେଟ୍ କନେକ୍ସନ୍ ନାହିଁ"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ସେଟିଂସର କ୍ରମ ଏଡିଟ କରନ୍ତୁ।"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ପାୱାର ମେନୁ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ପୃଷ୍ଠା <xliff:g id="ID_1">%1$d</xliff:g> ମୋଟ <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ଲକ ସ୍କ୍ରିନ"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ବିଚ୍ଛିନ୍ନ କରାଯାଇଛି)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"ସ୍ୱିଚ କରାଯାଇପାରିବ ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ଗୋଟିଏ ଡିଭାଇସ କନେକ୍ଟ କରନ୍ତୁ"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ଏହି ସେସନକୁ କାଷ୍ଟ କରିବା ପାଇଁ, ଦୟାକରି ଆପ ଖୋଲନ୍ତୁ।"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"ଅଜଣା ଆପ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"କାଷ୍ଟ କରିବା ବନ୍ଦ କରନ୍ତୁ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ଅଡିଓ ଆଉଟପୁଟ ପାଇଁ ଉପଲବ୍ଧ ଡିଭାଇସଗୁଡ଼ିକ।"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ହୋମକୁ ଯାଆନ୍ତୁ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରନ୍ତୁ"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ହୋଇଗଲା"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ପଛକୁ ଫେରନ୍ତୁ"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"ଆପଣଙ୍କ ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠି ବ୍ୟବହାର କରି ବାମ କିମ୍ବା ଡାହାଣକୁ ସ୍ୱାଇପ କରନ୍ତୁ"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"ବଢ଼ିଆ!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ଆପଣ \'ପଛକୁ ଫେରନ୍ତୁ\' ଜେଶ୍ଚର ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"ଆପଣଙ୍କ ଟଚପେଡକୁ ବ୍ୟବହାର କରି ପଛକୁ ଫେରିବା ପାଇଁ ତିନୋଟି ଆଙ୍ଗୁଠି ବ୍ୟବହାର କରି ବାମ କିମ୍ବା ଡାହାଣକୁ ସ୍ୱାଇପ କରନ୍ତୁ"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ହୋମକୁ ଯାଆନ୍ତୁ"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"ଆପଣଙ୍କ ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ କରନ୍ତୁ"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"ବଢ଼ିଆ କାମ!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"ଆପଣ \'ହୋମକୁ ଯାଆନ୍ତୁ\' ଜେଶ୍ଚର ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"ଆପଣଙ୍କର ହୋମ ସ୍କ୍ରିନକୁ ଯିବା ପାଇଁ ଆପଣଙ୍କ ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ କରନ୍ତୁ"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ବର୍ତ୍ତମାନର ଆପ୍ସକୁ ଭ୍ୟୁ କରନ୍ତୁ"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"ଆପଣଙ୍କ ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠିକୁ ବ୍ୟବହାର କରି ଉପରକୁ ସ୍ୱାଇପ କରି ଧରି ରଖନ୍ତୁ"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ବଢ଼ିଆ କାମ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ଆପଣ ବର୍ତ୍ତମାନର ଆପ୍ସ ଜେଶ୍ଚରକୁ ଭ୍ୟୁ କରିବା ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରିବାକୁ, ଆପଣଙ୍କ ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠି ବ୍ୟବହାର କରି ଉପରକୁ ସ୍ୱାଇପ କରି ଧରି ରଖନ୍ତୁ"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ଆପଣ ସମସ୍ତ ଆପ୍ସ ଜେଶ୍ଚରକୁ ଭ୍ୟୁ କରିବା ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"ଆପଣଙ୍କ ସମସ୍ତ ଆପ୍ସକୁ ଭ୍ୟୁ କରିବା ପାଇଁ ଆପଣଙ୍କର କୀବୋର୍ଡରେ ଆକ୍ସନ କୀ\'କୁ ଦବାନ୍ତୁ"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ଟ୍ୟୁଟୋରିଆଲ ଆନିମେସନ, ପ୍ଲେ କରିବା ବିରତ କରି ପୁଣି ଆରମ୍ଭ କରିବାକୁ କ୍ଲିକ କରନ୍ତୁ।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"କୀବୋର୍ଡ ବେକଲାଇଟ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dରୁ %1$d ନମ୍ବର ଲେଭେଲ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index feaae0eb50af..6eda17ad14b9 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"ਕਿਸੇ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਸੈਸ਼ਨ ਲਈ ਚੱਲ ਰਹੀ ਸੂਚਨਾ"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"ਕੀ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਨੂੰ ਰਿਕਾਰਡ ਕਰਨਾ ਹੈ?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ਇੱਕ ਐਪ ਨੂੰ ਰਿਕਾਰਡ ਕਰੋ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"ਪੂਰੀ ਸਕ੍ਰੀਨ ਨੂੰ ਰਿਕਾਰਡ ਕਰੋ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ਸਾਰੀ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਕਰੋ: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"ਜਦੋਂ ਤੁਸੀਂ ਆਪਣੀ ਪੂਰੀ ਸਕ੍ਰੀਨ ਨੂੰ ਰਿਕਾਰਡ ਕਰ ਰਹੇ ਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਾਈ ਜਾ ਰਹੀ ਹਰ ਚੀਜ਼ ਨੂੰ ਰਿਕਾਰਡ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਨਾਲ ਹੀ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਵਾਸਤੇ ਸਾਵਧਾਨ ਰਹੋ।"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਨੂੰ ਰਿਕਾਰਡ ਕਰ ਰਹੇ ਹੁੰਦੇ ਹੋ, ਤਾਂ ਉਸ ਐਪ ਵਿੱਚ ਦਿਖਾਈ ਜਾਂ ਚਲਾਈ ਜਾ ਰਹੀ ਹਰ ਚੀਜ਼ ਨੂੰ ਰਿਕਾਰਡ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਵਾਸਤੇ ਸਾਵਧਾਨ ਰਹੋ।"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਕਰੋ"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"ਪ੍ਰੀਸੈੱਟ ਨੂੰ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"ਪ੍ਰੀਸੈੱਟ"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"ਚੁਣਿਆ ਗਿਆ"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ਟੂਲ"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"ਲਾਈਵ ਸੁਰਖੀਆਂ"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"ਨੋਟ-ਕਥਨ"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"ਘੱਟ ਤਰਜੀਹ ਵਾਲੇ ਸੂਚਨਾ ਪ੍ਰਤੀਕਾਂ ਨੂੰ ਦਿਖਾਓ"</string> <string name="other" msgid="429768510980739978">"ਹੋਰ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ਟਾਇਲ ਹਟਾਓ"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ਟਾਇਲ ਨੂੰ ਅੰਤ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ਟਾਇਲ ਨੂੰ ਲਿਜਾਓ"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ਟਾਇਲ ਸ਼ਾਮਲ ਕਰੋ"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> \'ਤੇ ਲਿਜਾਓ"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> ਸਥਾਨ \'ਤੇ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"ਮੌਜੂਦਾ ਥਾਂ ਅਵੈਧ ਹੈ।"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ਵਰਤੋਂਕਾਰ ਚੁਣੋ"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ਇੰਟਰਨੈੱਟ ਨਹੀਂ।"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ।"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ਸੈਟਿੰਗਾਂ ਦੇ ਕ੍ਰਮ ਦਾ ਸੰਪਾਦਨ ਕਰੋ।"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ਪਾਵਰ ਮੀਨੂ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> ਦਾ <xliff:g id="ID_1">%1$d</xliff:g> ਪੰਨਾ"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">" ਲਾਕ ਸਕ੍ਰੀਨ"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ਡਿਸਕਨੈਕਟ ਹੈ)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਕਰੋ"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ਇਸ ਸੈਸ਼ਨ ਨੂੰ ਕਾਸਟ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਐਪ ਖੋਲ੍ਹੋ।"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"ਅਗਿਆਤ ਐਪ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ਕਾਸਟ ਕਰਨਾ ਬੰਦ ਕਰੋ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ਆਡੀਓ ਆਊਟਪੁੱਟ ਲਈ ਉਪਲਬਧ ਡੀਵਾਈਸ।"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ਹੋਮ \'ਤੇ ਜਾਓ"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ਹੋ ਗਿਆ"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ਵਾਪਸ ਜਾਓ"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"ਆਪਣੇ ਟੱਚਪੈਡ \'ਤੇ ਤਿੰਨ ਉਂਗਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਖੱਬੇ ਜਾਂ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"ਵਧੀਆ!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ਤੁਸੀਂ \'ਵਾਪਸ ਜਾਓ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ।"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"ਆਪਣੇ ਟੱਚਪੈਡ ਨੂੰ ਵਰਤ ਕੇ ਵਾਪਸ ਜਾਣ ਲਈ, ਤਿੰਨ ਉਂਗਲਾਂ ਵਰਤ ਕੇ ਖੱਬੇ ਜਾਂ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ਹੋਮ \'ਤੇ ਜਾਓ"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"ਆਪਣੇ ਟੱਚਪੈਡ \'ਤੇ ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"ਬਹੁਤ ਵਧੀਆ!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"ਤੁਸੀਂ \'ਹੋਮ \'ਤੇ ਜਾਓ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"ਆਪਣੀ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਜਾਣ ਲਈ ਆਪਣੇ ਟੱਚਪੈਡ \'ਤੇ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"ਆਪਣੇ ਟੱਚਪੈਡ \'ਤੇ ਤਿੰਨ ਉਂਗਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰ ਕੇ ਦਬਾਈ ਰੱਖੋ"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"ਬਹੁਤ ਵਧੀਆ!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ਤੁਸੀਂ \'ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ ਹੈ।"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖਣ ਲਈ, ਆਪਣੇ ਟੱਚਪੈਡ \'ਤੇ ਤਿੰਨ ਉਂਗਲਾਂ ਵਰਤ ਕੇ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਰੋਕ ਕੇ ਰੱਖੋ"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ਤੁਸੀਂ \'ਸਾਰੀਆਂ ਐਪਾਂ ਦੇਖੋ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ ਹੈ"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"ਆਪਣੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਦੇਖਣ ਲਈ ਆਪਣੇ ਕੀ-ਬੋਰਡ \'ਤੇ ਕਾਰਵਾਈ ਕੁੰਜੀ ਨੂੰ ਦਬਾਓ"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ਟਿਊਟੋਰੀਅਲ ਐਨੀਮੇਸ਼ਨ, ਰੋਕਣ ਅਤੇ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ।"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"ਕੀ-ਬੋਰਡ ਬੈਕਲਾਈਟ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d ਵਿੱਚੋਂ %1$d ਪੱਧਰ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index bd7496d128f2..82e3f67c2b9e 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Nagrywać ekran?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Nagrywaj jedną aplikację"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Nagrywaj cały ekran"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Nagraj cały ekran: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kiedy nagrywasz cały ekran, nagrane zostanie wszystko, co jest na nim widoczne. Dlatego uważaj na hasła, dane do płatności, wiadomości, zdjęcia, nagrania audio czy filmy."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kiedy nagrywasz aplikację, wszystko, co jest w niej wyświetlane lub odtwarzane, zostaje nagrane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Nagrywaj ekran"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Nie udało się zaktualizować gotowego ustawienia"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Gotowe ustawienie"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Wybrano"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Narzędzia"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Napisy na żywo"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Notatka"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Pokazuj ikony powiadomień o niskim priorytecie"</string> <string name="other" msgid="429768510980739978">"Inne"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"usunąć kartę"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"dodać kartę na końcu"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Przenieś kartę"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Dodaj kartę"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Przenieś do pozycji <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Dodaj w pozycji <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Nieprawidłowa pozycja."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"wybrać użytkownika"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Brak internetu"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otwórz ustawienia: <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edytuj kolejność ustawień."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu zasilania"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Strona <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ekran blokady"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(odłączono)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nie można przełączyć. Spróbuj ponownie."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Połącz urządzenie"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Aby przesłać tę sesję, otwórz aplikację."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nieznana aplikacja"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zatrzymaj przesyłanie"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostępne urządzenia do odtwarzania dźwięku."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gotowe"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Spróbuj jeszcze raz"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Wróć"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Przesuń 3 palcami w prawo lub w lewo na touchpadzie"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Super!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Gest przejścia wstecz został opanowany."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Aby przejść wstecz przy użyciu touchpada, przesuń trzema palcami w lewo lub w prawo"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Otwórz stronę główną"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Przesuń 3 palcami w górę na touchpadzie"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Dobra robota!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Gest przechodzenia na ekran główny został opanowany"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Aby przejść na ekran główny, przesuń 3 palcami w górę na touchpadzie"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Wyświetlanie ostatnich aplikacji"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Przesuń w górę za pomocą 3 palców na touchpadzie i przytrzymaj"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Znasz już gest wyświetlania wszystkich aplikacji"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Aby wyświetlić wszystkie swoje aplikacje, naciśnij klawisz działania na klawiaturze"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacja z samouczkiem. Kliknij, aby wstrzymać lub wznowić odtwarzanie."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podświetlenie klawiatury"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Poziom %1$d z %2$d"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index b2db1208f0f6..4ebc7ae6fbce 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Gravar a tela?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Gravar um app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Gravar a tela toda"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Gravar a tela toda: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Quando você grava a tela toda, tudo o que aparece nela é registrado. Portanto, tenha cuidado com senhas, detalhes de pagamento, mensagens, fotos, áudios e vídeos."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Quando você grava um app, todas as informações visíveis ou abertas nele ficam registradas. Portanto, tenha cuidado com senhas, detalhes de pagamento, mensagens, fotos, áudios e vídeos."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Gravar a tela"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Não foi possível atualizar a predefinição"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Predefinição"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selecionado"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Ferramentas"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Legenda instantânea"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Observação"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Mostrar ícones de notificações de baixa prioridade"</string> <string name="other" msgid="429768510980739978">"Outros"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"remover o bloco"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"adicionar o bloco ao final"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mover bloco"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Adicionar bloco"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Mover para <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Adicionar à posição <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posição inválida."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"escolher o usuário"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Sem Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir configurações de <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar ordem das configurações."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu liga/desliga"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Tela de bloqueio"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(sem conexão)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Não foi possível mudar. Toque para tentar novamente."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Conectar dispositivo"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Abra o app para transmitir esta sessão."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconhecido"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponíveis para saída de áudio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluído"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Tente de novo"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Deslize para a esquerda ou direita com 3 dedos no touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Legal!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Você concluiu o gesto para voltar."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Para voltar usando o touchpad, deslize para a esquerda ou direita com três dedos"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir para a página inicial"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Deslize para cima com 3 dedos no touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Muito bem!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Você concluiu o gesto para acessar a tela inicial"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Deslize para cima com três dedos no touchpad para acessar a tela inicial"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver os apps recentes"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Deslize para cima com 3 dedos e mantenha"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Você concluiu o gesto para ver todos os apps"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Pressione a tecla de ação no teclado para ver todos os apps"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animação do tutorial. Clique para pausar ou retomar a reprodução."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz de fundo do teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index dcc8f02e666c..2b49139074f4 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação persistente de uma sessão de gravação de ecrã"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Gravar o ecrã?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Gravar uma app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Gravar o ecrã inteiro"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Gravar o ecrã inteiro: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Quando está a gravar o ecrã inteiro, tudo o que é apresentado no ecrã é gravado. Por isso, tenha cuidado com, por exemplo, palavras-passe, detalhes de pagamento, mensagens, fotos, áudio e vídeo."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Quando está a gravar uma app, tudo o que é apresentado ou reproduzido nessa app é gravado. Por isso, tenha cuidado com, por exemplo, palavras-passe, detalhes de pagamento, mensagens, fotos, áudio e vídeo."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Gravar ecrã"</string> @@ -415,6 +417,13 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Não foi possível atualizar a predefinição"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Predefinição"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selecionado"</string> + <string name="hearing_devices_ambient_label" msgid="629440938614895797">"Ambiente"</string> + <string name="hearing_devices_ambient_control_left" msgid="3586965448230412600">"Esquerda"</string> + <string name="hearing_devices_ambient_control_right" msgid="6192137602448918383">"Direita"</string> + <string name="hearing_devices_ambient_expand_controls" msgid="2131816068187709200">"Expandir para controlos separados do lado direito e esquerdo"</string> + <string name="hearing_devices_ambient_collapse_controls" msgid="2261097656446201581">"Reduzir para controlo unificado"</string> + <string name="hearing_devices_ambient_mute" msgid="1836882837647429416">"Desativar som do ambiente"</string> + <string name="hearing_devices_ambient_unmute" msgid="2187938085943876814">"Reativar som do ambiente"</string> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Ferramentas"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Legendas instantâneas"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Nota"</string> @@ -960,9 +969,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Mostrar ícones de notificações de prioridade baixa"</string> <string name="other" msgid="429768510980739978">"Outro"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"remover o cartão"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"adicionar o cartão ao final"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"adicionar o mosaico à última posição"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mover cartão"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Adicionar cartão"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Adicionar mosaico à posição pretendida"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Mova para <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Adicione à posição <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posição inválida."</string> @@ -978,7 +987,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"escolher o utilizador"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Sem Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir as definições de <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar a ordem das definições."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Editar ordem das Definições rápidas."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu ligar/desligar"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ecrã de bloqueio"</string> @@ -1209,7 +1218,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(desligado)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Não é possível mudar. Toque para tentar novamente."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Ligar um dispositivo"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Para transmitir esta sessão, abra a app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconhecida"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponíveis para a saída de áudio."</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index b2db1208f0f6..4ebc7ae6fbce 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Gravar a tela?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Gravar um app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Gravar a tela toda"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Gravar a tela toda: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Quando você grava a tela toda, tudo o que aparece nela é registrado. Portanto, tenha cuidado com senhas, detalhes de pagamento, mensagens, fotos, áudios e vídeos."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Quando você grava um app, todas as informações visíveis ou abertas nele ficam registradas. Portanto, tenha cuidado com senhas, detalhes de pagamento, mensagens, fotos, áudios e vídeos."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Gravar a tela"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Não foi possível atualizar a predefinição"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Predefinição"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selecionado"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Ferramentas"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Legenda instantânea"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Observação"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Mostrar ícones de notificações de baixa prioridade"</string> <string name="other" msgid="429768510980739978">"Outros"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"remover o bloco"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"adicionar o bloco ao final"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mover bloco"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Adicionar bloco"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Mover para <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Adicionar à posição <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Posição inválida."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"escolher o usuário"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Sem Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir configurações de <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar ordem das configurações."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu liga/desliga"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Tela de bloqueio"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(sem conexão)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Não foi possível mudar. Toque para tentar novamente."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Conectar dispositivo"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Abra o app para transmitir esta sessão."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconhecido"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponíveis para saída de áudio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Concluído"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Tente de novo"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Voltar"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Deslize para a esquerda ou direita com 3 dedos no touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Legal!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Você concluiu o gesto para voltar."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Para voltar usando o touchpad, deslize para a esquerda ou direita com três dedos"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ir para a página inicial"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Deslize para cima com 3 dedos no touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Muito bem!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Você concluiu o gesto para acessar a tela inicial"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Deslize para cima com três dedos no touchpad para acessar a tela inicial"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ver os apps recentes"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Deslize para cima com 3 dedos e mantenha"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Você concluiu o gesto para ver todos os apps"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Pressione a tecla de ação no teclado para ver todos os apps"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animação do tutorial. Clique para pausar ou retomar a reprodução."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Luz de fundo do teclado"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nível %1$d de %2$d"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 7664145cc469..6f49a80537c0 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificare în curs pentru o sesiune de înregistrare a ecranului"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Înregistrezi ecranul?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Înregistrează o aplicație"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Înregistrează tot ecranul"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Înregistrează tot ecranul: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Când înregistrezi întregul ecran, se înregistrează tot ce apare pe ecran. Prin urmare, ai grijă cu parolele, detaliile de plată, mesajele, fotografiile și conținutul audio și video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Când înregistrezi o aplicație, se înregistrează tot ce se afișează sau se redă în aplicație. Prin urmare, ai grijă cu parolele, detaliile de plată, mesajele, fotografiile și conținutul audio și video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Înregistrează ecranul"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Nu s-a putut actualiza presetarea"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Presetare"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Selectat"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Instrumente"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Subtitrări live"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Notă"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Afișează pictogramele de notificare cu prioritate redusă"</string> <string name="other" msgid="429768510980739978">"Altele"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"elimină cardul"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"adaugă cardul la sfârșit"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Mută cardul"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Adaugă un card"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Mută pe poziția <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Adaugă pe poziția <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Poziție nevalidă."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"alege utilizatorul"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Fără conexiune la internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Deschide setările <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editează ordinea setărilor."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meniul de pornire"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> din <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ecran de blocare"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(deconectat)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nu se poate comuta. Atinge pentru a încerca din nou."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Conectează un dispozitiv"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Pentru a proiecta această sesiune, deschide aplicația."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplicație necunoscută"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Nu mai proiecta"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispozitive disponibile pentru ieșire audio."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Gata"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Încearcă din nou!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Înapoi"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Glisează la stânga sau la dreapta cu trei degete pe touchpad"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bravo!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ai finalizat gestul Înapoi."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Pentru a reveni folosind touchpadul, glisează la stânga sau la dreapta cu trei degete"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Înapoi la pagina de pornire"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Glisează în sus cu trei degete oriunde pe touchpad"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Excelent!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Ai finalizat gestul „înapoi la pagina de pornire”"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Glisează în sus cu trei degete pe touchpad pentru a accesa ecranul de pornire"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Vezi aplicațiile recente"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Glisează în sus și ține apăsat cu trei degete pe touchpad"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Ai finalizat gestul pentru afișarea tuturor aplicațiilor"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Apasă tasta de acțiuni de pe tastatură ca să vezi toate aplicațiile"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Tutorial animat, dă clic pentru a întrerupe și a relua redarea."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Iluminarea din spate a tastaturii"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivelul %1$d din %2$d"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 19ccb082a203..c534c7341992 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущее уведомление для записи видео с экрана"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Начать запись экрана?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Записывать одно приложение"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Записывать весь экран"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Записывать весь экран: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"На видео попадет все, что будет происходить на экране. Поэтому будьте осторожны с паролями, сведениями о способах оплаты, сообщениями, фотографиями, аудио- и видеозаписями."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"На видео попадет все, что происходит в выбранном приложении. Поэтому будьте осторожны с паролями, сведениями о способах оплаты, сообщениями, фотографиями, аудио- и видеозаписями."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Запись экрана"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Не удалось обновить набор настроек."</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Набор настроек"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Выбрано"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Инструменты"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Автоматические субтитры"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Заметка"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Показывать значки уведомлений с низким приоритетом"</string> <string name="other" msgid="429768510980739978">"Другое"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"удалить панель"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"добавить панель в конец"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Переместить панель"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Добавить панель"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Переместить на позицию <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Добавить на позицию <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Недопустимое расположение."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"выбрать пользователя"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Нет подключения к Интернету."</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Открыть настройки <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Изменить порядок быстрых настроек."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопки питания"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Страница <xliff:g id="ID_1">%1$d</xliff:g> из <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Заблокированный экран"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(нет подключения)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Не удается переключиться. Нажмите, чтобы повторить попытку."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Подключить устройство"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Чтобы начать трансляцию сеанса, откройте приложение"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Неизвестное приложение"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Остановить трансляцию"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Доступные устройства для вывода звука."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"На главный экран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Просмотр недавних приложений"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Попробуйте ещё раз"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Проведите тремя пальцами влево или вправо по сенсорной панели."</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Отлично!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Вы выполнили жест для перехода назад."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Чтобы перейти назад с помощью сенсорной панели, проведите влево или вправо тремя пальцами."</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"На главный экран"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Проведите тремя пальцами вверх по сенсорной панели."</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Отлично!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Вы выполнили жест для перехода на главный экран."</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Чтобы перейти на главный экран, проведите тремя пальцами вверх по сенсорной панели."</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Просмотр недавних приложений"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Проведите вверх по сенсорной панели тремя пальцами и удерживайте."</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Отлично!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Вы выполнили жест для просмотра недавних приложений."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Чтобы увидеть недавние приложения, проведите по сенсорной панели тремя пальцами вверх и удерживайте."</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Вы выполнили жест для просмотра всех приложений."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Чтобы увидеть все свои приложения, нажмите клавишу действия на клавиатуре."</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анимация в руководстве. Нажмите, чтобы приостановить или продолжить воспроизведение."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Подсветка клавиатуры"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Уровень %1$d из %2$d"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 516b2aeb9ce0..78331a0236fd 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"තිර පටිගත කිරීමේ සැසියක් සඳහා කෙරෙන දැනුම් දීම"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"ඔබේ තිරය පටිගත කරන්න ද?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"එක් යෙදුමක් පටිගත කරන්න"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"සම්පූර්ණ තිරය පටිගත කරන්න"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"සම්පූර්ණ තිරය පටිගත කරන්න: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"ඔබ ඔබේ සම්පූර්ණ තිරය පටිගත කරන විට, ඔබේ තිරයේ පෙන්වන ඕනෑම දෙයක් වාර්තා වේ. ඒ නිසා මුරපද, ගෙවීම් විස්තර, පණිවුඩ, ඡායාරූප, සහ ශ්රව්ය සහ දෘශ්ය වැනි දේවල් පිළිබඳ ප්රවේශම් වන්න."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"ඔබ යෙදුමක් පටිගත කරන විට, එම යෙදුමේ පෙන්වන හෝ වාදනය කරන ඕනෑම දෙයක් වාර්තා වේ. ඒ නිසා මුරපද, ගෙවීම් විස්තර, පණිවුඩ, ඡායාරූප, සහ ශ්රව්ය සහ දෘශ්ය වැනි දේවල් පිළිබඳ ප්රවේශම් වන්න."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"තිරය පටිගත කරන්න"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"පෙර සැකසීම යාවත්කාලීන කළ නොහැකි විය"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"පෙරසැකසුම"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"තෝරන ලදි"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"මෙවලම්"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"සජීවී සිරස්තල"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"සටහන"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"අඩු ප්රමුඛතා දැනුම්දීම් අයිකන පෙන්වන්න"</string> <string name="other" msgid="429768510980739978">"වෙනත්"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ටයිල් ඉවත් කරන්න"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"අගට ටයිල් එක් කරන්න"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ටයිල් ගෙන යන්න"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ටයිල් එක් කරන්න"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> වෙත ගෙන යන්න"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> ස්ථානයට එක් කරන්න"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"ස්ථානය අවලංගුයි."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"පරිශීලක තෝරන්න"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"අන්තර්ජාලය නැත"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> සැකසීම් විවෘත කරන්න."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"සැකසීම්වල අනුපිළිවෙළ සංංස්කරණය කරන්න."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"බල මෙනුව"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> න් <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"අගුලු තිරය"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(විසන්ධි විය)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"මාරු කිරීමට නොහැකිය. නැවත උත්සාහ කිරීමට තට්ටු කරන්න."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"උපාංගයක් සම්බන්ධ කරන්න"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"මෙම සැසිය විකාශය කිරීමට, කරුණාකර යෙදුම විවෘත කරන්න."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"නොදන්නා යෙදුම"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"විකාශය නවතන්න"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ශ්රව්ය ප්රතිදානය සඳහා තිබෙන උපාංග."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"මුල් පිටුවට යන්න"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"මෑත යෙදුම් බලන්න"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"නිමයි"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"නැවත උත්සාහ කරන්න!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"ආපස්සට යන්න"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"ඔබේ ස්පර්ශ පුවරුව මත ඇඟිලි තුනක් භාවිතයෙන් වමට හෝ දකුණට ස්වයිප් කරන්න"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"කදිමයි!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"ඔබ ආපසු යාමේ ඉංගිතය සම්පූර්ණ කරන ලදි."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"ඔබේ ස්පර්ශ පෑඩය භාවිතයෙන් ආපසු යාමට, ඇඟිලි තුනක් භාවිතයෙන් වමට හෝ දකුණට ස්වයිප් කරන්න"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"මුල් පිටුවට යන්න"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"ඔබේ ස්පර්ශ පුවරුවේ ඇඟිලි තුනකින් ඉහළට ස්වයිප් කරන්න"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"අනර්ඝ වැඩක්!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"ඔබ මුල් පිටුවට යාමේ ඉංගිතය සම්පූර්ණ කරන ලදි"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"ඔබේ මුල් තිරයට යාමට ඔබේ ස්පර්ශක පෑඩයේ ඇඟිලි තුනකින් ඉහළට ස්වයිප් කරන්න"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"මෑත යෙදුම් බලන්න"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"ඉහළට ස්වයිප් කර ඔබේ ස්පර්ශ පුවරුව මත ඇඟිලි තුනක් භාවිත කර රඳවාගෙන සිටින්න"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"අනර්ඝ වැඩක්!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ඔබ මෑත යෙදුම් ඉංගිත බැලීම සම්පූර්ණ කර ඇත."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"මෑත කාලීන යෙදුම් බැලීමට, ඔබේ ස්පර්ශක පෑඩයේ ඇඟිලි තුනක් භාවිතයෙන් ඉහළට ස්වයිප් කරගෙන සිටින්න"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"ඔබ සියලු යෙදුම් ඉංගිත බැලීම සම්පූර්ණ කර ඇත"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"ඔබේ සියලු යෙදුම් බැලීමට ඔබගේ යතුරු පුවරුවේ ක්රියා යතුර ඔබන්න"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"නිබන්ධන සජීවීකරණය, ක්රීඩාව විරාම කිරීමට සහ නැවත ආරම්භ කිරීමට ක්ලික් කරන්න."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"යතුරු පුවරු පසු ආලෝකය"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dන් %1$d වැනි මට්ටම"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 1b2dc5a22204..cf8972e72002 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Zobrazuje sa upozornenie týkajúce sa relácie záznamu obrazovky"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Chcete nahrávať obrazovku?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Nahrávať jednu aplikáciu"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Nahrávať celú obrazovku"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Nahrať celú obrazovku: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Pri nahrávaní celej obrazovky sa zaznamená všetko, čo sa na nej zobrazuje. Preto venujte pozornosť položkám, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Pri nahrávaní aplikácie sa zaznamená všetko, čo sa v nej zobrazuje alebo prehráva. Preto venujte pozornosť položkám, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Nahrávať obrazovku"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Predvoľbu sa nepodarilo aktualizovať"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Predvoľba"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Vybrané"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Nástroje"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Živý prepis"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Poznámka"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Zobraziť ikony upozornení s nízkou prioritou"</string> <string name="other" msgid="429768510980739978">"Ďalšie"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"odstrániť kartu"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"pridať kartu na koniec"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Presunúť kartu"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Pridať kartu"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Presunúť na <xliff:g id="POSITION">%1$d</xliff:g>. pozíciu"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Pridať na <xliff:g id="POSITION">%1$d</xliff:g>. pozíciu"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Pozícia je neplatná."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"vybrať používateľa"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Žiadny internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otvoriť nastavenia <xliff:g id="ID_1">%s</xliff:g>"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Upraviť poradie nastavení"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Ponuka vypínača"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Strana <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Uzamknutá obrazovka"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(odpojené)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nedá sa prepnúť. Zopakujte klepnutím."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Pripojiť zariadenie"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Ak chcete túto reláciu prenášať, otvorte aplikáciu."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Neznáma aplikácia"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zastaviť prenos"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupné zariadenia pre zvukový výstup."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Hotovo"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Skúste to znova."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Prejdenie späť"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Potiahnite troma prstami na touchpade doľava alebo doprava"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Výborne!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Použili ste gesto na prechod späť."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Ak chcete prejsť späť pomocou touchpadu, potiahnite troma prstami doľava alebo doprava"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Prechod na plochu"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Potiahnite troma prstami na touchpade nahor"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Skvelé!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Použili ste gesto na prechod na plochu."</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Ak chcete prejsť na plochu, potiahnite troma prstami na touchpade"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Zobrazenie nedávnych aplikácií"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Potiahnite troma prstami na touchpade nahor a pridržte"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Použili ste gesto na zobrazenie všetkých aplikácií."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Ak si chcete zobraziť všetky aplikácie, stlačte na klávesnici akčný kláves"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Výuková animácia, kliknutím pozastavíte alebo obnovíte prehrávanie."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Podsvietenie klávesnice"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. úroveň z %2$d"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 76ce78cb9c78..d0063fdf98d6 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Nenehno obveščanje o seji snemanja zaslona"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Želite posneti zaslon?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Snemanje ene aplikacije"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Snemanje celotnega zaslona"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Snemanje celotnega zaslona: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Pri snemanju celotnega zaslona se posname vse, kar je prikazano na zaslonu. Zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Pri snemanju aplikacije se posname vse, kar je prikazano ali predvajano v tej aplikaciji. Zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Snemanje zaslona"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Prednastavljenih vrednosti ni bilo mogoče posodobiti"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Prednastavljeno"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Izbrano"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Orodja"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Samodejni podnapisi"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Opomba"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Pokaži ikone obvestil z nizko stopnjo prednosti"</string> <string name="other" msgid="429768510980739978">"Drugo"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"odstranitev ploščice"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"dodajanje ploščice na konec"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Premik ploščice"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Dodajanje ploščice"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Premik na položaj <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Dodajanje na položaj <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Položaj je neveljaven."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"izbiro uporabnika"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Brez internetne povezave"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Odpri nastavitve za <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Uredi vrstni red nastavitev."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni za vklop/izklop"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. stran od <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Zaklenjen zaslon"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(povezava je prekinjena)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Preklop ni mogoč. Če želite poskusiti znova, se dotaknite."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Povežite napravo"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Če želite predvajati to sejo, odprite aplikacijo."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Neznana aplikacija"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Ustavi predvajanje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Razpoložljive naprave za zvočni izhod"</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Končano"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Poskusite znova"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Nazaj"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Na sledilni ploščici s tremi prsti povlecite levo ali desno"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Odlično!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Izvedli ste potezo za pomik nazaj."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Za pomik nazaj na sledilni ploščici povlecite v levo ali desno s tremi prsti"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Pomik na začetni zaslon"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Na sledilni ploščici s tremi prsti povlecite navzgor"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Odlično!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Izvedli ste potezo za pomik na začetni zaslon"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Za vrnitev na začetni zaslon povlecite s tremi prsti navzgor po sledilni ploščici"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Ogled nedavnih aplikacij"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Na sledilni ploščici s tremi prsti povlecite navzgor in pridržite"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Izvedli ste potezo za ogled vseh aplikacij"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Za ogled vseh aplikacij pritisnite tipko za dejanja na tipkovnici"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacija v vadnici, kliknite za začasno zaustavitev in nadaljevanje predvajanja."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Osvetlitev tipkovnice"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Stopnja %1$d od %2$d"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index dd13cff0e96b..803a5e558621 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Njoftim i vazhdueshëm për një seancë regjistrimi të ekranit"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Të regjistrohet ekrani?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Regjistro një aplikacion"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Regjistro të gjithë ekranin"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Regjistro gjithë ekranin: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kur regjistron të gjithë ekranin, regjistrohet çdo gjë e shfaqur në ekranin tënd. Prandaj, ki kujdes me gjërat si fjalëkalimet, detajet e pagesave, mesazhet, fotografitë, si dhe audion dhe videon."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kur regjistron një aplikacion, regjistrohet çdo gjë që shfaqet ose luhet në atë aplikacion. Prandaj, ki kujdes me gjërat si fjalëkalimet, detajet e pagesave, mesazhet, fotografitë, si dhe audion dhe videon."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Regjistro ekranin"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Paravendosja nuk mund të përditësohej"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Paravendosja"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Zgjedhur"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Veglat"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Titrat në çast"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Shënim"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Shfaq ikonat e njoftimeve me përparësi të ulët"</string> <string name="other" msgid="429768510980739978">"Të tjera"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"hiq pllakëzën"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"shto pllakëzën në fund"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Zhvendos pllakëzën"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Shto pllakëzën"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Zhvendos te <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Shto te pozicioni <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Pozicion i pavlefshëm."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"zgjidh përdoruesin"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Nuk ka internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Hap cilësimet e <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Modifiko rendin e cilësimeve."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menyja e energjisë"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Faqja <xliff:g id="ID_1">%1$d</xliff:g> nga <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ekrani i kyçjes"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(shkëputur)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Nuk mund të ndërrohet. Trokit për të provuar përsëri."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Lidh një pajisje"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Hap aplikacionin për të transmetuar këtë seancë."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplikacion i panjohur"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Ndalo transmetimin"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Pajisjet që ofrohen për daljen e audios."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"U krye"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Provo përsëri!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Kthehu prapa"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Rrëshqit shpejt majtas ose djathtas duke përdorur tre gishta në bllokun me prekje"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bukur!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"E ke përfunduar gjestin e kthimit prapa."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Për t\'u kthyer prapa duke përdorur bllokun me prekje, rrëshqit shpejt majtas ose djathtas duke përdorur tre gishta"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Shko tek ekrani bazë"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Rrëshqit shpejt lart me tre gishta në bllokun me prekje"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Punë e shkëlqyer!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"E ke përfunduar gjestin e kalimit tek ekrani bazë"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Rrëshqit shpejt lart me tre gishta në bllokun me prekje për të shkuar tek ekrani bazë"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Shiko aplikacionet e fundit"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Rrëshqit shpejt lart dhe mbaj shtypur me tre gishta në bllokun me prekje"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Përfundove gjestin për shikimin e të gjitha aplikacioneve"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Shtyp tastin e veprimit në tastierë për të shikuar të gjitha aplikacionet e tua"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animacioni udhëzues. Kliko për të vendosur në pauzë dhe për të vazhduar luajtjen."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Drita e sfondit e tastierës"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Niveli: %1$d nga %2$d"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 56939566c012..17870727a7e7 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Обавештење о сесији снимања екрана је активно"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Желите да снимите екран?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Сними једну апликацију"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Сними цео екран"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Снимите цео екран: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Када снимате цео екран, снима се све што је на њему. Зато пазите на лозинке, информације о плаћању, поруке, слике, аудио и видео садржај."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Када снимате апликацију, снима се сав садржај који се приказује или пушта у њој. Зато пазите на лозинке, информације о плаћању, поруке, слике, аудио и видео садржај."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Сними екран"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Ажурирање задатих подешавања није успело"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Унапред одређена подешавања"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Изабрано"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Алатке"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Титл уживо"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Белешка"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Прикажи иконе обавештења ниског приоритета"</string> <string name="other" msgid="429768510980739978">"Друго"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"уклонили плочицу"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"додали плочицу на крај"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Преместите плочицу"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Додајте плочицу"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Преместите на <xliff:g id="POSITION">%1$d</xliff:g>. позицију"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Додајте на <xliff:g id="POSITION">%1$d</xliff:g>. позицију"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Позиција је неважећа."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"одабрали корисника"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Нема интернета"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Отвори подешавања за <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Измени редослед подешавања."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Мени дугмета за укључивање"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. страна од <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Закључан екран"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(веза је прекинута)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Пребацивање није успело. Пробајте поново."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Повежите уређај"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Да бисте пребацивали ову сесију, отворите апликацију."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Непозната апликација"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Заустави пребацивање"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Доступни уређаји за аудио излаз."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Иди на почетни екран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Прикажи недавно коришћене апликације"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Пробајте поново."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Превуците улево или удесно са три прста на тачпеду"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Супер!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Довршили сте покрет за повратак."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Да бисте се вратили помоћу тачпеда, превуците улево или удесно са три прста"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Иди на почетни екран"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Превуците нагоре са три прста на тачпеду"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Одлично!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Довршили сте покрет за повратак на почетну страницу."</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Да бисте отишли на почетни екран, превуците нагоре са три прста на тачпеду"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Прикажи недавно коришћене апликације"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Превуците нагоре и задржите са три прста на тачпеду"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Одлично!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Довршили сте покрет за приказивање недавно коришћених апликација."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Да бисте прегледали недавне апликације, превуците нагоре и задржите са три прста на тачпеду"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Довршили сте покрет за приказивање свих апликација."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Притисните тастер радњи на тастатури да бисте прегледали све апликације"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Анимација водича, кликните да бисте паузирали и наставили репродукцију."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Позадинско осветљење тастатуре"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%1$d. ниво од %2$d"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 7d1f755c77e5..6d9f721fad37 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Avisering om att skärminspelning pågår"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Vill du spela in det som visas på skärmen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Spela in en app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Spela in hela skärmen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Spela in hela skärmen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"När du spelar in hela skärmen spelas allt som visas på skärmen in. Var försiktig med sådant som lösenord, betalningsuppgifter, meddelanden, foton, ljud och video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"När du spelar in en app spelas allt som visas eller spelas upp i appen in. Var försiktig med sådant som lösenord, betalningsuppgifter, meddelanden, foton, ljud och video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Spela in skärmen"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Det gick inte att uppdatera förinställningen"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Förinställning"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Markerad"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Verktyg"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Live Caption"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Anteckning"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Visa ikoner för aviseringar med låg prioritet"</string> <string name="other" msgid="429768510980739978">"Annat"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ta bort ruta"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"lägg till ruta i slutet"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"lägg till en ruta på den sista platsen"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Flytta ruta"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Lägg till ruta"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Lägg till en ruta på önskad plats"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Flytta till <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Lägg till på position <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Positionen är ogiltig."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"välj användare"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Inget internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Öppna <xliff:g id="ID_1">%s</xliff:g>-inställningarna."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Ändra ordning på inställningarna."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"Ändra ordningen på snabbinställningarna."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Startmeny"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Sida <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Låsskärm"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(frånkopplad)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Misslyckat byte. Tryck och försök igen."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Anslut en enhet"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Öppna appen om du vill casta den här sessionen."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Okänd app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Sluta casta"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Enheter som är tillgängliga för ljudutdata."</string> @@ -1468,32 +1483,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Klar"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Försök igen!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Tillbaka"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Svep åt vänster eller höger med tre fingrar på styrplattan"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Bra!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Du är klar med rörelsen för att gå tillbaka."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Svep åt vänster eller höger med tre fingrar på styrplattan för att gå tillbaka"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Återvänd till startskärmen"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Svep uppåt med tre fingrar på styrplattan"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Bra jobbat!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Du är klar med rörelsen för att öppna startskärmen"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Svep uppåt med tre fingrar på styrplattan för att öppna startskärmen"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Se de senaste apparna"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Svep uppåt med tre fingrar på styrplattan och håll kvar"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Du är klar med rörelsen för att se alla apparna."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Tryck på åtgärdstangenten på tangentbordet för att se alla dina appar"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Animation för guiden: Klicka för att pausa och återuppta uppspelningen."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Bakgrundsbelysning för tangentbord"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Nivå %1$d av %2$d"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index a17d6453e51e..6fb8f081e896 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Arifa inayoendelea ya kipindi cha kurekodi skrini"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Ungependa kurekodi skrini yako?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Rekodi programu moja"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Rekodi skrini nzima"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Rekodi skrini nzima: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Unaporekodi skrini yako nzima, chochote kinachoonyeshwa kwenye skrini yako kitarekodiwa. Kwa hivyo kuwa mwangalifu na vitu kama vile manenosiri, maelezo ya malipo, ujumbe, picha, sauti na video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Unaporekodi programu, chochote kinachoonyeshwa au kuchezwa kwenye programu hiyo kitarekodiwa. Kwa hivyo kuwa mwangalifu na vitu kama vile manenosiri, maelezo ya malipo, ujumbe, picha, sauti na video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Rekodi skrini"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Imeshindwa kusasisha mipangilio iliyowekwa mapema"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Mipangilio iliyowekwa mapema"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Umechagua"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Zana"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Manukuu Papo Hapo"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Dokezo"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Onyesha aikoni za arifa zisizo muhimu"</string> <string name="other" msgid="429768510980739978">"Nyingine"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ondoa kigae"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ongeza kigae mwishoni"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Hamisha kigae"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Ongeza kigae"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Hamishia kwenye <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Ongeza kwenye nafasi ya <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Nafasi si sahihi."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"chagua mtumiaji"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Hakuna intaneti"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Fungua mipangilio ya <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Badilisha orodha ya mipangilio."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menyu ya kuzima/kuwasha"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Ukurasa wa <xliff:g id="ID_1">%1$d</xliff:g> kati ya <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Skrini iliyofungwa"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(imetenganishwa)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Imeshindwa kubadilisha. Gusa ili ujaribu tena."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Unganisha kifaa"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Ili utume kipindi hiki, tafadhali fungua programu."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Programu isiyojulikana"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Acha kutuma"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Vifaa vya kutoa sauti vilivyopo"</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Nimemaliza"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Jaribu tena!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Rudi nyuma"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Telezesha vidole vitatu kushoto au kulia kwenye padi yako ya kugusa"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Safi!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Umekamilisha mafunzo ya miguso ya kurudi nyuma."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Ili uendelee kutumia padi yako ya kugusa, telezesha kushoto au kulia ukitumia vidole vitatu"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Nenda kwenye skrini ya kwanza"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Telezesha vidole vitatu juu kwenye padi yako ya kugusa"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Kazi nzuri!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Umeweka ishara ya kwenda kwenye skrini ya kwanza"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Telezesha vidole vitatu juu kwenye padi yako ya kugusa ili uende kwenye skrini yako ya kwanza"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Angalia programu za hivi majuzi"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Telezesha vidole vitatu juu kisha ushikilie kwenye padi yako ya kugusa"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Umekamilisha mafunzo ya mguso wa kuangalia programu zote"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Bonyeza kitufe cha vitendo kwenye kibodi yako ili uangalie programu zako zote"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Uhuishaji wa mafunzo, bofya ili usitishe na uendelee kucheza."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Mwanga chini ya kibodi"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Kiwango cha %1$d kati ya %2$d"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 3270e5efbf83..ead1f8330401 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"உங்கள் திரையை ரெக்கார்டு செய்யவா?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ஓர் ஆப்ஸை ரெக்கார்டு செய்தல்"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"முழுத் திரையை ரெக்கார்டு செய்தல்"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"முழுத் திரையை ரெக்கார்டு செய்தல்: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"முழுத் திரையை நீங்கள் ரெக்கார்டு செய்யும்போது அதில் காட்டப்படும் அனைத்தும் ரெக்கார்டு செய்யப்படும். எனவே கடவுச்சொற்கள், பேமெண்ட் விவரங்கள், மெசேஜ்கள், படங்கள், ஆடியோ, வீடியோ போன்றவை குறித்துக் கவனத்துடன் இருங்கள்."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"ஓர் ஆப்ஸை ரெக்கார்டு செய்யும்போது அதில் காட்டப்படும் அல்லது பிளே செய்யப்படும் அனைத்தும் ரெக்கார்டு செய்யப்படும். எனவே கடவுச்சொற்கள், பேமெண்ட் விவரங்கள், மெசேஜ்கள், படங்கள், ஆடியோ, வீடியோ போன்றவை குறித்துக் கவனத்துடன் இருங்கள்."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"திரையை ரெக்கார்டு செய்"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"முன்னமைவைப் புதுப்பிக்க முடியவில்லை"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"முன்னமைவு"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"தேர்ந்தெடுக்கப்பட்டது"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"கருவிகள்"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"உடனடி வசனம்"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"குறிப்பு"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"குறைந்த முன்னுரிமை உள்ள அறிவிப்பு ஐகான்களைக் காட்டு"</string> <string name="other" msgid="429768510980739978">"மற்றவை"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"கட்டத்தை அகற்றும்"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"கடைசியில் கட்டத்தைச் சேர்க்கும்"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"கட்டத்தை நகர்த்து"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"கட்டத்தைச் சேர்"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g>க்கு நகர்த்தும்"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g>ல் சேர்க்கும்"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"நிலை தவறானது."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"பயனரைத் தேர்வுசெய்யவும்"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"இணைய இணைப்பு இல்லை"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> அமைப்புகளைத் திற."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"அமைப்புகளின் வரிசை முறையைத் திருத்து."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"பவர் மெனு"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"பக்கம் <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"லாக் ஸ்கிரீன்"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(துண்டிக்கப்பட்டது)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"இணைக்க முடியவில்லை. மீண்டும் முயல தட்டவும்."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"சாதனத்தை இணை"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"இந்த அமர்வை அலைபரப்ப ஆப்ஸைத் திறங்கள்."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"அறியப்படாத ஆப்ஸ்"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"அலைபரப்புவதை நிறுத்து"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ஆடியோ அவுட்புட்டுக்குக் கிடைக்கும் சாதனங்கள்."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"முகப்பிற்குச் செல்"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"முடிந்தது"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"மீண்டும் முயலவும்!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"பின்செல்"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"உங்கள் டச்பேடில் மூன்று விரல்களால் இடது அல்லது வலதுபுறம் ஸ்வைப் செய்யவும்"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"அருமை!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"பின்செல்வதற்கான சைகையை நிறைவுசெய்துவிட்டீர்கள்."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"உங்கள் டச்பேடைப் பயன்படுத்திப் பின்செல்ல, மூன்று விரல்களால் இடது அல்லது வலதுபுறம் ஸ்வைப் செய்யவும்"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"முகப்பிற்குச் செல்"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"டச்பேடில் மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்யவும்"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"அருமை!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"முகப்புக்குச் செல்வதற்கான சைகைப் பயிற்சியை நிறைவுசெய்துவிட்டீர்கள்"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"உங்கள் முகப்புத் திரைக்குச் செல்ல டச்பேடில் மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்யவும்"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"உங்கள் டச்பேடில் மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"அருமை!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"சமீபத்தில் பயன்படுத்திய ஆப்ஸுக்கான சைகை பயிற்சியை நிறைவுசெய்துவிட்டீர்கள்."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"சமீபத்திய ஆப்ஸைப் பார்க்க, உங்கள் டச்பேடில் மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"அனைத்து ஆப்ஸையும் பார்ப்பதற்கான சைகை பயிற்சியை நிறைவுசெய்துவிட்டீர்கள்"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"உங்களின் அனைத்து ஆப்ஸையும் பார்க்க, உங்கள் கீபோர்டில் உள்ள ஆக்ஷன் பட்டனை அழுத்தவும்"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"பயிற்சி அனிமேஷன், இடைநிறுத்தவும் மீண்டும் இயக்கவும் கிளிக் செய்யலாம்."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"கீபோர்டு பேக்லைட்"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"நிலை, %2$d இல் %1$d"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index ea02e4f6439c..73a4250dd143 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"స్క్రీన్ రికార్డ్ సెషన్ కోసం ఆన్గోయింగ్ నోటిఫికేషన్"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"మీ స్క్రీన్ను రికార్డ్ చేయాలా?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ఒక యాప్ను రికార్డ్ చేయండి"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"ఫుల్ స్క్రీన్ను రికార్డ్ చేయండి"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"ఫుల్-స్క్రీన్ను రికార్డ్ చేయండి: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"మీ ఫుల్ స్క్రీన్ను మీరు రికార్డ్ చేసేటప్పుడు, మీ స్క్రీన్పై కనిపించేవన్నీ రికార్డ్ అవుతాయి. కాబట్టి పాస్వర్డ్లు, పేమెంట్ వివరాలు, మెసేజ్లు, ఫోటోలు, ఆడియో, ఇంకా వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"మీరు యాప్ను రికార్డ్ చేసేటప్పుడు, సంబంధిత యాప్లో కనిపించేవన్నీ లేదా ప్లే అయ్యేవన్నీ రికార్డ్ అవుతాయి. కాబట్టి పాస్వర్డ్లు, పేమెంట్ వివరాలు, మెసేజ్లు, ఫోటోలు, ఆడియో, ఇంకా వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"స్క్రీన్ను రికార్డ్ చేయండి"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"ప్రీసెట్ను అప్డేట్ చేయడం సాధ్యపడలేదు"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"ప్రీసెట్"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"ఎంచుకోబడింది"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"టూల్స్"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"లైవ్ క్యాప్షన్"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"గమనిక"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"తక్కువ ప్రాధాన్యత నోటిఫికేషన్ చిహ్నాలను చూపించు"</string> <string name="other" msgid="429768510980739978">"ఇతరం"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"టైల్ను తీసివేయండి"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ముగించడానికి టైల్ను జోడించండి"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"టైల్ను తరలించండి"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"టైల్ను జోడించండి"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g>కు తరలించండి"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> స్థానానికి జోడించండి"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"ప్రస్తుత పొజిషన్ చెల్లదు."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"యూజర్ను ఎంపిక చేయండి"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ఇంటర్నెట్ లేదు"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> సెట్టింగ్లను తెరవండి."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"సెట్టింగ్ల క్రమాన్ని ఎడిట్ చేయండి."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"పవర్ మెనూ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>లో <xliff:g id="ID_1">%1$d</xliff:g>వ పేజీ"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"లాక్ స్క్రీన్"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(డిస్కనెక్ట్ అయ్యింది)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"స్విచ్ చేయడం సాధ్యం కాదు. మళ్ళీ ట్రై చేయడానికి ట్యాప్ చేయండి."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"పరికరాన్ని కనెక్ట్ చేయండి"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"ఈ సెషన్ను ప్రసారం చేయడానికి, దయచేసి యాప్ను తెరవండి."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"తెలియని యాప్"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ప్రసారాన్ని ఆపివేయండి"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ఆడియో అవుట్పుట్ కోసం అందుబాటులో ఉన్న పరికరాలు."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"మొదటి ట్యాబ్కు వెళ్లండి"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"ఇటీవలి యాప్లను చూడండి"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"పూర్తయింది"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"మళ్లీ ట్రై చేయండి!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"వెనుకకు"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"మీ టచ్ప్యాడ్లో మూడు వేళ్లను ఉపయోగించి ఎడమ వైపునకు లేదా కుడి వైపునకు స్వైప్ చేయండి"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"సూపర్!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"తిరిగి వెనుకకు వెళ్ళడానికి ఉపయోగించే సంజ్ఞకు సంబంధించిన ట్యుటోరియల్ను మీరు పూర్తి చేశారు."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"మీ టచ్ప్యాడ్ను ఉపయోగించి తిరిగి వెనక్కి వెళ్లడానికి, మూడు వేళ్లను ఉపయోగించి ఎడమ వైపునకు లేదా కుడి వైపునకు స్వైప్ చేయండి"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"మొదటి ట్యాబ్కు వెళ్లండి"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"మీ టచ్ప్యాడ్పై మూడు వేళ్లతో పైకి స్వైప్ చేయండి"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"చక్కగా పూర్తి చేశారు!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"మీరు మొదటి స్క్రీన్కు వెళ్లే సంజ్ఞను పూర్తి చేశారు"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"మీ మొదటి స్క్రీన్కు వెళ్లడానికి మీ టచ్ప్యాడ్పై మూడు వేళ్లతో పైకి స్వైప్ చేయండి"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"ఇటీవలి యాప్లను చూడండి"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"మీ టచ్ప్యాడ్లో మూడు వేళ్లను ఉపయోగించి పైకి స్వైప్ చేసి, హోల్డ్ చేయండి"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"చక్కగా పూర్తి చేశారు!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"ఇటీవలి యాప్లను చూడడానికి ఉపయోగించే సంజ్ఞకు సంబంధించిన ట్యుటోరియల్ను మీరు పూర్తి చేశారు."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"ఇటీవలి యాప్లను చూడటానికి, మీ టచ్ప్యాడ్లో మూడు వేళ్లను ఉపయోగించి పైకి స్వైప్ చేసి, హోల్డ్ చేయండి"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"అన్ని యాప్లను చూడడానికి ఉపయోగించే సంజ్ఞకు సంబంధించిన ట్యుటోరియల్ను మీరు పూర్తి చేశారు"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"మీ యాప్లన్నింటినీ చూడటానికి మీ కీబోర్డ్లోని యాక్షన్ కీని నొక్కండి"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ట్యుటోరియల్ యానిమేషన్, పాజ్ చేసి, మళ్లీ ప్లే చేయడానికి క్లిక్ చేయండి."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"కీబోర్డ్ బ్యాక్లైట్"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$dలో %1$dవ స్థాయి"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index f8c432770e2d..c46a9d7c981c 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"บันทึกหน้าจอไหม"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"บันทึกแอปเดียว"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"บันทึกทั้งหน้าจอ"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"บันทึกทั้งหน้าจอ: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"ขณะบันทึกทั้งหน้าจอ ระบบจะบันทึกทุกสิ่งที่แสดงอยู่บนหน้าจอ ดังนั้นโปรดระวังสิ่งต่างๆ อย่างเช่นรหัสผ่าน รายละเอียดการชำระเงิน ข้อความ รูปภาพ รวมถึงเสียงและวิดีโอ"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"ขณะบันทึกแอป ระบบจะบันทึกทุกสิ่งที่แสดงหรือเล่นอยู่ในแอปดังกล่าว ดังนั้นโปรดระวังสิ่งต่างๆ อย่างเช่นรหัสผ่าน รายละเอียดการชำระเงิน ข้อความ รูปภาพ รวมถึงเสียงและวิดีโอ"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"บันทึกหน้าจอ"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"ไม่สามารถอัปเดตค่าที่กำหนดล่วงหน้า"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"ค่าที่กำหนดล่วงหน้า"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"เลือกแล้ว"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"เครื่องมือ"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"คำบรรยายสด"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"จดบันทึก"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"แสดงไอคอนการแจ้งเตือนลำดับความสำคัญต่ำ"</string> <string name="other" msgid="429768510980739978">"อื่นๆ"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"นำชิ้นส่วนออก"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"เพิ่มชิ้นส่วนต่อท้าย"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ย้ายชิ้นส่วน"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"เพิ่มชิ้นส่วน"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"ย้ายไปที่ <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"เพิ่มไปยังตำแหน่ง <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"ตำแหน่งไม่ถูกต้อง"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"เลือกผู้ใช้"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ไม่มีอินเทอร์เน็ต"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"เปิดการตั้งค่า <xliff:g id="ID_1">%s</xliff:g>"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"แก้ไขลำดับการตั้งค่า"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"เมนูเปิด/ปิด"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"หน้า <xliff:g id="ID_1">%1$d</xliff:g> จาก <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"หน้าจอล็อก"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(ยกเลิกการเชื่อมต่อแล้ว)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"เปลี่ยนไม่ได้ แตะเพื่อลองอีกครั้ง"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"เชื่อมต่ออุปกรณ์"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"โปรดเปิดแอปหากต้องการแคสต์เซสชันนี้"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"แอปที่ไม่รู้จัก"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"หยุดแคสต์"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"อุปกรณ์ที่พร้อมใช้งานสำหรับเอาต์พุตเสียง"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index c47da3289a82..6953458e2382 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Kasalukuyang notification para sa session ng pag-record ng screen"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"I-record ang iyong screen?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Mag-record ng isang app"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"I-record ang buong screen"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"I-record ang buong screen: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kapag nire-record mo ang iyong buong screen, nire-record ang anumang ipinapakita sa screen mo. Kaya mag-ingat sa mga bagay-bagay tulad ng mga password, detalye ng pagbabayad, mensahe, larawan, at audio at video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kapag nagre-record ka ng app, nire-record ang anumang ipinapakita o pine-play sa app na iyon. Kaya mag-ingat sa mga bagay-bagay tulad ng mga password, detalye ng pagbabayad, mensahe, larawan, at audio at video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"I-record ang screen"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Hindi ma-update ang preset"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Preset"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Napili"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Mga Tool"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Instant Caption"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Tala"</string> @@ -960,9 +976,9 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Ipakita ang mga icon ng notification na may mababang priority"</string> <string name="other" msgid="429768510980739978">"Iba pa"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"alisin ang tile"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"idagdag ang tile sa dulo"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="8311378984458545661">"magdagdag ng tile sa huling posisyon"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Ilipat ang tile"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Magdagdag ng tile"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="8141710006899065161">"Magdagdag ng tile sa gustong posisyon"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Ilipat sa <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Idagdag sa posisyong <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Invalid ang posisyon."</string> @@ -978,7 +994,7 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"pumili ng user"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Walang internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Buksan ang mga setting ng <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"I-edit ang pagkakasunud-sunod ng mga setting."</string> + <string name="accessibility_quick_settings_edit" msgid="6544873823850165">"I-edit ang pagkakasunod-sunod ng Mga Mabilisang Setting."</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> ng <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> @@ -1209,7 +1225,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(nadiskonekta)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Hindi makalipat. I-tap para subukan ulit."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Magkonekta ng device"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Para ma-cast ang session na ito, buksan ang app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Hindi kilalang app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Ihinto ang pag-cast"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Mga available na device para sa audio output."</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 2a3c44268922..441cec1d18dd 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekran kaydı oturumu için devam eden bildirim"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Ekranınız kaydedilsin mi?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Bir uygulamayı kaydet"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Tüm ekranı kaydet"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Tüm ekranı kaydet: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Ekranın tamamını kaydederken ekranınızda gösterilen her şey kaydedilir. Bu nedenle şifre, ödeme ayrıntıları, mesaj, fotoğraf, ses ve video gibi öğeler konusunda dikkatli olun."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Bir uygulamayı kaydettiğinizde o uygulamada gösterilen veya oynatılan her şey kaydedilir. Bu nedenle şifre, ödeme ayrıntıları, mesaj, fotoğraf, ses ve video gibi öğeler konusunda dikkatli olun."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Ekranı kaydet"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Hazır ayar güncellenemedi"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Hazır Ayar"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Seçili"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Araçlar"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Canlı Altyazı"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Not"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Düşük öncelikli bildirim simgelerini göster"</string> <string name="other" msgid="429768510980739978">"Diğer"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"Kutuyu kaldırmak için"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"Sona kutu eklemek için"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Kutuyu taşı"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Kutu ekle"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> konumuna taşı"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"<xliff:g id="POSITION">%1$d</xliff:g> konumuna ekle"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Konum geçersiz."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"kullanıcı seç"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"İnternet yok"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ayarlarını aç."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Ayarların sırasını düzenle."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Güç menüsü"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Sayfa <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Kilit ekranı"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(bağlantı kesildi)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Geçiş yapılamıyor. Tekrar denemek için dokunun."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Cihaz bağla"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Bu oturumu yayınlamak için lütfen uygulamayı açın."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Bilinmeyen uygulama"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Yayını durdur"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Ses çıkışı için kullanılabilir cihazlar."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Bitti"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Tekrar deneyin."</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Geri dön"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Dokunmatik alanda üç parmağınızla sola veya sağa kaydırın"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Güzel!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Geri dön hareketini tamamladınız."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Dokunmatik alanı kullanarak geri dönmek için üç parmağınızla sola veya sağa kaydırın"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Ana sayfaya gidin"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Dokunmatik alanda üç parmağınızla yukarı kaydırın"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Tebrikler!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Ana ekrana git hareketini tamamladınız"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Ana ekranınıza gitmek için dokunmatik alanda üç parmağınızla yukarı kaydırın"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Son uygulamaları görüntüle"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Dokunmatik alanda üç parmağınızla yukarı doğru kaydırıp basılı tutun"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Tüm uygulamaları görüntüleme hareketini tamamladınız"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Tüm uygulamalarınızı görüntülemek için klavyenizdeki eylem tuşuna basın"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Eğitim animasyonu, oynatmayı duraklatmak ve sürdürmek için tıklayın."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klavye aydınlatması"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Seviye %1$d / %2$d"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 68129a84c349..af70c6fa39f0 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Сповіщення про сеанс запису екрана"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Записати відео з екрана?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Записувати один додаток"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Записувати весь екран"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Записувати весь вміст екрана: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Коли ви записуєте вміст усього екрана, на відео потрапляє все, що на ньому відображається. Тому будьте уважні з паролями, повідомленнями, фотографіями, аудіо, відео, платіжною інформацією тощо."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Коли ви записуєте додаток, на відео потрапляє все, що відображається або відтворюється в ньому. Тому будьте уважні з паролями, повідомленнями, фотографіями, аудіо, відео, платіжною інформацією тощо."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Записувати вміст екрана"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Не вдалось оновити набір налаштувань"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Набір налаштувань"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Вибрано"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Інструменти"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Живі субтитри"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Нотатка"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Показувати значки сповіщень із низьким пріоритетом"</string> <string name="other" msgid="429768510980739978">"Інше"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"вилучити опцію"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"додати опцію в кінець"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Перемістити опцію"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Додати панель"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Перемістити на позицію <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Додати на позицію <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Позиція недійсна."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"вибрати користувача"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Немає Інтернету"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Відкрити налаштування <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Змінити порядок налаштувань."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопки живлення"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Сторінка <xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Заблокований екран"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(від’єднано)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Не вдалося змінити підключення. Натисніть, щоб повторити спробу."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Під’єднати пристрій"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Щоб транслювати цей сеанс, відкрийте додаток."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Невідомий додаток"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Припинити трансляцію"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Доступні пристрої для відтворення звуку."</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"Перейти на головний екран"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"Переглянути нещодавні додатки"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Готово"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Спробуйте ще"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Назад"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Проведіть трьома пальцями вліво чи вправо по сенсорній панелі"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Чудово!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ви виконали жест \"Назад\"."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Щоб повернутися за допомогою сенсорної панелі, проведіть трьома пальцями вліво чи вправо"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Перейти на головний екран"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Проведіть трьома пальцями вгору на сенсорній панелі"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Чудово!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Ви виконали жест переходу на головний екран"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Щоб перейти на головний екран, проведіть трьома пальцями вгору на сенсорній панелі"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Переглянути нещодавні додатки"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Проведіть трьома пальцями вгору й утримуйте їх на сенсорній панелі"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"Чудово!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"Ви виконали жест для перегляду нещодавно відкритих додатків."</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"Щоб переглянути останні додатки, проведіть трьома пальцями вгору й утримуйте їх на сенсорній панелі"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Ви виконали жест для перегляду всіх додатків"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Щоб переглянути всі додатки, натисніть клавішу дії на клавіатурі"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Навчальна анімація. Натисніть, щоб призупинити або відновити відтворення."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Підсвічування клавіатури"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Рівень %1$d з %2$d"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 63213da49ebe..28aa1bb36c8b 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"اسکرین ریکارڈ سیشن کیلئے جاری اطلاع"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"آپ کی اسکرین ریکارڈ کریں؟"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"ایک ایپ ریکارڈ کریں"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"پوری اسکرین کو ریکارڈ کریں"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"پوری اسکرین ریکارڈ کریں: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"جب آپ اپنی پوری اسکرین کو ریکارڈ کر رہے ہوتے ہیں تو آپ کی اسکرین پر دکھائی گئی ہر چیز ریکارڈ کی جاتی ہے۔ لہذا، پاس ورڈز، ادائیگی کی تفصیلات، پیغامات، تصاویر، ساتھ ہی آڈیو اور ویڈیو جیسی چیزوں کے سلسلے میں محتاط رہیں۔"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"جب آپ کسی ایپ کو ریکارڈ کر رہے ہوتے ہیں تو اس ایپ میں دکھائی گئی یا چلائی گئی ہر چیز ریکارڈ کی جاتی ہے۔ لہذا، پاس ورڈز، ادائیگی کی تفصیلات، پیغامات، تصاویر، ساتھ ہی آڈیو اور ویڈیو جیسی چیزوں کے سلسلے میں محتاط رہیں۔"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"اسکرین ریکارڈ کریں"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"پہلے سے ترتیب شدہ کو اپ ڈیٹ نہیں کیا جا سکا"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"پہلے سے ترتیب شدہ"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"منتخب کردہ"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"ٹولز"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"لائیو کیپشن"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"نوٹ"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"کم ترجیحی اطلاع کے آئیکنز دکھائیں"</string> <string name="other" msgid="429768510980739978">"دیگر"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"ٹائل ہٹائیں"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"ختم کرنے کے لیے ٹائل شامل کریں"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"ٹائل منتقل کریں"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"ٹائل شامل کریں"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"<xliff:g id="POSITION">%1$d</xliff:g> میں منتقل کریں"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"پوزیشن <xliff:g id="POSITION">%1$d</xliff:g> میں شامل کریں"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"پوزیشن غلط ہے۔"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"صارف منتخب کریں"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"انٹرنیٹ نہیں ہے"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ترتیبات کھولیں۔"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ترتیبات کی ترتیب میں ترمیم کریں۔"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"پاور مینیو"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"صفحہ <xliff:g id="ID_1">%1$d</xliff:g> از <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"مقفل اسکرین"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(غیر منسلک ہے)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"سوئچ نہیں کر سکتے۔ دوبارہ کوشش کرنے کے لیے تھپتھپائیں۔"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"آلہ منسلک کریں"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"اس سیشن کو کاسٹ کرنے کیلئے، براہ کرم ایپ کھولیں۔"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"نامعلوم ایپ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"کاسٹ کرنا بند کریں"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"آڈیو آؤٹ پٹ کے لیے دستیاب آلات۔"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"ہوم پر جائیں"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"حالیہ ایپس دیکھیں"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"ہو گیا"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"دوبارہ کوشش کریں!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"واپس جائیں"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"اپنے ٹچ پیڈ پر تین انگلیوں کا استعمال کرتے ہوئے دائیں یا بائیں طرف سوائپ کریں"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"عمدہ!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"آپ نے واپس جائیں اشارے کو مکمل کر لیا۔"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"اپنے ٹچ پیڈ کا استعمال کرتے ہوئے واپس جانے کے لیے، تین انگلیوں کی مدد سے دائیں یا بائیں سوائپ کریں"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"ہوم پر جائیں"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"اپنے ٹچ پیڈ پر تین انگلیوں کی مدد سے اوپر کی طرف سوائپ کریں"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"بہترین!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"آپ نے ہوم پر جانے کا اشارہ مکمل کر لیا"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"اپنی ہوم اسکرین پر جانے کے لیے اپنے ٹچ پیڈ پر تین انگلیوں کی مدد سے اوپر کی طرف سوائپ کریں"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"حالیہ ایپس دیکھیں"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"اپنے ٹچ پیڈ پر تین انگلیوں کا استعمال کرتے ہوئے اوپر کی طرف سوائپ کریں اور دبائے رکھیں"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"بہترین!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"آپ نے حالیہ ایپس دیکھیں کا اشارہ مکمل کر لیا ہے۔"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"حالیہ ایپس دیکھنے کے لیے، اپنے ٹچ پیڈ پر تین انگلیوں کی مدد سے اوپر کی طرف سوائپ کریں اور دبائے رکھیں"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"آپ نے سبھی ایپس دیکھیں کا اشارہ مکمل کر لیا ہے"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"اپنی سبھی ایپس دیکھنے کے لیے اپنے کی بورڈ پر ایکشن کلید کو دبائیں"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"ٹیوٹوریل اینیمیشن، روکنے کے لیے کلک کریں اور چلانا دوبارہ شروع کریں۔"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"کی بورڈ بیک لائٹ"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"%2$d میں سے %1$d کا لیول"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 488852f525d2..394a6e462754 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekrandan yozib olish seansi uchun joriy bildirishnoma"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Ekran yozib olinsinmi?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Bitta ilovani yozib olish"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Butun ekranni yozib olish"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Butun ekranni yozib olish: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Butun ekranni yozib olishda ekranda koʻrsatilgan barcha axborotlar yozib olinadi. Shu sababli parollar, toʻlov tafsilotlari, xabarlar, suratlar, audio va video chiqmasligi uchun ehtiyot boʻling."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Ilovani yozib olishda ilovada koʻrsatilgan yoki ijro etilgan barcha axborotlar yozib olinadi. Shu sababli parollar, toʻlov tafsilotlari, xabarlar, suratlar, audio va video chiqmasligi uchun ehtiyot boʻling."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Ekranni yozib olish"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Andoza yangilanmadi"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Andoza"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Tanlangan"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Vositalar"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Jonli izoh"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Qayd"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Muhim boʻlmagan bildirishnoma ikonkalarini koʻrsatish"</string> <string name="other" msgid="429768510980739978">"Boshqa"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"katakchani olib tashlash"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"oxiriga katakcha kiritish"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Katakchani boshqa joyga olish"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Katakcha kiritish"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Bu joyga olish: <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Bu joyga kiritish: <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Pozitsiya yaroqsiz."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"foydalanuvchini tanlash"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Internetga ulanmagansiz"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> sozlamalarini ochish."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Sozlamalar tartibini o‘zgartirish."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Quvvat menyusi"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>-sahifa, jami: <xliff:g id="ID_2">%2$d</xliff:g> ta sahifa"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ekran qulfi"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(uzildi)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Xatolik. Qayta urinish uchun bosing."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Qurilma ulash"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Bu seansni translatsiya qilish uchun ilovani oching."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Notanish ilova"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Toʻxtatish"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio chiqish uchun mavjud qurilmalar."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Tayyor"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Qayta urining!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Orqaga qaytish"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Sensorli panelda uchta barmoq bilan chapga yoki oʻngga suring"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Yaxshi!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ortga qaytish ishorasi darsini tamomladingiz."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Sensorli panel yordamida orqaga qaytish uchun uchta barmoq bilan chapga yoki oʻngga suring"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Boshiga qaytish"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Sensorli panelda uchta barmoq bilan tepaga suring"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Barakalla!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Bosh ekranni ochish ishorasi darsini tamomladingiz"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Asosiy ekraningizga oʻtish uchun sensorli panelda uchta barmoq bilan suring"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Oxirgi ilovalarni koʻrish"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Sensorli panelda uchta barmoq bilan tepaga surib, bosib turing"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Hamma ilovalarni koʻrish ishorasini tugalladingiz"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Barcha ilovalaringizni koʻrish uchun klaviaturangizda amal tugmasini bosing"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Qoʻllanma animatsiyasi, pauza qilish va ijroni davom ettirish uchun bosing."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Klaviatura orqa yoritkichi"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Daraja: %1$d / %2$d"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 1b505d3d4426..81ac5e70a7e2 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Thông báo đang diễn ra về phiên ghi màn hình"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Ghi màn hình?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Ghi một ứng dụng"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Ghi toàn màn hình"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Ghi toàn bộ màn hình: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Khi bạn ghi toàn màn hình, mọi nội dung trên màn hình của bạn đều được ghi. Vì vậy, hãy thận trọng để không làm lộ thông tin như mật khẩu, thông tin thanh toán, tin nhắn, ảnh, âm thanh và video."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Khi bạn ghi một ứng dụng, mọi nội dung xuất hiện hoặc phát trong ứng dụng đó sẽ đều được ghi. Vì vậy, hãy thận trọng để không làm lộ thông tin như mật khẩu, thông tin thanh toán, tin nhắn, ảnh, âm thanh và video."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Ghi màn hình"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Không cập nhật được giá trị đặt trước"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Chế độ đặt sẵn"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Đã chọn"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Công cụ"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Phụ đề trực tiếp"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Ghi chú"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Hiển thị biểu tượng thông báo có mức ưu tiên thấp"</string> <string name="other" msgid="429768510980739978">"Khác"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"xóa ô"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"thêm ô vào cuối"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Di chuyển ô"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Thêm ô"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Di chuyển tới <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Thêm vào vị trí <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Vị trí không hợp lệ."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"chọn người dùng"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Không có Internet"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Mở cài đặt <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Chỉnh sửa thứ tự cài đặt."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Trình đơn nguồn"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Trang <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Màn hình khóa"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(đã ngắt kết nối)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Không thể chuyển đổi. Hãy nhấn để thử lại."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Kết nối thiết bị"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Vui lòng mở ứng dụng để truyền phiên này."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Ứng dụng không xác định"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Dừng truyền"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Các thiết bị có sẵn để xuất âm thanh."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Xong"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <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> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Dùng 3 ngón tay vuốt sang trái hoặc sang phải trên bàn di chuột"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Tuyệt vời!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Bạn đã thực hiện xong cử chỉ quay lại."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Để quay lại bằng bàn di chuột, hãy dùng 3 ngón tay vuốt sang trái hoặc sang phải"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Chuyển đến màn hình chính"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Dùng 3 ngón tay vuốt lên trên bàn di chuột"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Tuyệt vời!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Bạn đã thực hiện xong cử chỉ chuyển đến màn hình chính"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Dùng 3 ngón tay vuốt lên trên bàn di chuột để chuyển đến màn hình chính"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Xem các ứng dụng gần đây"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Dùng 3 ngón tay vuốt lên và giữ trên bàn di chuột"</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Bạn đã hoàn tất cử chỉ xem tất cả các ứng dụng"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Nhấn phím hành động trên bàn phím để xem mọi ứng dụng của bạn"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Ảnh động trong phần hướng dẫn, nhấp để tạm dừng và tiếp tục phát."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Đèn nền bàn phím"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Độ sáng %1$d/%2$d"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 8d6ec77ae5a8..1649b3a02428 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"持续显示屏幕录制会话通知"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"要录制屏幕吗?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"录制单个应用"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"录制整个屏幕"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"全屏录制:%s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"录制整个屏幕时,屏幕上显示的所有内容均会被录制。因此,请务必小心操作,谨防泄露密码、付款详情、消息、照片、音频、视频等敏感信息。"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"录制单个应用时,该应用中显示或播放的所有内容均会被录制。因此,请务必小心操作,谨防泄露密码、付款信息、消息、照片、音频、视频等。"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"录制屏幕"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"无法更新预设"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"预设"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"已选择"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"工具"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"实时字幕"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"记事"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"显示低优先级的通知图标"</string> <string name="other" msgid="429768510980739978">"其他"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"移除功能块"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"将功能块添加到末尾"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"移动功能块"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"添加功能块"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"移至 <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"添加到位置 <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"位置无效。"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"选择用户"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"未连接到互联网"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"打开<xliff:g id="ID_1">%s</xliff:g>设置。"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"修改设置顺序。"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"电源菜单"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"第 <xliff:g id="ID_1">%1$d</xliff:g> 页,共 <xliff:g id="ID_2">%2$d</xliff:g> 页"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"锁定屏幕"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(已断开连接)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"无法切换。点按即可重试。"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"连接设备"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"如需投放此会话,请打开相关应用。"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"未知应用"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"停止投放"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"音频输出的可用设备。"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"前往主屏幕"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近用过的应用"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"再试一次!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"在触控板上用三根手指向左或向右滑动"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"太棒了!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"您已完成“返回”手势教程。"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"如需使用触控板返回,请用三根手指向左或向右滑动"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"前往主屏幕"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"在触控板上用三根手指向上滑动"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"太棒了!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"您已完成“前往主屏幕”手势"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"在触控板上用三根手指向上滑动,即可前往主屏幕"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近用过的应用"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"在触控板上用三根手指向上滑动并按住"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"您已完成“查看最近用过的应用”的手势教程。"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"如需查看最近用过的应用,请用三根手指在触控板上向上滑动并按住"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"您已完成“查看所有应用”手势教程"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"按下键盘上的快捷操作按键即可查看所有应用"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"教程动画,点击可暂停和继续播放。"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"键盘背光"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 级,共 %2$d 级"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index b1df372dd26b..29e9712f6878 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示錄影畫面工作階段通知"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"要錄影螢幕畫面嗎?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"錄影一個應用程式"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"錄影整個螢幕畫面"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"錄製整個螢幕:%s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"當你錄影整個螢幕畫面時,系統會錄影螢幕畫面上顯示的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片、音訊和影片等。"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"當你錄影應用程式時,系統會錄影該應用程式中顯示或播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片、音訊和影片等。"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"錄影螢幕畫面"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"無法更新預設"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"預設"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"揀咗"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"工具"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"即時字幕"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"筆記"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"顯示低優先順序通知圖示"</string> <string name="other" msgid="429768510980739978">"其他"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"移除圖塊"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"將圖塊加到最尾"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"移動圖塊"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"加圖塊"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"移去 <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"加去位置 <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"位置冇效。"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"揀使用者"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"沒有互聯網連線"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"開啟<xliff:g id="ID_1">%s</xliff:g>設定頁面。"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"編輯設定次序。"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源選單"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"第 <xliff:g id="ID_1">%1$d</xliff:g> 頁 (共 <xliff:g id="ID_2">%2$d</xliff:g> 頁)"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"螢幕鎖定"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(已中斷連線)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"無法切換,輕按即可重試。"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"連接裝置"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"如要投放此工作階段,請開啟應用程式。"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"不明應用程式"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"停止投放"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"可用作音訊輸出的裝置"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"返回主畫面"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近使用的應用程式"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"請再試一次!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"在觸控板上用三隻手指向左或向右滑動"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"很好!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"你已完成「返回」手勢的教學課程。"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"如要使用觸控板返回,請用三隻手指向左或向右滑動"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"返回主畫面"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"在觸控板上用三隻手指向上滑動"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"太好了!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"你已完成「返回主畫面」手勢的教學課程"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"用三隻手指在觸控板上向上滑動,即可前往主畫面"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近使用的應用程式"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"在觸控板上用三隻手指向上滑動並按住"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"做得好!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢的教學課程。"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"如要查看最近使用的應用程式,請用三隻手指在觸控板上向上滑動並按住"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"你已完成「查看所有應用程式」手勢的教學課程"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"按下鍵盤上的快捷操作鍵即可查看所有應用程式"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"教學動畫,按一下以暫停和繼續播放。"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"鍵盤背光"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 級,共 %2$d 級"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 373f1af06c13..1c809851cbce 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"要錄製畫面嗎?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"錄製單一應用程式"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"錄製整個畫面"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"錄製整個畫面:%s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"錄製整個畫面時,系統會錄下畫面上的所有內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"當你錄製應用程式畫面時,系統會錄下該應用程式顯示或播放的所有內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"錄製畫面"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"無法更新預設設定"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"預設"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"已選取"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"工具"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"即時字幕"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"筆記"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"顯示低優先順序通知圖示"</string> <string name="other" msgid="429768510980739978">"其他"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"移除圖塊"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"將圖塊加到結尾處"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"移動圖塊"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"新增圖塊"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"移至 <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"新增到位置 <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"位置無效。"</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"選擇使用者"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"沒有網際網路連線"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"開啟「<xliff:g id="ID_1">%s</xliff:g>」設定。"</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"編輯設定順序。"</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源鍵選單"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"第 <xliff:g id="ID_1">%1$d</xliff:g> 頁,共 <xliff:g id="ID_2">%2$d</xliff:g> 頁"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"螢幕鎖定"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(連線中斷)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"無法切換,輕觸即可重試。"</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"連接裝置"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"如要投放這個工作階段,請開啟應用程式。"</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"不明的應用程式"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"停止投放"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"可用於輸出音訊的裝置。"</string> @@ -1468,32 +1486,27 @@ <string name="touchpad_tutorial_home_gesture_button" msgid="8023973153559885624">"返回主畫面"</string> <string name="touchpad_tutorial_recent_apps_gesture_button" msgid="8919227647650347359">"查看最近使用的應用程式"</string> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"完成"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"請再試一次!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"返回"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"在觸控板上用三指向左或向右滑動"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"很好!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"你已完成「返回」手勢的教學課程。"</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"如要使用觸控板返回,請用三指向左或向右滑動"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"返回主畫面"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"在觸控板上用三指向上滑動"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"太棒了!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"你已完成「返回主畫面」手勢教學課程"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"在觸控板上用三指向上滑動,即可前往主畫面"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"查看最近使用的應用程式"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"在觸控板上用三指向上滑動並按住"</string> <string name="touchpad_recent_apps_gesture_success_title" msgid="8481920554139332593">"太棒了!"</string> <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"你已完成「查看最近使用的應用程式」手勢教學課程。"</string> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"如要查看最近使用的應用程式,請在觸控板上用三指向上滑動並按住"</string> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"你已完成「查看所有應用程式」手勢教學課程"</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"按下鍵盤上的快捷操作鍵即可查看所有應用程式"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"教學課程動畫,按一下即可暫停和繼續播放。"</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"鍵盤背光"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"第 %1$d 級,共 %2$d 級"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index a18d9e7e02c2..6a8483d48a09 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -111,8 +111,10 @@ <string name="screenrecord_channel_description" msgid="4147077128486138351">"Isaziso esiqhubekayo seseshini yokurekhoda isikrini"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Rekhoda isikrini sakho?"</string> <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Rekhoda i-app eyodwa"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="2794896384693120020">"Rekhoda sonke isikrini"</string> - <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="3754611651558838691">"Rekhoda sonke isikrini: %s"</string> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen (4882406311415082016) --> + <skip /> + <!-- no translation found for screenrecord_permission_dialog_option_text_entire_screen_for_display (4169494703993148253) --> + <skip /> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Uma urekhoda sonke isikrini sakho, noma yini evela esikrinini iyarekhodwa. Ngakho-ke qaphela ngezinto ezifana namaphasiwedi, imininingwane yenkokhelo, imilayezo, izithombe, nomsindo nevidiyo."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Uma urekhoda i-app, noma yini evezwa noma edlala kuleyo app iyarekhodwa. Ngakho-ke qaphela ngezinto ezifana namaphasiwedi, imininingwane yenkokhelo, imilayezo, izithombe, nomsindo nevidiyo."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Rekhoda isikrini"</string> @@ -415,6 +417,20 @@ <string name="hearing_devices_presets_error" msgid="350363093458408536">"Ayikwazanga ukubuyekeza ukusetha ngaphambilini"</string> <string name="hearing_devices_preset_label" msgid="7878267405046232358">"Ukusetha ngaphambilini"</string> <string name="hearing_devices_spinner_item_selected" msgid="3137083889662762383">"Okukhethiwe"</string> + <!-- no translation found for hearing_devices_ambient_label (629440938614895797) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_left (3586965448230412600) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_control_right (6192137602448918383) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_expand_controls (2131816068187709200) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_collapse_controls (2261097656446201581) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_mute (1836882837647429416) --> + <skip /> + <!-- no translation found for hearing_devices_ambient_unmute (2187938085943876814) --> + <skip /> <string name="hearing_devices_tools_label" msgid="1929081464316074476">"Amathuluzi"</string> <string name="quick_settings_hearing_devices_live_caption_title" msgid="1054814050932225451">"Okushuthwe Bukhoma"</string> <string name="quick_settings_notes_label" msgid="1028004078001002623">"Inothi"</string> @@ -960,9 +976,11 @@ <string name="tuner_low_priority" msgid="8412666814123009820">"Bonisa izithonjana zesaziso zokubaluleka okuncane"</string> <string name="other" msgid="429768510980739978">"Okunye"</string> <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"susa ithayela"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"engeza ithayela ekugcineni"</string> + <!-- no translation found for accessibility_qs_edit_tile_add_action (8311378984458545661) --> + <skip /> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Hambisa ithayela"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Engeza ithayela"</string> + <!-- no translation found for accessibility_qs_edit_tile_start_add (8141710006899065161) --> + <skip /> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Hambisa ku-<xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Engeza kusikhundla se-<xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibilit_qs_edit_tile_add_move_invalid_position" msgid="2858467994472624487">"Indawo ayivumelekile."</string> @@ -978,7 +996,8 @@ <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"khetha umsebenzisi"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Ayikho i-inthanethi"</string> <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Vula izilungiselelo ze-<xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Hlela uhlelo lwezilungiselelo."</string> + <!-- no translation found for accessibility_quick_settings_edit (6544873823850165) --> + <skip /> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Imenyu yamandla"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Ikhasi <xliff:g id="ID_1">%1$d</xliff:g> kwangu-<xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Khiya isikrini"</string> @@ -1209,7 +1228,6 @@ <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(inqamukile)"</string> <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Akukwazi ukushintsha. Thepha ukuze uzame futhi."</string> <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Xhuma idivayisi"</string> - <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Ukuze usakaze le seshini, sicela uvule i-app."</string> <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"I-app engaziwa"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Misa ukusakaza"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Amadivayisi atholakalayo okukhipha umsindo."</string> @@ -1468,32 +1486,27 @@ <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> <string name="touchpad_tutorial_done_button" msgid="176168488821755503">"Kwenziwe"</string> - <!-- no translation found for gesture_error_title (469064941635578511) --> - <skip /> + <string name="gesture_error_title" msgid="469064941635578511">"Zama futhi!"</string> <string name="touchpad_back_gesture_action_title" msgid="7199067250654332735">"Buyela emuva"</string> <string name="touchpad_back_gesture_guidance" msgid="5352221087725906542">"Swayiphela kwesokunxele noma kwesokudla usebenzisa iminwe emithathu kuphedi yokuthinta"</string> <string name="touchpad_back_gesture_success_title" msgid="7370719098633023496">"Kuhle!"</string> <string name="touchpad_back_gesture_success_body" msgid="2324724953720741719">"Ukuqedile ukuthinta kokubuyela emuva."</string> - <!-- no translation found for touchpad_back_gesture_error_body (7112668207481458792) --> - <skip /> + <string name="touchpad_back_gesture_error_body" msgid="7112668207481458792">"Ukuze ubuyele emuva usebenzise iphedi yakho yokuthinta, swayiphela kwesokunxele noma kwesokudla usebenzisa iminwe emithathu"</string> <string name="touchpad_home_gesture_action_title" msgid="8885107349719257882">"Iya ekhasini lokuqala"</string> <string name="touchpad_home_gesture_guidance" msgid="4178219118381915899">"Swayiphela phezulu ngeminwe emithathu ephedini yakho yokuthinta"</string> <string name="touchpad_home_gesture_success_title" msgid="3648264553645798470">"Umsebenzi omuhle!"</string> <string name="touchpad_home_gesture_success_body" msgid="2590690589194027059">"Ukuqedile ukunyakaza kokuya ekhaya"</string> - <!-- no translation found for touchpad_home_gesture_error_body (3810674109999513073) --> - <skip /> + <string name="touchpad_home_gesture_error_body" msgid="3810674109999513073">"Swayiphela phezulu ngeminwe emithathu kuphedi yakho yokuthinta ukuze uye esikrinini sakho sasekhaya"</string> <string name="touchpad_recent_apps_gesture_action_title" msgid="934906836867137906">"Buka ama-app akamuva"</string> <string name="touchpad_recent_apps_gesture_guidance" msgid="6304446013842271822">"Swayiphela phezulu bese ubamba usebenzisa iminwe emithathu ephedini yokuthinta."</string> <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> - <!-- no translation found for touchpad_recent_gesture_error_body (8695535720378462022) --> - <skip /> + <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> <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> <string name="tutorial_action_key_success_body" msgid="1688986269491357832">"Uqedele ukunyakazisa kokubuka onke ama-app."</string> - <!-- no translation found for touchpad_action_key_error_body (8685502040091860903) --> - <skip /> + <string name="touchpad_action_key_error_body" msgid="8685502040091860903">"Cindezela inkinobho yokufinyelela kukhibhodi yakho ukuze ubuke wonke ama-app akho"</string> <string name="tutorial_animation_content_description" msgid="2698816574982370184">"Okopopayi okokufundisa, chofoza ukuze umise kancane futhi uqalise kabusha ukudlala."</string> <string name="keyboard_backlight_dialog_title" msgid="8273102932345564724">"Ilambu lekhibhodi"</string> <string name="keyboard_backlight_value" msgid="7336398765584393538">"Ileveli %1$d ka-%2$d"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 6994a55cdbcd..11327b648ddc 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -2116,6 +2116,8 @@ <dimen name="volume_dialog_background_square_corner_radius">12dp</dimen> + <dimen name="volume_dialog_ringer_drawer_left_margin">10dp</dimen> + <dimen name="volume_dialog_ringer_drawer_diff_right_margin">6dp</dimen> <dimen name="volume_dialog_ringer_drawer_button_size">@dimen/volume_dialog_button_size</dimen> <dimen name="volume_dialog_ringer_drawer_button_icon_radius">10dp</dimen> <dimen name="volume_dialog_ringer_selected_button_background_radius">20dp</dimen> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 0503dbfab71d..94698bcb88b8 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -570,6 +570,8 @@ <item name="trackCornerSize">12dp</item> <item name="trackInsideCornerSize">2dp</item> <item name="trackStopIndicatorSize">6dp</item> + <item name="trackIconSize">20dp</item> + <item name="labelBehavior">gone</item> </style> <style name="SystemUI.Material3.Slider" parent="@style/Widget.Material3.Slider"> @@ -579,6 +581,7 @@ <item name="tickColorInactive">@androidprv:color/materialColorPrimary</item> <item name="trackColorActive">@androidprv:color/materialColorPrimary</item> <item name="trackColorInactive">@androidprv:color/materialColorSurfaceContainerHighest</item> + <item name="trackIconActiveColor">@androidprv:color/materialColorSurfaceContainerHighest</item> </style> <style name="Theme.SystemUI.DayNightDialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog"/> diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java index 41b9d3372392..5f0acfa644dc 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java @@ -19,6 +19,7 @@ package com.android.systemui.accessibility.floatingmenu; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; +import android.annotation.Nullable; import android.content.Context; import android.hardware.display.DisplayManager; import android.os.Handler; @@ -35,6 +36,7 @@ import com.android.app.viewcapture.ViewCaptureAwareWindowManager; import com.android.internal.annotations.VisibleForTesting; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.accessibility.AccessibilityButtonModeObserver; import com.android.systemui.accessibility.AccessibilityButtonModeObserver.AccessibilityButtonMode; import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver; @@ -61,6 +63,7 @@ public class AccessibilityFloatingMenuController implements private final ViewCaptureAwareWindowManager mViewCaptureAwareWindowManager; private final DisplayManager mDisplayManager; private final AccessibilityManager mAccessibilityManager; + private final HearingAidDeviceManager mHearingAidDeviceManager; private final SecureSettings mSecureSettings; private final DisplayTracker mDisplayTracker; @@ -107,6 +110,7 @@ public class AccessibilityFloatingMenuController implements AccessibilityManager accessibilityManager, AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver, AccessibilityButtonModeObserver accessibilityButtonModeObserver, + @Nullable HearingAidDeviceManager hearingAidDeviceManager, KeyguardUpdateMonitor keyguardUpdateMonitor, SecureSettings secureSettings, DisplayTracker displayTracker, @@ -119,6 +123,7 @@ public class AccessibilityFloatingMenuController implements mAccessibilityManager = accessibilityManager; mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver; mAccessibilityButtonModeObserver = accessibilityButtonModeObserver; + mHearingAidDeviceManager = hearingAidDeviceManager; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mSecureSettings = secureSettings; mDisplayTracker = displayTracker; @@ -201,7 +206,7 @@ public class AccessibilityFloatingMenuController implements TYPE_NAVIGATION_BAR_PANEL, /* options= */ null); mFloatingMenu = new MenuViewLayerController(windowContext, mWindowManager, mViewCaptureAwareWindowManager, mAccessibilityManager, mSecureSettings, - mNavigationModeController); + mNavigationModeController, mHearingAidDeviceManager); } mFloatingMenu.show(); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java index ffb5f3d47bcc..121b51f768e7 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java @@ -30,6 +30,7 @@ import static com.android.systemui.accessibility.floatingmenu.MenuViewAppearance import android.annotation.FloatRange; import android.annotation.IntDef; +import android.annotation.Nullable; import android.content.ComponentCallbacks; import android.content.Context; import android.content.pm.ActivityInfo; @@ -49,6 +50,8 @@ import androidx.annotation.NonNull; import com.android.internal.accessibility.dialog.AccessibilityTarget; import com.android.internal.annotations.VisibleForTesting; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; +import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.Prefs; import com.android.systemui.util.settings.SecureSettings; @@ -80,8 +83,11 @@ class MenuInfoRepository { private final AccessibilityManager mAccessibilityManager; private final AccessibilityManager.AccessibilityServicesStateChangeListener mA11yServicesStateChangeListener = manager -> onTargetFeaturesChanged(); + private final HearingAidDeviceManager mHearingAidDeviceManager; + private final HearingAidDeviceManager.ConnectionStatusListener + mHearingDeviceStatusListener = this::onDevicesConnectionStatusChanged; private final Handler mHandler = new Handler(Looper.getMainLooper()); - private final OnSettingsContentsChanged mSettingsContentsCallback; + private final OnContentsChanged mSettingsContentsCallback; private final SecureSettings mSecureSettings; private Position mPercentagePosition; @@ -148,12 +154,14 @@ class MenuInfoRepository { }; MenuInfoRepository(Context context, AccessibilityManager accessibilityManager, - OnSettingsContentsChanged settingsContentsChanged, SecureSettings secureSettings) { + OnContentsChanged settingsContentsChanged, SecureSettings secureSettings, + @Nullable HearingAidDeviceManager hearingAidDeviceManager) { mContext = context; mAccessibilityManager = accessibilityManager; mConfiguration = new Configuration(context.getResources().getConfiguration()); mSettingsContentsCallback = settingsContentsChanged; mSecureSettings = secureSettings; + mHearingAidDeviceManager = hearingAidDeviceManager; mPercentagePosition = getStartPosition(); } @@ -185,6 +193,14 @@ class MenuInfoRepository { callback.onReady(getTargets(mContext, SOFTWARE)); } + void loadHearingDeviceStatus(OnInfoReady<Integer> callback) { + if (mHearingAidDeviceManager != null) { + callback.onReady(mHearingAidDeviceManager.getDevicesConnectionStatus()); + } else { + callback.onReady(HearingAidDeviceManager.ConnectionStatus.NO_DEVICE_BONDED); + } + } + void loadMenuSizeType(OnInfoReady<Integer> callback) { callback.onReady(getMenuSizeTypeFromSettings()); } @@ -222,8 +238,8 @@ class MenuInfoRepository { } private void onTargetFeaturesChanged() { - mSettingsContentsCallback.onTargetFeaturesChanged( - getTargets(mContext, SOFTWARE)); + List<AccessibilityTarget> targets = getTargets(mContext, SOFTWARE); + mSettingsContentsCallback.onTargetFeaturesChanged(targets); } private Position getStartPosition() { @@ -269,6 +285,24 @@ class MenuInfoRepository { mAccessibilityManager.addAccessibilityServicesStateChangeListener( mA11yServicesStateChangeListener); } + + if (com.android.settingslib.flags.Flags.hearingDeviceSetConnectionStatusReport()) { + registerConnectionStatusListener(); + } + } + + private void registerConnectionStatusListener() { + if (mHearingAidDeviceManager != null) { + mHearingAidDeviceManager.registerConnectionStatusListener( + mHearingDeviceStatusListener, ThreadUtils.getBackgroundExecutor()); + } + } + + private void unregisterConnectionStatusListener() { + if (mHearingAidDeviceManager != null) { + mHearingAidDeviceManager.unregisterConnectionStatusListener( + mHearingDeviceStatusListener); + } } void unregisterObserversAndCallbacks() { @@ -281,14 +315,18 @@ class MenuInfoRepository { mAccessibilityManager.removeAccessibilityServicesStateChangeListener( mA11yServicesStateChangeListener); } + + unregisterConnectionStatusListener(); } - interface OnSettingsContentsChanged { + interface OnContentsChanged { void onTargetFeaturesChanged(List<AccessibilityTarget> newTargetFeatures); void onSizeTypeChanged(int newSizeType); void onFadeEffectInfoChanged(MenuFadeEffectInfo fadeEffectInfo); + + void onDevicesConnectionStatusChanged(@HearingAidDeviceManager.ConnectionStatus int status); } interface OnInfoReady<T> { @@ -311,4 +349,9 @@ class MenuInfoRepository { ACCESSIBILITY_FLOATING_MENU_OPACITY, DEFAULT_OPACITY_VALUE, UserHandle.USER_CURRENT); } + + private void onDevicesConnectionStatusChanged( + @HearingAidDeviceManager.ConnectionStatus int status) { + mSettingsContentsCallback.onDevicesConnectionStatusChanged(status); + } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java index 9d9e7dfb7032..23fc546dd9b3 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java @@ -37,6 +37,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.internal.accessibility.dialog.AccessibilityTarget; import com.android.modules.expresslog.Counter; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.Flags; import com.android.systemui.util.settings.SecureSettings; @@ -65,8 +66,11 @@ class MenuView extends FrameLayout implements private final Observer<Integer> mSizeTypeObserver = this::onSizeTypeChanged; private final Observer<List<AccessibilityTarget>> mTargetFeaturesObserver = this::onTargetFeaturesChanged; + private final Observer<Integer> mHearingDeviceStatusObserver = + this::updateHearingDeviceStatus; + private final Observer<Integer> mHearingDeviceTargetIndexObserver = + this::updateHearingDeviceTargetIndex; private final MenuViewAppearance mMenuViewAppearance; - private boolean mIsMoveToTucked; private final MenuAnimationController mMenuAnimationController; @@ -357,6 +361,11 @@ class MenuView extends FrameLayout implements mMenuViewModel.getTargetFeaturesData().observeForever(mTargetFeaturesObserver); mMenuViewModel.getSizeTypeData().observeForever(mSizeTypeObserver); mMenuViewModel.getMoveToTuckedData().observeForever(mMoveToTuckedObserver); + if (com.android.settingslib.flags.Flags.hearingDeviceSetConnectionStatusReport()) { + mMenuViewModel.loadHearingDeviceStatus().observeForever(mHearingDeviceStatusObserver); + mMenuViewModel.getHearingDeviceTargetIndexData().observeForever( + mHearingDeviceTargetIndexObserver); + } setVisibility(VISIBLE); mMenuViewModel.registerObserversAndCallbacks(); getViewTreeObserver().addOnComputeInternalInsetsListener(this); @@ -371,6 +380,9 @@ class MenuView extends FrameLayout implements mMenuViewModel.getTargetFeaturesData().removeObserver(mTargetFeaturesObserver); mMenuViewModel.getSizeTypeData().removeObserver(mSizeTypeObserver); mMenuViewModel.getMoveToTuckedData().removeObserver(mMoveToTuckedObserver); + mMenuViewModel.getHearingDeviceStatusData().removeObserver(mHearingDeviceStatusObserver); + mMenuViewModel.getHearingDeviceTargetIndexData().removeObserver( + mHearingDeviceTargetIndexObserver); mMenuViewModel.unregisterObserversAndCallbacks(); getViewTreeObserver().removeOnComputeInternalInsetsListener(this); getViewTreeObserver().removeOnDrawListener(mSystemGestureExcludeUpdater); @@ -421,6 +433,14 @@ class MenuView extends FrameLayout implements parentView.setSystemGestureExclusionRects(Collections.singletonList(mBoundsInParent)); } + private void updateHearingDeviceStatus(@HearingAidDeviceManager.ConnectionStatus int status) { + // TODO: b/357882387 - To update status drawable according to the status here. + } + + private void updateHearingDeviceTargetIndex(int position) { + // TODO: b/357882387 - To update status drawable according to the status here. + } + /** * Interface definition for the {@link AccessibilityTarget} list changes. */ diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java index cb96e7859fba..184518ac35eb 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerController.java @@ -24,6 +24,7 @@ import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; import com.android.app.viewcapture.ViewCaptureAwareWindowManager; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.util.settings.SecureSettings; @@ -39,11 +40,12 @@ class MenuViewLayerController implements IAccessibilityFloatingMenu { MenuViewLayerController(Context context, WindowManager windowManager, ViewCaptureAwareWindowManager viewCaptureAwareWindowManager, AccessibilityManager accessibilityManager, SecureSettings secureSettings, - NavigationModeController navigationModeController) { + NavigationModeController navigationModeController, + HearingAidDeviceManager hearingAidDeviceManager) { mWindowManager = viewCaptureAwareWindowManager; MenuViewModel menuViewModel = new MenuViewModel( - context, accessibilityManager, secureSettings); + context, accessibilityManager, secureSettings, hearingAidDeviceManager); MenuViewAppearance menuViewAppearance = new MenuViewAppearance(context, windowManager); mMenuViewLayer = new MenuViewLayer(context, windowManager, accessibilityManager, diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java index f924784a5535..8b7d6a18bb85 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java @@ -16,13 +16,20 @@ package com.android.systemui.accessibility.floatingmenu; +import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME; + +import static java.util.Collections.emptyList; + +import android.content.ComponentName; import android.content.Context; import android.view.accessibility.AccessibilityManager; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Transformations; import com.android.internal.accessibility.dialog.AccessibilityTarget; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.util.settings.SecureSettings; import java.util.List; @@ -31,9 +38,9 @@ import java.util.List; * The view model provides the menu information from the repository{@link MenuInfoRepository} for * the menu view{@link MenuView}. */ -class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged { +class MenuViewModel implements MenuInfoRepository.OnContentsChanged { private final MutableLiveData<List<AccessibilityTarget>> mTargetFeaturesData = - new MutableLiveData<>(); + new MutableLiveData<>(emptyList()); private final MutableLiveData<Integer> mSizeTypeData = new MutableLiveData<>(); private final MutableLiveData<MenuFadeEffectInfo> mFadeEffectInfoData = new MutableLiveData<>(); @@ -41,12 +48,18 @@ class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged { private final MutableLiveData<Boolean> mDockTooltipData = new MutableLiveData<>(); private final MutableLiveData<Boolean> mMigrationTooltipData = new MutableLiveData<>(); private final MutableLiveData<Position> mPercentagePositionData = new MutableLiveData<>(); + private final MutableLiveData<Integer> mHearingDeviceStatusData = new MutableLiveData<>( + HearingAidDeviceManager.ConnectionStatus.NO_DEVICE_BONDED); + private final LiveData<Integer> mHearingDeviceTargetIndex = Transformations.map( + mTargetFeaturesData, this::getHearingDeviceTargetIndex); + private final MenuInfoRepository mInfoRepository; MenuViewModel(Context context, AccessibilityManager accessibilityManager, - SecureSettings secureSettings) { + SecureSettings secureSettings, HearingAidDeviceManager hearingAidDeviceManager) { mInfoRepository = new MenuInfoRepository(context, - accessibilityManager, /* settingsContentsChanged= */ this, secureSettings); + accessibilityManager, /* settingsContentsChanged= */ this, secureSettings, + hearingAidDeviceManager); } @Override @@ -64,6 +77,12 @@ class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged { mFadeEffectInfoData.setValue(fadeEffectInfo); } + @Override + public void onDevicesConnectionStatusChanged( + @HearingAidDeviceManager.ConnectionStatus int status) { + mHearingDeviceStatusData.postValue(status); + } + void updateMenuMoveToTucked(boolean isMoveToTucked) { mInfoRepository.updateMoveToTucked(isMoveToTucked); } @@ -115,6 +134,19 @@ class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged { return mTargetFeaturesData; } + LiveData<Integer> loadHearingDeviceStatus() { + mInfoRepository.loadHearingDeviceStatus(mHearingDeviceStatusData::setValue); + return mHearingDeviceStatusData; + } + + LiveData<Integer> getHearingDeviceStatusData() { + return mHearingDeviceStatusData; + } + + LiveData<Integer> getHearingDeviceTargetIndexData() { + return mHearingDeviceTargetIndex; + } + void registerObserversAndCallbacks() { mInfoRepository.registerObserversAndCallbacks(); } @@ -122,4 +154,16 @@ class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged { void unregisterObserversAndCallbacks() { mInfoRepository.unregisterObserversAndCallbacks(); } + + private int getHearingDeviceTargetIndex(List<AccessibilityTarget> targetList) { + final int listSize = targetList.size(); + for (int index = 0; index < listSize; index++) { + AccessibilityTarget target = targetList.get(index); + if (ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.equals( + ComponentName.unflattenFromString(target.getId()))) { + return index; + } + } + return -1; + } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalTutorialIndicatorViewBinder.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalTutorialIndicatorViewBinder.kt deleted file mode 100644 index 9c754ea5f962..000000000000 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalTutorialIndicatorViewBinder.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.android.systemui.communal.ui.binder - -import android.widget.TextView -import androidx.core.view.isVisible -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.repeatOnLifecycle -import com.android.systemui.communal.ui.viewmodel.CommunalTutorialIndicatorViewModel -import com.android.systemui.lifecycle.repeatWhenAttached -import kotlinx.coroutines.DisposableHandle -import com.android.app.tracing.coroutines.launchTraced as launch - -/** View binder for communal tutorial indicator shown on keyguard. */ -object CommunalTutorialIndicatorViewBinder { - fun bind( - view: TextView, - viewModel: CommunalTutorialIndicatorViewModel, - isPreviewMode: Boolean = false, - ): DisposableHandle { - val disposableHandle = - view.repeatWhenAttached { - repeatOnLifecycle(Lifecycle.State.STARTED) { - launch { - viewModel.showIndicator(isPreviewMode).collect { showIndicator -> - view.isVisible = showIndicator - } - } - - launch { viewModel.alpha.collect { view.alpha = it } } - } - } - - return disposableHandle - } -} diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/view/layout/sections/CommunalTutorialIndicatorSection.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/view/layout/sections/CommunalTutorialIndicatorSection.kt deleted file mode 100644 index 1a323a75f8e7..000000000000 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/view/layout/sections/CommunalTutorialIndicatorSection.kt +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.android.systemui.communal.ui.view.layout.sections - -import android.content.res.Resources -import android.graphics.Typeface -import android.graphics.Typeface.NORMAL -import android.view.Gravity -import android.view.View -import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.constraintlayout.widget.ConstraintSet -import androidx.core.content.res.ResourcesCompat -import com.android.systemui.communal.domain.interactor.CommunalInteractor -import com.android.systemui.communal.ui.binder.CommunalTutorialIndicatorViewBinder -import com.android.systemui.communal.ui.viewmodel.CommunalTutorialIndicatorViewModel -import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.keyguard.shared.model.KeyguardSection -import com.android.systemui.keyguard.ui.view.layout.sections.removeView -import com.android.systemui.res.R -import javax.inject.Inject -import kotlinx.coroutines.DisposableHandle - -class CommunalTutorialIndicatorSection -@Inject -constructor( - @Main private val resources: Resources, - private val communalTutorialIndicatorViewModel: CommunalTutorialIndicatorViewModel, - private val communalInteractor: CommunalInteractor, -) : KeyguardSection() { - private var communalTutorialIndicatorHandle: DisposableHandle? = null - - override fun addViews(constraintLayout: ConstraintLayout) { - if (!communalInteractor.isCommunalEnabled.value) { - return - } - val padding = - constraintLayout.resources.getDimensionPixelSize( - R.dimen.communal_tutorial_indicator_padding - ) - val view = - TextView(constraintLayout.context).apply { - id = R.id.communal_tutorial_indicator - visibility = View.GONE - background = - ResourcesCompat.getDrawable( - context.resources, - R.drawable.keyguard_bottom_affordance_bg, - context.theme - ) - foreground = - ResourcesCompat.getDrawable( - context.resources, - R.drawable.keyguard_bottom_affordance_selected_border, - context.theme - ) - gravity = Gravity.CENTER_VERTICAL - typeface = Typeface.create("google-sans", NORMAL) - text = constraintLayout.context.getString(R.string.communal_tutorial_indicator_text) - setPadding(padding, padding, padding, padding) - } - constraintLayout.addView(view) - } - - override fun bindData(constraintLayout: ConstraintLayout) { - if (!communalInteractor.isCommunalEnabled.value) { - return - } - communalTutorialIndicatorHandle = - CommunalTutorialIndicatorViewBinder.bind( - constraintLayout.requireViewById(R.id.communal_tutorial_indicator), - communalTutorialIndicatorViewModel, - ) - } - - override fun applyConstraints(constraintSet: ConstraintSet) { - if (!communalInteractor.isCommunalEnabled.value) { - return - } - val tutorialIndicatorId = R.id.communal_tutorial_indicator - val width = resources.getDimensionPixelSize(R.dimen.communal_tutorial_indicator_fixed_width) - val horizontalOffsetMargin = - resources.getDimensionPixelSize(R.dimen.communal_tutorial_indicator_horizontal_offset) - - constraintSet.apply { - constrainWidth(tutorialIndicatorId, width) - constrainHeight(tutorialIndicatorId, WRAP_CONTENT) - connect( - tutorialIndicatorId, - ConstraintSet.RIGHT, - ConstraintSet.PARENT_ID, - ConstraintSet.RIGHT, - horizontalOffsetMargin - ) - connect( - tutorialIndicatorId, - ConstraintSet.TOP, - ConstraintSet.PARENT_ID, - ConstraintSet.TOP - ) - connect( - tutorialIndicatorId, - ConstraintSet.BOTTOM, - ConstraintSet.PARENT_ID, - ConstraintSet.BOTTOM - ) - setVisibility(tutorialIndicatorId, View.GONE) - } - } - - override fun removeViews(constraintLayout: ConstraintLayout) { - communalTutorialIndicatorHandle?.dispose() - constraintLayout.removeView(R.id.communal_tutorial_indicator) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalTutorialIndicatorViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalTutorialIndicatorViewModel.kt deleted file mode 100644 index ce3a2be9229e..000000000000 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalTutorialIndicatorViewModel.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.systemui.communal.ui.viewmodel - -import com.android.systemui.communal.domain.interactor.CommunalTutorialInteractor -import javax.inject.Inject -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.flowOf - -/** View model for communal tutorial indicator on keyguard */ -class CommunalTutorialIndicatorViewModel -@Inject -constructor(private val communalTutorialInteractor: CommunalTutorialInteractor) { - /** - * An observable for whether the tutorial indicator view should be visible. - * - * @param isPreviewMode Whether for preview keyguard mode in wallpaper settings. - */ - fun showIndicator(isPreviewMode: Boolean): StateFlow<Boolean> { - return if (isPreviewMode) { - MutableStateFlow(false).asStateFlow() - } else { - communalTutorialInteractor.isTutorialAvailable - } - } - - /** An observable for the alpha level for the tutorial indicator. */ - // TODO("b/383587536") find replacement for keyguardBottomAreaInteractor alpha - val alpha: Flow<Float> = flowOf(0f) -} diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt index ddc4d1c10690..16cf26393aee 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt @@ -33,6 +33,7 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.ui.transitions.BlurConfig import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.Logger import com.android.systemui.log.dagger.CommunalLog @@ -92,6 +93,7 @@ constructor( @CommunalLog logBuffer: LogBuffer, private val metricsLogger: CommunalMetricsLogger, mediaCarouselController: MediaCarouselController, + blurConfig: BlurConfig, ) : BaseCommunalViewModel( communalSceneInteractor, @@ -221,6 +223,15 @@ constructor( val isEnableWorkProfileDialogShowing: Flow<Boolean> = _isEnableWorkProfileDialogShowing.asStateFlow() + val isUiBlurred: StateFlow<Boolean> = + if (Flags.bouncerUiRevamp()) { + keyguardInteractor.primaryBouncerShowing + } else { + MutableStateFlow(false) + } + + val blurRadiusPx: Float = blurConfig.maxBlurRadiusPx / 2.0f + init { // Initialize our media host for the UMO. This only needs to happen once and must be done // before the MediaHierarchyManager attempts to move the UMO to the hub. diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SettingsLibraryModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SettingsLibraryModule.java index 14626e1e6515..e72dfadd620f 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SettingsLibraryModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SettingsLibraryModule.java @@ -22,6 +22,7 @@ import android.content.Context; import android.os.Handler; import android.os.UserHandle; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.systemui.dagger.qualifiers.Background; @@ -41,4 +42,16 @@ public class SettingsLibraryModule { @Background Handler bgHandler) { return LocalBluetoothManager.create(context, bgHandler, UserHandle.ALL); } + + @SuppressLint("MissingPermission") + @SysUISingleton + @Provides + @Nullable + static HearingAidDeviceManager provideHearingAidDeviceManager( + @Nullable LocalBluetoothManager localBluetoothManager) { + if (localBluetoothManager == null) { + return null; + } + return localBluetoothManager.getCachedDeviceManager().getHearingAidDeviceManager(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepository.kt index f310b30c1a81..3390640fa6c6 100644 --- a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepository.kt @@ -18,6 +18,8 @@ package com.android.systemui.display.data.repository import android.annotation.SuppressLint import android.content.Context +import android.os.Bundle +import android.util.Log import android.view.Display import android.view.LayoutInflater import android.view.WindowManager @@ -39,14 +41,13 @@ import kotlinx.coroutines.CoroutineScope interface DisplayWindowPropertiesRepository { /** - * Returns a [DisplayWindowProperties] instance for a given display id and window type. - * - * @throws IllegalArgumentException if no display with the given display id exists. + * Returns a [DisplayWindowProperties] instance for a given display id and window type, or null + * if no display with the given display id exists. */ fun get( displayId: Int, @WindowManager.LayoutParams.WindowType windowType: Int, - ): DisplayWindowProperties + ): DisplayWindowProperties? } @SysUISingleton @@ -72,12 +73,10 @@ constructor( override fun get( displayId: Int, @WindowManager.LayoutParams.WindowType windowType: Int, - ): DisplayWindowProperties { - val display = - displayRepository.getDisplay(displayId) - ?: throw IllegalArgumentException("Display with id $displayId doesn't exist") + ): DisplayWindowProperties? { + val display = displayRepository.getDisplay(displayId) ?: return null return properties.get(displayId, windowType) - ?: create(display, windowType).also { properties.put(displayId, windowType, it) } + ?: create(display, windowType)?.also { properties.put(displayId, windowType, it) } } override fun start() { @@ -88,7 +87,7 @@ constructor( } } - private fun create(display: Display, windowType: Int): DisplayWindowProperties { + private fun create(display: Display, windowType: Int): DisplayWindowProperties? { val displayId = display.displayId return if (displayId == Display.DEFAULT_DISPLAY) { // For the default display, we can just reuse the global/application properties. @@ -102,6 +101,14 @@ constructor( ) } else { val context = createWindowContext(display, windowType) + if (context.displayId != display.displayId) { + Log.e( + TAG, + "Returning null because the new context doesn't have the desired display id " + + "${display.displayId}. Display was already removed.", + ) + return null + } @SuppressLint("NonInjectedService") // Need to manually get the service val windowManager = context.getSystemService(WindowManager::class.java) as WindowManager val layoutInflater = LayoutInflater.from(context) @@ -110,11 +117,15 @@ constructor( } private fun createWindowContext(display: Display, windowType: Int): Context = - globalContext.createWindowContext(display, windowType, /* options= */ null).also { + globalContext.createWindowContext(display, windowType, /* options= */ Bundle.EMPTY).also { it.setTheme(R.style.Theme_SystemUI) } override fun dump(pw: PrintWriter, args: Array<out String>) { pw.write("perDisplayContexts: $properties") } + + private companion object { + const val TAG = "DisplayWindowPropsRepo" + } } diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt index 711534f9dbf0..564588c159bd 100644 --- a/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt +++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt @@ -16,6 +16,7 @@ package com.android.systemui.display.data.repository +import android.util.Log import android.view.Display import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.CoreStartable @@ -36,12 +37,10 @@ interface PerDisplayStore<T> { val defaultDisplay: T /** - * Returns an instance for a specific display id. - * - * @throws IllegalArgumentException if [displayId] doesn't match the id of any existing - * displays. + * Returns an instance for a specific display id, or null if [displayId] doesn't match the id of + * any existing displays. */ - fun forDisplay(displayId: Int): T + fun forDisplay(displayId: Int): T? } abstract class PerDisplayStoreImpl<T>( @@ -58,7 +57,7 @@ abstract class PerDisplayStoreImpl<T>( * Note that the id of the default display is [Display.DEFAULT_DISPLAY]. */ override val defaultDisplay: T - get() = forDisplay(Display.DEFAULT_DISPLAY) + get() = forDisplay(Display.DEFAULT_DISPLAY)!! /** * Returns an instance for a specific display id. @@ -66,16 +65,30 @@ abstract class PerDisplayStoreImpl<T>( * @throws IllegalArgumentException if [displayId] doesn't match the id of any existing * displays. */ - override fun forDisplay(displayId: Int): T { + override fun forDisplay(displayId: Int): T? { if (displayRepository.getDisplay(displayId) == null) { - throw IllegalArgumentException("Display with id $displayId doesn't exist.") + Log.e(TAG, "<${instanceClass.simpleName}>: Display with id $displayId doesn't exist.") + return null } - return perDisplayInstances.computeIfAbsent(displayId) { - createInstanceForDisplay(displayId) + synchronized(perDisplayInstances) { + val existingInstance = perDisplayInstances[displayId] + if (existingInstance != null) { + return existingInstance + } + val newInstance = createInstanceForDisplay(displayId) + if (newInstance == null) { + Log.e( + TAG, + "<${instanceClass.simpleName}> returning null because createInstanceForDisplay($displayId) returned null.", + ) + } else { + perDisplayInstances[displayId] = newInstance + } + return newInstance } } - protected abstract fun createInstanceForDisplay(displayId: Int): T + protected abstract fun createInstanceForDisplay(displayId: Int): T? override fun start() { val instanceType = instanceClass.simpleName @@ -98,6 +111,10 @@ abstract class PerDisplayStoreImpl<T>( override fun dump(pw: PrintWriter, args: Array<out String>) { pw.println(perDisplayInstances) } + + private companion object { + const val TAG = "PerDisplayStore" + } } class SingleDisplayStore<T>(defaultInstance: T) : PerDisplayStore<T> { diff --git a/packages/SystemUI/src/com/android/systemui/display/domain/interactor/DisplayWindowPropertiesInteractor.kt b/packages/SystemUI/src/com/android/systemui/display/domain/interactor/DisplayWindowPropertiesInteractor.kt index 22e467bd5e3c..99c9ca98bae9 100644 --- a/packages/SystemUI/src/com/android/systemui/display/domain/interactor/DisplayWindowPropertiesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/display/domain/interactor/DisplayWindowPropertiesInteractor.kt @@ -33,7 +33,7 @@ interface DisplayWindowPropertiesInteractor { * * @throws IllegalArgumentException if no display with the given display id exists. */ - fun getForStatusBar(displayId: Int): DisplayWindowProperties + fun getForStatusBar(displayId: Int): DisplayWindowProperties? } @SysUISingleton @@ -42,7 +42,7 @@ class DisplayWindowPropertiesInteractorImpl constructor(private val repo: DisplayWindowPropertiesRepository) : DisplayWindowPropertiesInteractor { - override fun getForStatusBar(displayId: Int): DisplayWindowProperties { + override fun getForStatusBar(displayId: Int): DisplayWindowProperties? { return repo.get(displayId, TYPE_STATUS_BAR) } } diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 2997dd7de133..c039e0188064 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -100,10 +100,6 @@ object Flags { // TODO(b/242908637): Tracking Bug @JvmField val WALLPAPER_FULLSCREEN_PREVIEW = releasedFlag("wallpaper_fullscreen_preview") - /** Whether the long-press gesture to open wallpaper picker is enabled. */ - // TODO(b/266242192): Tracking Bug - @JvmField val LOCK_SCREEN_LONG_PRESS_ENABLED = releasedFlag("lock_screen_long_press_enabled") - /** Inflate and bind views upon emitting a blueprint value . */ // TODO(b/297365780): Tracking Bug @JvmField val LAZY_INFLATE_KEYGUARD = releasedFlag("lazy_inflate_keyguard") diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt index a9011513d797..284298df6906 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt @@ -18,6 +18,7 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.app.animation.Interpolators +import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.Flags.communalSceneKtfRefactor import com.android.systemui.Flags.restartDreamOnUnocclude import com.android.systemui.communal.domain.interactor.CommunalInteractor @@ -38,7 +39,6 @@ import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromOccludedTransitionInteractor @@ -222,6 +222,7 @@ constructor( const val TAG = "FromOccludedTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds val TO_ALTERNATE_BOUNCER_DURATION = DEFAULT_DURATION + val TO_PRIMARY_BOUNCER_DURATION = DEFAULT_DURATION val TO_AOD_DURATION = DEFAULT_DURATION val TO_DOZING_DURATION = DEFAULT_DURATION val TO_GLANCEABLE_HUB_DURATION = 250.milliseconds diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractor.kt index 274a1ddbd392..a6503005f8fd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractor.kt @@ -22,6 +22,7 @@ import android.content.Intent import android.content.IntentFilter import android.view.accessibility.AccessibilityManager import androidx.annotation.VisibleForTesting +import com.android.app.tracing.coroutines.launchTraced as launch import com.android.internal.logging.UiEvent import com.android.internal.logging.UiEventLogger import com.android.systemui.broadcast.BroadcastDispatcher @@ -29,7 +30,6 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.res.R @@ -51,7 +51,6 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import com.android.app.tracing.coroutines.launchTraced as launch /** Business logic for use-cases related to top-level touch handling in the lock screen. */ @OptIn(ExperimentalCoroutinesApi::class) @@ -121,9 +120,7 @@ constructor( init { if (isFeatureEnabled()) { broadcastDispatcher - .broadcastFlow( - IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), - ) + .broadcastFlow(IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) .onEach { hideMenu() } .launchIn(scope) } @@ -188,8 +185,7 @@ constructor( } private fun isFeatureEnabled(): Boolean { - return featureFlags.isEnabled(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED) && - context.resources.getBoolean(R.bool.long_press_keyguard_customize_lockscreen_enabled) + return context.resources.getBoolean(R.bool.long_press_keyguard_customize_lockscreen_enabled) } /** Updates application state to ask to show the menu. */ @@ -230,14 +226,11 @@ constructor( .toLong() } - enum class LogEvents( - private val _id: Int, - ) : UiEventLogger.UiEventEnum { + enum class LogEvents(private val _id: Int) : UiEventLogger.UiEventEnum { @UiEvent(doc = "The lock screen was long-pressed and we showed the settings popup menu.") LOCK_SCREEN_LONG_PRESS_POPUP_SHOWN(1292), @UiEvent(doc = "The lock screen long-press popup menu was clicked.") - LOCK_SCREEN_LONG_PRESS_POPUP_CLICKED(1293), - ; + LOCK_SCREEN_LONG_PRESS_POPUP_CLICKED(1293); override fun getId() = _id } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt index 79360370d937..13c2ffb70220 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt @@ -19,6 +19,8 @@ package com.android.systemui.keyguard.ui.binder import android.graphics.Rect import android.view.View +import android.view.accessibility.AccessibilityEvent.TYPE_VIEW_FOCUSED +import android.widget.TextView import androidx.core.view.isVisible import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle @@ -47,7 +49,7 @@ object KeyguardSettingsViewBinder { touchHandlingViewModel: KeyguardTouchHandlingViewModel, rootViewModel: KeyguardRootViewModel?, vibratorHelper: VibratorHelper, - activityStarter: ActivityStarter + activityStarter: ActivityStarter, ): DisposableHandle { val disposableHandle = view.repeatWhenAttached { @@ -57,19 +59,16 @@ object KeyguardSettingsViewBinder { view.animateVisibility(visible = isVisible) if (isVisible) { vibratorHelper.vibrate(KeyguardBottomAreaVibrations.Activated) + val textView = view.requireViewById(R.id.text) as TextView view.setOnTouchListener( - KeyguardSettingsButtonOnTouchListener( - viewModel = viewModel, - ) + KeyguardSettingsButtonOnTouchListener(viewModel = viewModel) ) IconViewBinder.bind( icon = viewModel.icon, view = view.requireViewById(R.id.icon), ) - TextViewBinder.bind( - view = view.requireViewById(R.id.text), - viewModel = viewModel.text, - ) + TextViewBinder.bind(view = textView, viewModel = viewModel.text) + textView.sendAccessibilityEvent(TYPE_VIEW_FOCUSED) } } } @@ -108,15 +107,12 @@ object KeyguardSettingsViewBinder { } /** Opens the wallpaper picker screen after the device is unlocked by the user. */ - private fun navigateToLockScreenSettings( - activityStarter: ActivityStarter, - view: View, - ) { + private fun navigateToLockScreenSettings(activityStarter: ActivityStarter, view: View) { activityStarter.postStartActivityDismissingKeyguard( WallpaperPickerIntentUtils.getIntent(view.context, LAUNCH_SOURCE_KEYGUARD), /* delay= */ 0, /* animationController= */ ActivityTransitionAnimator.Controller.fromView(view), - /* customMessage= */ view.context.getString(R.string.keyguard_unlock_to_customize_ls) + /* customMessage= */ view.context.getString(R.string.keyguard_unlock_to_customize_ls), ) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt index 6fb31c0e4191..a2107871a585 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt @@ -40,7 +40,6 @@ import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.widget.FrameLayout -import android.widget.TextView import android.window.InputTransferToken import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet @@ -52,8 +51,6 @@ import com.android.keyguard.ClockEventController import com.android.systemui.animation.view.LaunchableImageView import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor import com.android.systemui.broadcast.BroadcastDispatcher -import com.android.systemui.communal.ui.binder.CommunalTutorialIndicatorViewBinder -import com.android.systemui.communal.ui.viewmodel.CommunalTutorialIndicatorViewModel import com.android.systemui.customization.R as customR import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background @@ -118,7 +115,6 @@ constructor( @Assisted bundle: Bundle, private val shadeInteractor: ShadeInteractor, private val secureSettings: SecureSettings, - private val communalTutorialViewModel: CommunalTutorialIndicatorViewModel, private val defaultShortcutsSection: DefaultShortcutsSection, private val keyguardQuickAffordanceViewBinder: KeyguardQuickAffordanceViewBinder, ) { @@ -369,7 +365,6 @@ constructor( ), ) } - setupCommunalTutorialIndicator(keyguardRootView) } private fun setupShortcuts(keyguardRootView: ConstraintLayout) { @@ -487,17 +482,6 @@ constructor( ) } - private fun setupCommunalTutorialIndicator(keyguardRootView: ConstraintLayout) { - keyguardRootView.findViewById<TextView>(R.id.communal_tutorial_indicator)?.let { - indicatorView -> - CommunalTutorialIndicatorViewBinder.bind( - indicatorView, - communalTutorialViewModel, - isPreviewMode = true, - ) - } - } - @Style.Type private suspend fun fetchThemeStyleFromSetting(): Int { val overlayPackageJson = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/transitions/PrimaryBouncerTransition.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/transitions/PrimaryBouncerTransition.kt index 16cb450aaac8..4a0817b2bdf8 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/transitions/PrimaryBouncerTransition.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/transitions/PrimaryBouncerTransition.kt @@ -17,19 +17,23 @@ package com.android.systemui.keyguard.ui.transitions import android.content.res.Resources -import com.android.systemui.Flags.notificationShadeBlur +import android.util.MathUtils import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.AodToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.DozingToPrimaryBouncerTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.LockscreenToPrimaryBouncerTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.OccludedToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToAodTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToDozingTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGlanceableHubTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToOccludedTransitionViewModel import com.android.systemui.res.R +import com.android.systemui.window.flag.WindowBlurFlag import dagger.Binds import dagger.Module import dagger.Provides @@ -47,6 +51,14 @@ import kotlinx.coroutines.flow.Flow interface PrimaryBouncerTransition { /** Radius of blur applied to the window's root view. */ val windowBlurRadius: Flow<Float> + + fun transitionProgressToBlurRadius( + starBlurRadius: Float, + endBlurRadius: Float, + transitionProgress: Float, + ): Float { + return MathUtils.lerp(starBlurRadius, endBlurRadius, transitionProgress) + } } /** @@ -78,6 +90,16 @@ interface PrimaryBouncerTransitionModule { @Binds @IntoSet + fun fromGlanceableHub( + impl: GlanceableHubToPrimaryBouncerTransitionViewModel + ): PrimaryBouncerTransition + + @Binds + @IntoSet + fun fromOccluded(impl: OccludedToPrimaryBouncerTransitionViewModel): PrimaryBouncerTransition + + @Binds + @IntoSet fun toAod(impl: PrimaryBouncerToAodTransitionViewModel): PrimaryBouncerTransition @Binds @@ -98,13 +120,17 @@ interface PrimaryBouncerTransitionModule { @IntoSet fun toGone(impl: PrimaryBouncerToGoneTransitionViewModel): PrimaryBouncerTransition + @Binds + @IntoSet + fun toOccluded(impl: PrimaryBouncerToOccludedTransitionViewModel): PrimaryBouncerTransition + companion object { @Provides @SysUISingleton fun provideBlurConfig(@Main resources: Resources): BlurConfig { val minBlurRadius = resources.getDimensionPixelSize(R.dimen.min_window_blur_radius) val maxBlurRadius = - if (notificationShadeBlur()) { + if (WindowBlurFlag.isEnabled) { resources.getDimensionPixelSize(R.dimen.max_shade_window_blur_radius) } else { resources.getDimensionPixelSize(R.dimen.max_window_blur_radius) 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 6973fecc37b4..f34cc07f26ae 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 @@ -17,7 +17,6 @@ package com.android.systemui.keyguard.ui.view.layout.blueprints -import com.android.systemui.communal.ui.view.layout.sections.CommunalTutorialIndicatorSection import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.KeyguardBlueprint import com.android.systemui.keyguard.shared.model.KeyguardSection @@ -63,7 +62,6 @@ constructor( defaultNotificationStackScrollLayoutSection: DefaultNotificationStackScrollLayoutSection, aodNotificationIconsSection: AodNotificationIconsSection, aodBurnInSection: AodBurnInSection, - communalTutorialIndicatorSection: CommunalTutorialIndicatorSection, clockSection: ClockSection, smartspaceSection: SmartspaceSection, keyguardSliceViewSection: KeyguardSliceViewSection, @@ -83,7 +81,6 @@ constructor( aodNotificationIconsSection, smartspaceSection, aodBurnInSection, - communalTutorialIndicatorSection, clockSection, keyguardSliceViewSection, defaultDeviceEntrySection, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt index 1eed224be3b5..856e1d6ffdb7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt @@ -17,7 +17,6 @@ package com.android.systemui.keyguard.ui.view.layout.blueprints -import com.android.systemui.communal.ui.view.layout.sections.CommunalTutorialIndicatorSection import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.KeyguardBlueprint import com.android.systemui.keyguard.shared.model.KeyguardSection @@ -61,7 +60,6 @@ constructor( splitShadeGuidelines: SplitShadeGuidelines, aodNotificationIconsSection: AodNotificationIconsSection, aodBurnInSection: AodBurnInSection, - communalTutorialIndicatorSection: CommunalTutorialIndicatorSection, clockSection: ClockSection, smartspaceSection: SmartspaceSection, mediaSection: SplitShadeMediaSection, @@ -81,7 +79,6 @@ constructor( aodNotificationIconsSection, smartspaceSection, aodBurnInSection, - communalTutorialIndicatorSection, clockSection, mediaSection, defaultDeviceEntrySection, // Add LAST: Intentionally has z-order above other views. diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModel.kt index 1866d62fb3ec..f17455788d6e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModel.kt @@ -16,7 +16,6 @@ package com.android.systemui.keyguard.ui.viewmodel -import android.util.MathUtils import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromAlternateBouncerTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge @@ -87,7 +86,11 @@ constructor( transitionAnimation.sharedFlow( duration = FromAlternateBouncerTransitionInteractor.TO_PRIMARY_BOUNCER_DURATION, onStep = { step -> - MathUtils.lerp(blurConfig.minBlurRadiusPx, blurConfig.maxBlurRadiusPx, step) + transitionProgressToBlurRadius( + starBlurRadius = blurConfig.minBlurRadiusPx, + endBlurRadius = blurConfig.maxBlurRadiusPx, + transitionProgress = step, + ) }, onFinish = { blurConfig.maxBlurRadiusPx }, ), diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModel.kt index dff645c30027..d8b617a60129 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToPrimaryBouncerTransitionViewModel.kt @@ -16,7 +16,6 @@ package com.android.systemui.keyguard.ui.viewmodel -import android.util.MathUtils import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromDozingTransitionInteractor.Companion.TO_PRIMARY_BOUNCER_DURATION import com.android.systemui.keyguard.shared.model.Edge @@ -57,7 +56,11 @@ constructor(private val blurConfig: BlurConfig, animationFlow: KeyguardTransitio transitionAnimation.sharedFlow( TO_PRIMARY_BOUNCER_DURATION, onStep = { step -> - MathUtils.lerp(blurConfig.minBlurRadiusPx, blurConfig.maxBlurRadiusPx, step) + transitionProgressToBlurRadius( + starBlurRadius = blurConfig.minBlurRadiusPx, + endBlurRadius = blurConfig.maxBlurRadiusPx, + transitionProgress = step, + ) }, onFinish = { blurConfig.maxBlurRadiusPx }, ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModel.kt new file mode 100644 index 000000000000..597df15a2b55 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModel.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor +import com.android.systemui.keyguard.shared.model.Edge +import com.android.systemui.keyguard.shared.model.KeyguardState.GLANCEABLE_HUB +import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER +import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow +import com.android.systemui.keyguard.ui.transitions.BlurConfig +import com.android.systemui.keyguard.ui.transitions.PrimaryBouncerTransition +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow + +@SysUISingleton +class GlanceableHubToPrimaryBouncerTransitionViewModel +@Inject +constructor(private val blurConfig: BlurConfig, animationFlow: KeyguardTransitionAnimationFlow) : + PrimaryBouncerTransition { + private val transitionAnimation = + animationFlow + .setup( + duration = FromLockscreenTransitionInteractor.TO_PRIMARY_BOUNCER_DURATION, + edge = Edge.INVALID, + ) + .setupWithoutSceneContainer(edge = Edge.create(GLANCEABLE_HUB, PRIMARY_BOUNCER)) + + override val windowBlurRadius: Flow<Float> = + transitionAnimation.immediatelyTransitionTo(blurConfig.maxBlurRadiusPx) +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt index 182c84753fd3..c373fd01ba20 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt @@ -16,7 +16,6 @@ package com.android.systemui.keyguard.ui.viewmodel -import android.util.MathUtils import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge @@ -90,7 +89,11 @@ constructor( transitionAnimation.sharedFlow( duration = FromLockscreenTransitionInteractor.TO_PRIMARY_BOUNCER_DURATION, onStep = { - MathUtils.lerp(blurConfig.minBlurRadiusPx, blurConfig.maxBlurRadiusPx, it) + transitionProgressToBlurRadius( + starBlurRadius = blurConfig.minBlurRadiusPx, + endBlurRadius = blurConfig.maxBlurRadiusPx, + transitionProgress = it, + ) }, ), ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModel.kt new file mode 100644 index 000000000000..44598107fa4b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModel.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor +import com.android.systemui.keyguard.shared.model.Edge +import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED +import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER +import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow +import com.android.systemui.keyguard.ui.transitions.BlurConfig +import com.android.systemui.keyguard.ui.transitions.PrimaryBouncerTransition +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow + +@SysUISingleton +class OccludedToPrimaryBouncerTransitionViewModel +@Inject +constructor(blurConfig: BlurConfig, animationFlow: KeyguardTransitionAnimationFlow) : + PrimaryBouncerTransition { + private val transitionAnimation = + animationFlow + .setup( + duration = FromOccludedTransitionInteractor.TO_PRIMARY_BOUNCER_DURATION, + edge = Edge.INVALID, + ) + .setupWithoutSceneContainer(edge = Edge.create(OCCLUDED, PRIMARY_BOUNCER)) + + override val windowBlurRadius: Flow<Float> = + transitionAnimation.immediatelyTransitionTo(blurConfig.maxBlurRadiusPx) +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt index 92daed42b2a7..fab8008cbfa7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt @@ -16,7 +16,6 @@ package com.android.systemui.keyguard.ui.viewmodel -import android.util.MathUtils import com.android.systemui.dagger.SysUISingleton import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor @@ -84,7 +83,11 @@ constructor( transitionAnimation.sharedFlow( duration = FromPrimaryBouncerTransitionInteractor.TO_AOD_DURATION, onStep = { step -> - MathUtils.lerp(blurConfig.maxBlurRadiusPx, blurConfig.minBlurRadiusPx, step) + transitionProgressToBlurRadius( + starBlurRadius = blurConfig.maxBlurRadiusPx, + endBlurRadius = blurConfig.minBlurRadiusPx, + transitionProgress = step, + ) }, onFinish = { blurConfig.minBlurRadiusPx }, ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModel.kt index 2c5250b3d544..eebdf2ef418e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDozingTransitionViewModel.kt @@ -16,7 +16,6 @@ package com.android.systemui.keyguard.ui.viewmodel -import android.util.MathUtils import com.android.systemui.dagger.SysUISingleton import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor.Companion.TO_DOZING_DURATION @@ -73,7 +72,11 @@ constructor( transitionAnimation.sharedFlow( duration = TO_DOZING_DURATION, onStep = { step -> - MathUtils.lerp(blurConfig.maxBlurRadiusPx, blurConfig.minBlurRadiusPx, step) + transitionProgressToBlurRadius( + starBlurRadius = blurConfig.maxBlurRadiusPx, + endBlurRadius = blurConfig.minBlurRadiusPx, + transitionProgress = step, + ) }, onFinish = { blurConfig.minBlurRadiusPx }, ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt index ae155ba00b9f..4ed3e6cde230 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt @@ -16,7 +16,6 @@ package com.android.systemui.keyguard.ui.viewmodel -import android.util.MathUtils import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags import com.android.systemui.dagger.SysUISingleton @@ -118,7 +117,11 @@ constructor( if (willRunDismissFromKeyguard) { blurConfig.minBlurRadiusPx } else { - MathUtils.lerp(blurConfig.maxBlurRadiusPx, blurConfig.minBlurRadiusPx, it) + transitionProgressToBlurRadius( + starBlurRadius = blurConfig.maxBlurRadiusPx, + endBlurRadius = blurConfig.minBlurRadiusPx, + transitionProgress = it, + ) } }, ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt index 1b1718d7d0e8..2edc93cb5617 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt @@ -83,7 +83,11 @@ constructor( transitionAnimation.sharedFlow( duration = FromPrimaryBouncerTransitionInteractor.TO_LOCKSCREEN_DURATION, onStep = { - MathUtils.lerp(blurConfig.maxBlurRadiusPx, blurConfig.minBlurRadiusPx, it) + transitionProgressToBlurRadius( + starBlurRadius = blurConfig.maxBlurRadiusPx, + endBlurRadius = blurConfig.minBlurRadiusPx, + transitionProgress = it, + ) }, ), ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModel.kt new file mode 100644 index 000000000000..3a54a26858d4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModel.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor +import com.android.systemui.keyguard.shared.model.Edge +import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED +import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER +import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow +import com.android.systemui.keyguard.ui.transitions.BlurConfig +import com.android.systemui.keyguard.ui.transitions.PrimaryBouncerTransition +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow + +@SysUISingleton +class PrimaryBouncerToOccludedTransitionViewModel +@Inject +constructor(private val blurConfig: BlurConfig, animationFlow: KeyguardTransitionAnimationFlow) : + PrimaryBouncerTransition { + private val transitionAnimation = + animationFlow + .setup( + duration = FromPrimaryBouncerTransitionInteractor.TO_OCCLUDED_DURATION, + edge = Edge.INVALID, + ) + .setupWithoutSceneContainer(edge = Edge.create(PRIMARY_BOUNCER, OCCLUDED)) + + override val windowBlurRadius: Flow<Float> = + transitionAnimation.immediatelyTransitionTo(blurConfig.minBlurRadiusPx) +} diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/Media3ActionFactory.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/Media3ActionFactory.kt index 913aa6f9d547..09544827a51a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/Media3ActionFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/Media3ActionFactory.kt @@ -43,6 +43,7 @@ import com.android.systemui.media.controls.util.MediaControllerFactory import com.android.systemui.media.controls.util.SessionTokenFactory import com.android.systemui.res.R import com.android.systemui.util.concurrency.Execution +import java.util.concurrent.ExecutionException import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -71,7 +72,7 @@ constructor( * * @param packageName Package name for the media app * @param controller The framework [MediaController] for the session - * @return The media action buttons, or null if the session token is null + * @return The media action buttons, or null if cannot be created for this session */ suspend fun createActionsFromSession( packageName: String, @@ -80,6 +81,10 @@ constructor( // Get the Media3 controller using the legacy token val token = tokenFactory.createTokenFromLegacy(sessionToken) val m3controller = controllerFactory.create(token, looper) + if (m3controller == null) { + logger.logCreateFailed(packageName, "createActionsFromSession") + return null + } // Build button info val buttons = suspendCancellableCoroutine { continuation -> @@ -89,13 +94,14 @@ constructor( val result = getMedia3Actions(packageName, m3controller, token) continuation.resumeWith(Result.success(result)) } finally { - m3controller.release() + m3controller.tryRelease(packageName, logger) } } handler.post(runnable) continuation.invokeOnCancellation { // Ensure controller is released, even if loading was cancelled partway through - handler.post(m3controller::release) + val releaseRunnable = Runnable { m3controller.tryRelease(packageName, logger) } + handler.post(releaseRunnable) handler.removeCallbacks(runnable) } } @@ -127,11 +133,12 @@ constructor( com.android.internal.R.drawable.progress_small_material, ) } else { - getStandardAction(m3controller, token, Player.COMMAND_PLAY_PAUSE) + getStandardAction(packageName, m3controller, token, Player.COMMAND_PLAY_PAUSE) } val prevButton = getStandardAction( + packageName, m3controller, token, Player.COMMAND_SEEK_TO_PREVIOUS, @@ -139,6 +146,7 @@ constructor( ) val nextButton = getStandardAction( + packageName, m3controller, token, Player.COMMAND_SEEK_TO_NEXT, @@ -208,6 +216,7 @@ constructor( * @return A [MediaAction] representing the first supported command, or null if not supported */ private fun getStandardAction( + packageName: String, controller: Media3Controller, token: SessionToken, vararg commands: @Player.Command Int, @@ -222,14 +231,14 @@ constructor( if (!controller.isPlaying) { MediaAction( context.getDrawable(R.drawable.ic_media_play), - { executeAction(token, Player.COMMAND_PLAY_PAUSE) }, + { executeAction(packageName, token, Player.COMMAND_PLAY_PAUSE) }, context.getString(R.string.controls_media_button_play), context.getDrawable(R.drawable.ic_media_play_container), ) } else { MediaAction( context.getDrawable(R.drawable.ic_media_pause), - { executeAction(token, Player.COMMAND_PLAY_PAUSE) }, + { executeAction(packageName, token, Player.COMMAND_PLAY_PAUSE) }, context.getString(R.string.controls_media_button_pause), context.getDrawable(R.drawable.ic_media_pause_container), ) @@ -238,7 +247,7 @@ constructor( else -> { MediaAction( icon = getIconForAction(command), - action = { executeAction(token, command) }, + action = { executeAction(packageName, token, command) }, contentDescription = getDescriptionForAction(command), background = null, ) @@ -256,7 +265,7 @@ constructor( ): MediaAction { return MediaAction( getIconForAction(customAction, packageName), - { executeAction(token, Player.COMMAND_INVALID, customAction) }, + { executeAction(packageName, token, Player.COMMAND_INVALID, customAction) }, customAction.displayName, null, ) @@ -308,12 +317,17 @@ constructor( } private fun executeAction( + packageName: String, token: SessionToken, command: Int, customAction: CommandButton? = null, ) { bgScope.launch { val controller = controllerFactory.create(token, looper) + if (controller == null) { + logger.logCreateFailed(packageName, "executeAction") + return@launch + } handler.post { try { when (command) { @@ -347,9 +361,17 @@ constructor( else -> logger.logMedia3UnsupportedCommand(command.toString()) } } finally { - controller.release() + controller.tryRelease(packageName, logger) } } } } } + +private fun Media3Controller.tryRelease(packageName: String, logger: MediaLogger) { + try { + this.release() + } catch (e: ExecutionException) { + logger.logReleaseFailed(packageName, e.cause.toString()) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/MediaLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/MediaLogger.kt index 0b598c13311f..c52268e35e0e 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/shared/MediaLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/MediaLogger.kt @@ -144,6 +144,30 @@ class MediaLogger @Inject constructor(@MediaLog private val buffer: LogBuffer) { buffer.log(TAG, LogLevel.DEBUG, { str1 = command }, { "Unsupported media3 command $str1" }) } + fun logCreateFailed(pkg: String, method: String) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = pkg + str2 = method + }, + { "Controller create failed for $str1 ($str2)" }, + ) + } + + fun logReleaseFailed(pkg: String, cause: String) { + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = pkg + str2 = cause + }, + { "Controller release failed for $str1 ($str2)" }, + ) + } + companion object { private const val TAG = "MediaLog" } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaControllerFactory.kt b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaControllerFactory.kt index d815852b790f..7b9e18a0744b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaControllerFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaControllerFactory.kt @@ -19,13 +19,17 @@ import android.content.Context import android.media.session.MediaController import android.media.session.MediaSession import android.os.Looper +import android.util.Log import androidx.concurrent.futures.await import androidx.media3.session.MediaController as Media3Controller import androidx.media3.session.SessionToken +import java.util.concurrent.ExecutionException import javax.inject.Inject /** Testable wrapper for media controller construction */ open class MediaControllerFactory @Inject constructor(private val context: Context) { + private val TAG = "MediaControllerFactory" + /** * Creates a new [MediaController] from the framework session token. * @@ -41,10 +45,18 @@ open class MediaControllerFactory @Inject constructor(private val context: Conte * @param token The token for the session * @param looper The looper that will be used for this controller's operations */ - open suspend fun create(token: SessionToken, looper: Looper): Media3Controller { - return Media3Controller.Builder(context, token) - .setApplicationLooper(looper) - .buildAsync() - .await() + open suspend fun create(token: SessionToken, looper: Looper): Media3Controller? { + try { + return Media3Controller.Builder(context, token) + .setApplicationLooper(looper) + .buildAsync() + .await() + } catch (e: ExecutionException) { + if (e.cause is SecurityException) { + // The session rejected the connection + Log.d(TAG, "SecurityException creating media3 controller") + } + return null + } } } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java index 9e50fb86fda0..64256f97fd78 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java @@ -268,8 +268,11 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog // Init bottom buttons mDoneButton.setOnClickListener(v -> dismiss()); mStopButton.setOnClickListener(v -> onStopButtonClick()); - mMediaMetadataSectionLayout.setOnClickListener( - mMediaSwitchingController::tryToLaunchMediaApplication); + if (mMediaSwitchingController.getAppLaunchIntent() != null) { + // For a11y purposes only add listener if a section is clickable. + mMediaMetadataSectionLayout.setOnClickListener( + mMediaSwitchingController::tryToLaunchMediaApplication); + } mDismissing = false; } 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 c895732f79f6..f9df67661b49 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java @@ -720,9 +720,24 @@ public class NavigationBar extends ViewController<NavigationBarView> implements if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + mView); - mViewCaptureAwareWindowManager.addView(mFrame, - getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration - .getRotation())); + try { + mViewCaptureAwareWindowManager.addView( + mFrame, + getBarLayoutParams( + mContext.getResources() + .getConfiguration() + .windowConfiguration + .getRotation())); + } catch (WindowManager.InvalidDisplayException e) { + // Wrapping this in a try/catch to avoid crashes when a display is instantly removed + // after being added, and initialization hasn't finished yet. + Log.e( + TAG, + "Unable to add view to WindowManager. Display with id " + + mDisplayId + + " does not exist anymore", + e); + } mDisplayId = mContext.getDisplayId(); mIsOnDefaultDisplay = mDisplayId == mDisplayTracker.getDefaultDisplayId(); @@ -764,6 +779,15 @@ public class NavigationBar extends ViewController<NavigationBarView> implements Trace.beginSection("NavigationBar#removeViewImmediate"); try { mViewCaptureAwareWindowManager.removeViewImmediate(mView.getRootView()); + } catch (IllegalArgumentException e) { + // Wrapping this in a try/catch to avoid crashes when a display is instantly removed + // after being added, and initialization hasn't finished yet. + // When that happens, adding the View to WindowManager fails, and therefore removing + // it here will fail too, since it wasn't added in the first place. + Log.e( + TAG, + "Failed to removed view from WindowManager. The View wasn't attached.", + e); } finally { Trace.endSection(); } @@ -859,7 +883,15 @@ public class NavigationBar extends ViewController<NavigationBarView> implements if (mOrientationHandle != null) { resetSecondaryHandle(); getBarTransitions().removeDarkIntensityListener(mOrientationHandleIntensityListener); - mViewCaptureAwareWindowManager.removeView(mOrientationHandle); + try { + mViewCaptureAwareWindowManager.removeView(mOrientationHandle); + } catch (IllegalArgumentException e) { + // Wrapping this in a try/catch to avoid crashes when a display is instantly removed + // after being added, and initialization hasn't finished yet. + // When that happens, adding the View to WindowManager fails, and therefore removing + // it here will fail too, since it wasn't added in the first place. + Log.e(TAG, "Trying to remove a View that is not attached", e); + } mOrientationHandle.getViewTreeObserver().removeOnGlobalLayoutListener( mOrientationHandleGlobalLayoutListener); } @@ -930,7 +962,18 @@ public class NavigationBar extends ViewController<NavigationBarView> implements mOrientationParams.setTitle("SecondaryHomeHandle" + mContext.getDisplayId()); mOrientationParams.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION | WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; - mViewCaptureAwareWindowManager.addView(mOrientationHandle, mOrientationParams); + try { + mViewCaptureAwareWindowManager.addView(mOrientationHandle, mOrientationParams); + } catch (WindowManager.InvalidDisplayException e) { + // Wrapping this in a try/catch to avoid crashes when a display is instantly removed + // after being added, and initialization hasn't finished yet. + Log.e( + TAG, + "Unable to add view to WindowManager. Display with id " + + mDisplayId + + " does not exist anymore", + e); + } mOrientationHandle.setVisibility(View.GONE); logNavbarOrientation("initSecondaryHomeHandleForRotation"); diff --git a/packages/SystemUI/src/com/android/systemui/qs/flags/QsDetailedView.kt b/packages/SystemUI/src/com/android/systemui/qs/flags/QsDetailedView.kt index ffeec4e0480c..c302cb21f77f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/flags/QsDetailedView.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/flags/QsDetailedView.kt @@ -79,6 +79,14 @@ object QsDetailedView { @JvmStatic inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) + /** + * Called to ensure code is only run when the flag is enabled. This will throw an exception if + * the flag is not enabled to ensure that the refactor author catches issues in testing. + * Caution!! Using this check incorrectly will cause crashes in nextfood builds! + */ + @JvmStatic + inline fun assertInNewMode() = RefactorFlagUtils.assertInNewMode(isEnabled, FLAG_NAME) + /** Returns a developer-readable string that describes the current requirement list. */ @JvmStatic fun requirementDescription(): String { diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/startable/QSPipelineCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/startable/QSPipelineCoreStartable.kt index 9677d47b38e8..3b3fb9b10052 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/startable/QSPipelineCoreStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/startable/QSPipelineCoreStartable.kt @@ -23,6 +23,7 @@ import com.android.systemui.qs.pipeline.domain.interactor.AutoAddInteractor import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor import com.android.systemui.qs.pipeline.domain.interactor.RestoreReconciliationInteractor import com.android.systemui.qs.pipeline.shared.QSPipelineFlagsRepository +import com.android.systemui.qs.shared.QSSettingsPackageRepository import javax.inject.Inject @SysUISingleton @@ -33,12 +34,14 @@ constructor( private val accessibilityTilesInteractor: AccessibilityTilesInteractor, private val autoAddInteractor: AutoAddInteractor, private val featureFlags: QSPipelineFlagsRepository, + private val settingsPackageRepository: QSSettingsPackageRepository, private val restoreReconciliationInteractor: RestoreReconciliationInteractor, ) : CoreStartable { override fun start() { accessibilityTilesInteractor.init(currentTilesInteractor) autoAddInteractor.init(currentTilesInteractor) + settingsPackageRepository.init() restoreReconciliationInteractor.start() } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/shared/QSSettingsPackageRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/shared/QSSettingsPackageRepository.kt new file mode 100644 index 000000000000..592e9dadcb92 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/shared/QSSettingsPackageRepository.kt @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.shared + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.os.UserHandle +import android.provider.Settings +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.user.data.repository.UserRepository +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * Provides the cached package name of the default Settings application. + * + * This repository retrieves and stores the package name to avoid repeated lookups. The package name + * is retrieved in a background thread when the `init()` method is called. + */ +@SysUISingleton +@Suppress("ShadeDisplayAwareContextChecker") +class QSSettingsPackageRepository +@Inject +constructor( + private val context: Context, + @Background private val backgroundScope: CoroutineScope, + private val userRepository: UserRepository, +) { + private var settingsPackageName: String? = null + + /** + * Initializes the repository by determining and caching the package name of the Settings app. + */ + fun init() { + backgroundScope.launch { + val mainUserId = userRepository.mainUserId + val mainUserContext = + context.createContextAsUser(UserHandle.of(mainUserId), /* flags */ 0) + val pm = mainUserContext.packageManager + settingsPackageName = + pm.queryIntentActivities( + Intent(Settings.ACTION_SETTINGS), + PackageManager.MATCH_SYSTEM_ONLY or PackageManager.MATCH_DEFAULT_ONLY, + ) + .firstOrNull() + ?.activityInfo + ?.packageName ?: DEFAULT_SETTINGS_PACKAGE_NAME + } + } + + /** + * Returns the cached package name of the Settings app. + * + * If the package name has not been initialized yet, this method will return the default + * Settings package name. + * + * @return The package name of the Settings app. + */ + fun getSettingsPackageName(): String { + return settingsPackageName ?: DEFAULT_SETTINGS_PACKAGE_NAME + } + + companion object { + private const val DEFAULT_SETTINGS_PACKAGE_NAME = "com.android.settings" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorCorrectionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorCorrectionTile.java index c2e609ddfc3a..1f936810da28 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorCorrectionTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorCorrectionTile.java @@ -38,6 +38,7 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QsEventLogger; import com.android.systemui.qs.UserSettingObserver; import com.android.systemui.qs.logging.QSLogger; +import com.android.systemui.qs.shared.QSSettingsPackageRepository; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.settings.UserTracker; @@ -53,6 +54,7 @@ public class ColorCorrectionTile extends QSTileImpl<BooleanState> { @Nullable private Icon mIcon = null; private final UserSettingObserver mSetting; + private final QSSettingsPackageRepository mQSSettingsPackageRepository; @Inject public ColorCorrectionTile( @@ -66,11 +68,13 @@ public class ColorCorrectionTile extends QSTileImpl<BooleanState> { ActivityStarter activityStarter, QSLogger qsLogger, UserTracker userTracker, - SecureSettings secureSettings + SecureSettings secureSettings, + QSSettingsPackageRepository qsSettingsPackageRepository ) { super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); + mQSSettingsPackageRepository = qsSettingsPackageRepository; mSetting = new UserSettingObserver(secureSettings, mHandler, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, userTracker.getUserId()) { @Override @@ -106,7 +110,8 @@ public class ColorCorrectionTile extends QSTileImpl<BooleanState> { @Override public Intent getLongClickIntent() { - return new Intent(Settings.ACTION_COLOR_CORRECTION_SETTINGS); + return new Intent(Settings.ACTION_COLOR_CORRECTION_SETTINGS) + .setPackage(mQSSettingsPackageRepository.getSettingsPackageName()); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java index ce80133e67a2..38e9a205e9ed 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java @@ -39,6 +39,7 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QsEventLogger; import com.android.systemui.qs.UserSettingObserver; import com.android.systemui.qs.logging.QSLogger; +import com.android.systemui.qs.shared.QSSettingsPackageRepository; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.settings.UserTracker; @@ -51,6 +52,7 @@ public class ColorInversionTile extends QSTileImpl<BooleanState> { public static final String TILE_SPEC = "inversion"; private final UserSettingObserver mSetting; + private final QSSettingsPackageRepository mQSSettingsPackageRepository; @Inject public ColorInversionTile( @@ -64,11 +66,13 @@ public class ColorInversionTile extends QSTileImpl<BooleanState> { ActivityStarter activityStarter, QSLogger qsLogger, UserTracker userTracker, - SecureSettings secureSettings + SecureSettings secureSettings, + QSSettingsPackageRepository qsSettingsPackageRepository ) { super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); + mQSSettingsPackageRepository = qsSettingsPackageRepository; mSetting = new UserSettingObserver(secureSettings, mHandler, Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, userTracker.getUserId()) { @Override @@ -104,7 +108,8 @@ public class ColorInversionTile extends QSTileImpl<BooleanState> { @Override public Intent getLongClickIntent() { - return new Intent(Settings.ACTION_COLOR_INVERSION_SETTINGS); + return new Intent(Settings.ACTION_COLOR_INVERSION_SETTINGS) + .setPackage(mQSSettingsPackageRepository.getSettingsPackageName()); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt index 43e84a0ee2b4..4050f2a1cb4e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt @@ -34,6 +34,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSHost import com.android.systemui.qs.QsEventLogger import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.qs.shared.QSSettingsPackageRepository import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.res.R import com.android.systemui.statusbar.phone.SystemUIDialog @@ -56,6 +57,7 @@ constructor( private val keyguardStateController: KeyguardStateController, private val dialogTransitionAnimator: DialogTransitionAnimator, private val fontScalingDialogDelegateProvider: Provider<FontScalingDialogDelegate>, + private val settingsPackageRepository: QSSettingsPackageRepository, ) : QSTileImpl<QSTile.State?>( host, @@ -118,6 +120,7 @@ constructor( override fun getLongClickIntent(): Intent? { return Intent(Settings.ACTION_TEXT_READING_SETTINGS) + .setPackage(settingsPackageRepository.getSettingsPackageName()) } override fun getTileLabel(): CharSequence { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java index 7516ca030d4b..b21c3e4e44e1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java @@ -54,20 +54,21 @@ public class InternetAdapter extends RecyclerView.Adapter<InternetAdapter.Intern private static final String TAG = "InternetAdapter"; - private final InternetDialogController mInternetDialogController; + private final InternetDetailsContentController mInternetDetailsContentController; private final CoroutineScope mCoroutineScope; @Nullable private List<WifiEntry> mWifiEntries; @VisibleForTesting protected int mWifiEntriesCount; @VisibleForTesting - protected int mMaxEntriesCount = InternetDialogController.MAX_WIFI_ENTRY_COUNT; + protected int mMaxEntriesCount = InternetDetailsContentController.MAX_WIFI_ENTRY_COUNT; protected View mHolderView; protected Context mContext; - public InternetAdapter(InternetDialogController controller, CoroutineScope coroutineScope) { - mInternetDialogController = controller; + public InternetAdapter(InternetDetailsContentController controller, + CoroutineScope coroutineScope) { + mInternetDetailsContentController = controller; mCoroutineScope = coroutineScope; } @@ -77,7 +78,8 @@ public class InternetAdapter extends RecyclerView.Adapter<InternetAdapter.Intern mContext = viewGroup.getContext(); mHolderView = LayoutInflater.from(mContext).inflate(R.layout.internet_list_item, viewGroup, false); - return new InternetViewHolder(mHolderView, mInternetDialogController, mCoroutineScope); + return new InternetViewHolder(mHolderView, mInternetDetailsContentController, + mCoroutineScope); } @Override @@ -137,16 +139,17 @@ public class InternetAdapter extends RecyclerView.Adapter<InternetAdapter.Intern final TextView mWifiSummaryText; final ImageView mWifiEndIcon; final Context mContext; - final InternetDialogController mInternetDialogController; + final InternetDetailsContentController mInternetDetailsContentController; final CoroutineScope mCoroutineScope; @Nullable private Job mJob; - InternetViewHolder(View view, InternetDialogController internetDialogController, + InternetViewHolder(View view, + InternetDetailsContentController internetDetailsContentController, CoroutineScope coroutineScope) { super(view); mContext = view.getContext(); - mInternetDialogController = internetDialogController; + mInternetDetailsContentController = internetDetailsContentController; mCoroutineScope = coroutineScope; mContainerLayout = view.requireViewById(R.id.internet_container); mWifiListLayout = view.requireViewById(R.id.wifi_list); @@ -169,7 +172,7 @@ public class InternetAdapter extends RecyclerView.Adapter<InternetAdapter.Intern mWifiListLayout.setEnabled(shouldEnabled(wifiEntry)); if (connectedState != WifiEntry.CONNECTED_STATE_DISCONNECTED) { mWifiListLayout.setOnClickListener( - v -> mInternetDialogController.launchWifiDetailsSetting( + v -> mInternetDetailsContentController.launchWifiDetailsSetting( wifiEntry.getKey(), v)); return; } @@ -193,7 +196,7 @@ public class InternetAdapter extends RecyclerView.Adapter<InternetAdapter.Intern if (mJob == null) { mJob = WifiUtils.checkWepAllowed(mContext, mCoroutineScope, wifiEntry.getSsid(), WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, intent -> { - mInternetDialogController.startActivityForDialog(intent); + mInternetDetailsContentController.startActivityForDialog(intent); return null; }, () -> { wifiConnect(wifiEntry, view); @@ -211,19 +214,20 @@ public class InternetAdapter extends RecyclerView.Adapter<InternetAdapter.Intern true /* connectForCaller */); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - mInternetDialogController.startActivityForDialog(intent); + mInternetDetailsContentController.startActivityForDialog(intent); return; } if (wifiEntry.canConnect()) { - mInternetDialogController.connect(wifiEntry); + mInternetDetailsContentController.connect(wifiEntry); return; } if (wifiEntry.isSaved()) { Log.w(TAG, "The saved Wi-Fi network does not allow to connect. SSID:" + wifiEntry.getSsid()); - mInternetDialogController.launchWifiDetailsSetting(wifiEntry.getKey(), view); + mInternetDetailsContentController.launchWifiDetailsSetting(wifiEntry.getKey(), + view); } } @@ -239,7 +243,7 @@ public class InternetAdapter extends RecyclerView.Adapter<InternetAdapter.Intern @Nullable Drawable getWifiDrawable(@NonNull WifiEntry wifiEntry) { - Drawable drawable = mInternetDialogController.getWifiDrawable(wifiEntry); + Drawable drawable = mInternetDetailsContentController.getWifiDrawable(wifiEntry); if (drawable == null) { return null; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDetailsContentController.java index 7036ef914a1c..23210ef0e688 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDetailsContentController.java @@ -117,9 +117,9 @@ import javax.inject.Inject; /** * Controller for Internet Dialog. */ -public class InternetDialogController implements AccessPointController.AccessPointCallback { +public class InternetDetailsContentController implements AccessPointController.AccessPointCallback { - private static final String TAG = "InternetDialogController"; + private static final String TAG = "InternetDetailsContentController"; private static final String ACTION_WIFI_SCANNING_SETTINGS = "android.settings.WIFI_SCANNING_SETTINGS"; /** @@ -244,7 +244,8 @@ public class InternetDialogController implements AccessPointController.AccessPoi } @Inject - public InternetDialogController(@ShadeDisplayAware Context context, UiEventLogger uiEventLogger, + public InternetDetailsContentController(@ShadeDisplayAware Context context, + UiEventLogger uiEventLogger, ActivityStarter starter, AccessPointController accessPointController, SubscriptionManager subscriptionManager, TelephonyManager telephonyManager, @Nullable WifiManager wifiManager, ConnectivityManager connectivityManager, @@ -260,7 +261,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi FeatureFlags featureFlags ) { if (DEBUG) { - Log.d(TAG, "Init InternetDialogController"); + Log.d(TAG, "Init InternetDetailsContentController"); } mHandler = handler; mWorkerHandler = workerHandler; @@ -1108,13 +1109,13 @@ public class InternetDialogController implements AccessPointController.AccessPoi static class WifiEntryConnectCallback implements WifiEntry.ConnectCallback { final ActivityStarter mActivityStarter; final WifiEntry mWifiEntry; - final InternetDialogController mInternetDialogController; + final InternetDetailsContentController mInternetDetailsContentController; WifiEntryConnectCallback(ActivityStarter activityStarter, WifiEntry connectWifiEntry, - InternetDialogController internetDialogController) { + InternetDetailsContentController internetDetailsContentController) { mActivityStarter = activityStarter; mWifiEntry = connectWifiEntry; - mInternetDialogController = internetDialogController; + mInternetDetailsContentController = internetDetailsContentController; } @Override @@ -1129,7 +1130,8 @@ public class InternetDialogController implements AccessPointController.AccessPoi intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mActivityStarter.startActivity(intent, false /* dismissShade */); } else if (status == CONNECT_STATUS_FAILURE_UNKNOWN) { - mInternetDialogController.makeOverlayToast(R.string.wifi_failed_connect_message); + mInternetDetailsContentController.makeOverlayToast( + R.string.wifi_failed_connect_message); } else { if (DEBUG) { Log.d(TAG, "connect failure reason=" + status); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java index 5e9deec58c58..82367ebb8c76 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java @@ -17,7 +17,7 @@ package com.android.systemui.qs.tiles.dialog; import static com.android.settingslib.satellite.SatelliteDialogUtils.TYPE_IS_WIFI; import static com.android.systemui.Prefs.Key.QS_HAS_TURNED_OFF_MOBILE_DATA; -import static com.android.systemui.qs.tiles.dialog.InternetDialogController.MAX_WIFI_ENTRY_COUNT; +import static com.android.systemui.qs.tiles.dialog.InternetDetailsContentController.MAX_WIFI_ENTRY_COUNT; import android.app.AlertDialog; import android.content.Context; @@ -90,9 +90,9 @@ import java.util.concurrent.Executor; /** * Dialog for showing mobile network, connected Wi-Fi network and Wi-Fi networks. */ -public class InternetDialogDelegate implements +public class InternetDialogDelegateLegacy implements SystemUIDialog.Delegate, - InternetDialogController.InternetDialogCallback { + InternetDetailsContentController.InternetDialogCallback { private static final String TAG = "InternetDialog"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -120,7 +120,7 @@ public class InternetDialogDelegate implements @Nullable private AlertDialog mAlertDialog; private final UiEventLogger mUiEventLogger; - private final InternetDialogController mInternetDialogController; + private final InternetDetailsContentController mInternetDetailsContentController; private TextView mInternetDialogTitle; private TextView mInternetDialogSubTitle; private View mDivider; @@ -184,7 +184,7 @@ public class InternetDialogDelegate implements @AssistedFactory public interface Factory { - InternetDialogDelegate create( + InternetDialogDelegateLegacy create( @Assisted(ABOVE_STATUS_BAR) boolean aboveStatusBar, @Assisted(CAN_CONFIG_MOBILE_DATA) boolean canConfigMobileData, @Assisted(CAN_CONFIG_WIFI) boolean canConfigWifi, @@ -192,10 +192,10 @@ public class InternetDialogDelegate implements } @AssistedInject - public InternetDialogDelegate( + public InternetDialogDelegateLegacy( @ShadeDisplayAware Context context, InternetDialogManager internetDialogManager, - InternetDialogController internetDialogController, + InternetDetailsContentController internetDetailsContentController, @Assisted(CAN_CONFIG_MOBILE_DATA) boolean canConfigMobileData, @Assisted(CAN_CONFIG_WIFI) boolean canConfigWifi, @Assisted(ABOVE_STATUS_BAR) boolean aboveStatusBar, @@ -207,6 +207,8 @@ public class InternetDialogDelegate implements KeyguardStateController keyguardStateController, SystemUIDialog.Factory systemUIDialogFactory, ShadeDialogContextInteractor shadeDialogContextInteractor) { + // TODO: b/377388104 QsDetailedView.assertInLegacyMode(); + mAboveStatusBar = aboveStatusBar; mSystemUIDialogFactory = systemUIDialogFactory; mShadeDialogContextInteractor = shadeDialogContextInteractor; @@ -218,8 +220,8 @@ public class InternetDialogDelegate implements mHandler = handler; mBackgroundExecutor = executor; mInternetDialogManager = internetDialogManager; - mInternetDialogController = internetDialogController; - mDefaultDataSubId = mInternetDialogController.getDefaultDataSubscriptionId(); + mInternetDetailsContentController = internetDetailsContentController; + mDefaultDataSubId = mInternetDetailsContentController.getDefaultDataSubscriptionId(); mCanConfigMobileData = canConfigMobileData; mCanConfigWifi = canConfigWifi; mCanChangeWifiState = WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context); @@ -227,7 +229,7 @@ public class InternetDialogDelegate implements mCoroutineScope = coroutineScope; mUiEventLogger = uiEventLogger; mDialogTransitionAnimator = dialogTransitionAnimator; - mAdapter = new InternetAdapter(mInternetDialogController, coroutineScope); + mAdapter = new InternetAdapter(mInternetDetailsContentController, coroutineScope); } @Override @@ -309,7 +311,8 @@ public class InternetDialogDelegate implements setOnClickListener(dialog); mTurnWifiOnLayout.setBackground(null); mAirplaneModeButton.setVisibility( - mInternetDialogController.isAirplaneModeEnabled() ? View.VISIBLE : View.GONE); + mInternetDetailsContentController.isAirplaneModeEnabled() ? View.VISIBLE + : View.GONE); mWifiRecyclerView.setLayoutManager(new LinearLayoutManager(context)); mWifiRecyclerView.setAdapter(mAdapter); @@ -324,7 +327,7 @@ public class InternetDialogDelegate implements mLifecycleRegistry.setCurrentState(Lifecycle.State.RESUMED); - mInternetDialogController.onStart(this, mCanConfigWifi); + mInternetDetailsContentController.onStart(this, mCanConfigWifi); if (!mCanConfigWifi) { hideWifiViews(); } @@ -356,7 +359,7 @@ public class InternetDialogDelegate implements mDoneButton.setOnClickListener(null); mShareWifiButton.setOnClickListener(null); mAirplaneModeButton.setOnClickListener(null); - mInternetDialogController.onStop(); + mInternetDetailsContentController.onStop(); mInternetDialogManager.destroyDialog(); } @@ -413,18 +416,20 @@ public class InternetDialogDelegate implements internetContent.mInternetDialogSubTitle = getSubtitleText(); if (shouldUpdateMobileNetwork) { internetContent.mActiveNetworkIsCellular = - mInternetDialogController.activeNetworkIsCellular(); + mInternetDetailsContentController.activeNetworkIsCellular(); internetContent.mIsCarrierNetworkActive = - mInternetDialogController.isCarrierNetworkActive(); - } - internetContent.mIsAirplaneModeEnabled = mInternetDialogController.isAirplaneModeEnabled(); - internetContent.mHasEthernet = mInternetDialogController.hasEthernet(); - internetContent.mIsWifiEnabled = mInternetDialogController.isWifiEnabled(); - internetContent.mHasActiveSubIdOnDds = mInternetDialogController.hasActiveSubIdOnDds(); - internetContent.mIsDeviceLocked = mInternetDialogController.isDeviceLocked(); - internetContent.mIsWifiScanEnabled = mInternetDialogController.isWifiScanEnabled(); + mInternetDetailsContentController.isCarrierNetworkActive(); + } + internetContent.mIsAirplaneModeEnabled = + mInternetDetailsContentController.isAirplaneModeEnabled(); + internetContent.mHasEthernet = mInternetDetailsContentController.hasEthernet(); + internetContent.mIsWifiEnabled = mInternetDetailsContentController.isWifiEnabled(); + internetContent.mHasActiveSubIdOnDds = + mInternetDetailsContentController.hasActiveSubIdOnDds(); + internetContent.mIsDeviceLocked = mInternetDetailsContentController.isDeviceLocked(); + internetContent.mIsWifiScanEnabled = mInternetDetailsContentController.isWifiScanEnabled(); internetContent.mActiveAutoSwitchNonDdsSubId = - mInternetDialogController.getActiveAutoSwitchNonDdsSubId(); + mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); return internetContent; } @@ -432,8 +437,8 @@ public class InternetDialogDelegate implements InternetContent internetContent = new InternetContent(); internetContent.mInternetDialogTitleString = getDialogTitleText(); internetContent.mInternetDialogSubTitle = getSubtitleText(); - internetContent.mIsWifiEnabled = mInternetDialogController.isWifiEnabled(); - internetContent.mIsDeviceLocked = mInternetDialogController.isDeviceLocked(); + internetContent.mIsWifiEnabled = mInternetDetailsContentController.isWifiEnabled(); + internetContent.mIsDeviceLocked = mInternetDetailsContentController.isDeviceLocked(); return internetContent; } @@ -447,15 +452,15 @@ public class InternetDialogDelegate implements if (autoSwitchNonDdsSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { showTurnOffAutoDataSwitchDialog(dialog, autoSwitchNonDdsSubId); } - mInternetDialogController.connectCarrierNetwork(); + mInternetDetailsContentController.connectCarrierNetwork(); }); mMobileDataToggle.setOnClickListener(v -> { boolean isChecked = mMobileDataToggle.isChecked(); if (!isChecked && shouldShowMobileDialog()) { mMobileDataToggle.setChecked(true); showTurnOffMobileDialog(dialog); - } else if (mInternetDialogController.isMobileDataEnabled() != isChecked) { - mInternetDialogController.setMobileDataEnabled( + } else if (mInternetDetailsContentController.isMobileDataEnabled() != isChecked) { + mInternetDetailsContentController.setMobileDataEnabled( dialog.getContext(), mDefaultDataSubId, isChecked, false); } }); @@ -466,12 +471,13 @@ public class InternetDialogDelegate implements }); mDoneButton.setOnClickListener(v -> dialog.dismiss()); mShareWifiButton.setOnClickListener(v -> { - if (mInternetDialogController.mayLaunchShareWifiSettings(mConnectedWifiEntry, v)) { + if (mInternetDetailsContentController.mayLaunchShareWifiSettings(mConnectedWifiEntry, + v)) { mUiEventLogger.log(InternetDialogEvent.SHARE_WIFI_QS_BUTTON_CLICKED); } }); mAirplaneModeButton.setOnClickListener(v -> { - mInternetDialogController.setAirplaneModeDisabled(); + mInternetDetailsContentController.setAirplaneModeDisabled(); }); } @@ -495,10 +501,10 @@ public class InternetDialogDelegate implements } private void setWifiEnable(boolean isChecked) { - if (mInternetDialogController.isWifiEnabled() == isChecked) { + if (mInternetDetailsContentController.isWifiEnabled() == isChecked) { return; } - mInternetDialogController.setWifiEnabled(isChecked); + mInternetDetailsContentController.setWifiEnabled(isChecked); } @MainThread @@ -534,7 +540,7 @@ public class InternetDialogDelegate implements } } else { mMobileNetworkLayout.setVisibility(View.VISIBLE); - mMobileDataToggle.setChecked(mInternetDialogController.isMobileDataEnabled()); + mMobileDataToggle.setChecked(mInternetDetailsContentController.isMobileDataEnabled()); mMobileTitleText.setText(getMobileNetworkTitle(mDefaultDataSubId)); String summary = getMobileNetworkSummary(mDefaultDataSubId); if (!TextUtils.isEmpty(summary)) { @@ -679,10 +685,10 @@ public class InternetDialogDelegate implements mConnectedWifiTitleText.setText(mConnectedWifiEntry.getTitle()); mConnectedWifiSummaryText.setText(mConnectedWifiEntry.getSummary(false)); mConnectedWifiIcon.setImageDrawable( - mInternetDialogController.getInternetWifiDrawable(mConnectedWifiEntry)); + mInternetDetailsContentController.getInternetWifiDrawable(mConnectedWifiEntry)); mWifiSettingsIcon.setColorFilter( mDialog.getContext().getColor(R.color.connected_network_primary_color)); - if (mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull( + if (mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( mConnectedWifiEntry) != null) { mShareWifiButton.setVisibility(View.VISIBLE); } else { @@ -748,7 +754,7 @@ public class InternetDialogDelegate implements if (TextUtils.isEmpty(mWifiScanNotifyText.getText())) { final AnnotationLinkSpan.LinkInfo linkInfo = new AnnotationLinkSpan.LinkInfo( AnnotationLinkSpan.LinkInfo.DEFAULT_ANNOTATION, - mInternetDialogController::launchWifiScanningSetting); + mInternetDetailsContentController::launchWifiScanningSetting); mWifiScanNotifyText.setText(AnnotationLinkSpan.linkify( mDialog.getContext().getText(R.string.wifi_scan_notify_message), linkInfo)); mWifiScanNotifyText.setMovementMethod(LinkMovementMethod.getInstance()); @@ -760,37 +766,38 @@ public class InternetDialogDelegate implements if (mConnectedWifiEntry == null) { return; } - mInternetDialogController.launchWifiDetailsSetting(mConnectedWifiEntry.getKey(), view); + mInternetDetailsContentController.launchWifiDetailsSetting(mConnectedWifiEntry.getKey(), + view); } /** For DSDS auto data switch **/ void onClickConnectedSecondarySub(View view) { - mInternetDialogController.launchMobileNetworkSettings(view); + mInternetDetailsContentController.launchMobileNetworkSettings(view); } void onClickSeeMoreButton(View view) { - mInternetDialogController.launchNetworkSetting(view); + mInternetDetailsContentController.launchNetworkSetting(view); } CharSequence getDialogTitleText() { - return mInternetDialogController.getDialogTitleText(); + return mInternetDetailsContentController.getDialogTitleText(); } @Nullable CharSequence getSubtitleText() { - return mInternetDialogController.getSubtitleText(mIsProgressBarVisible); + return mInternetDetailsContentController.getSubtitleText(mIsProgressBarVisible); } private Drawable getSignalStrengthDrawable(int subId) { - return mInternetDialogController.getSignalStrengthDrawable(subId); + return mInternetDetailsContentController.getSignalStrengthDrawable(subId); } CharSequence getMobileNetworkTitle(int subId) { - return mInternetDialogController.getMobileNetworkTitle(subId); + return mInternetDetailsContentController.getMobileNetworkTitle(subId); } String getMobileNetworkSummary(int subId) { - return mInternetDialogController.getMobileNetworkSummary(subId); + return mInternetDetailsContentController.getMobileNetworkSummary(subId); } private void setProgressBarVisible(boolean visible) { @@ -810,7 +817,7 @@ public class InternetDialogDelegate implements } boolean flag = Prefs.getBoolean(mDialog.getContext(), QS_HAS_TURNED_OFF_MOBILE_DATA, false); - if (mInternetDialogController.isMobileDataEnabled() && !flag) { + if (mInternetDetailsContentController.isMobileDataEnabled() && !flag) { return true; } return false; @@ -819,7 +826,8 @@ public class InternetDialogDelegate implements private void showTurnOffMobileDialog(SystemUIDialog dialog) { Context context = dialog.getContext(); CharSequence carrierName = getMobileNetworkTitle(mDefaultDataSubId); - boolean isInService = mInternetDialogController.isVoiceStateInService(mDefaultDataSubId); + boolean isInService = mInternetDetailsContentController.isVoiceStateInService( + mDefaultDataSubId); if (TextUtils.isEmpty(carrierName) || !isInService) { carrierName = context.getString(R.string.mobile_data_disable_message_default_carrier); } @@ -831,7 +839,7 @@ public class InternetDialogDelegate implements .setPositiveButton( com.android.internal.R.string.alert_windows_notification_turn_off_action, (d, w) -> { - mInternetDialogController.setMobileDataEnabled(context, + mInternetDetailsContentController.setMobileDataEnabled(context, mDefaultDataSubId, false, false); mMobileDataToggle.setChecked(false); Prefs.putBoolean(context, QS_HAS_TURNED_OFF_MOBILE_DATA, true); @@ -858,7 +866,7 @@ public class InternetDialogDelegate implements }) .setPositiveButton(R.string.auto_data_switch_dialog_positive_button, (d, w) -> { - mInternetDialogController + mInternetDetailsContentController .setAutoDataSwitchMobileDataPolicy(subId, false); if (mSecondaryMobileNetworkLayout != null) { mSecondaryMobileNetworkLayout.setVisibility(View.GONE); @@ -938,7 +946,7 @@ public class InternetDialogDelegate implements @Nullable WifiEntry connectedEntry, boolean hasMoreWifiEntries) { // Should update the carrier network layout when it is connected under airplane mode ON. boolean shouldUpdateCarrierNetwork = mMobileNetworkLayout.getVisibility() == View.VISIBLE - && mInternetDialogController.isAirplaneModeEnabled(); + && mInternetDetailsContentController.isAirplaneModeEnabled(); mHandler.post(() -> { mConnectedWifiEntry = connectedEntry; mWifiEntriesCount = wifiEntries == null ? 0 : wifiEntries.size(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt index f6749715e1fd..8a54648f4541 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt @@ -32,13 +32,13 @@ import kotlinx.coroutines.cancel private const val TAG = "InternetDialogFactory" private val DEBUG = Log.isLoggable(TAG, Log.DEBUG) -/** Factory to create [InternetDialogDelegate] objects. */ +/** Factory to create [InternetDialogDelegateLegacy] objects. */ @SysUISingleton class InternetDialogManager @Inject constructor( private val dialogTransitionAnimator: DialogTransitionAnimator, - private val dialogFactory: InternetDialogDelegate.Factory, + private val dialogFactory: InternetDialogDelegateLegacy.Factory, @Background private val bgDispatcher: CoroutineDispatcher, ) { private lateinit var coroutineScope: CoroutineScope @@ -48,8 +48,8 @@ constructor( } /** - * Creates a [InternetDialogDelegate]. The dialog will be animated from [expandable] if it is - * not null. + * Creates a [InternetDialogDelegateLegacy]. The dialog will be animated from [expandable] if + * it is not null. */ fun create( aboveStatusBar: Boolean, @@ -64,6 +64,7 @@ constructor( return } else { coroutineScope = CoroutineScope(bgDispatcher + newTracingContext("InternetDialogScope")) + // TODO: b/377388104 check the QsDetailedView flag to use the correct dialogFactory dialog = dialogFactory .create(aboveStatusBar, canConfigMobileData, canConfigWifi, coroutineScope) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionUserActionInteractor.kt index dfdec3b458a9..b774643eb21d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionUserActionInteractor.kt @@ -19,6 +19,7 @@ package com.android.systemui.qs.tiles.impl.colorcorrection.domain.interactor import android.content.Intent import android.provider.Settings import com.android.systemui.accessibility.data.repository.ColorCorrectionRepository +import com.android.systemui.qs.shared.QSSettingsPackageRepository import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.interactor.QSTileInput import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor @@ -32,21 +33,20 @@ class ColorCorrectionUserActionInteractor constructor( private val colorCorrectionRepository: ColorCorrectionRepository, private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler, + private val settingsPackageRepository: QSSettingsPackageRepository, ) : QSTileUserActionInteractor<ColorCorrectionTileModel> { override suspend fun handleInput(input: QSTileInput<ColorCorrectionTileModel>): Unit = with(input) { when (action) { is QSTileUserAction.Click -> { - colorCorrectionRepository.setIsEnabled( - !data.isEnabled, - user, - ) + colorCorrectionRepository.setIsEnabled(!data.isEnabled, user) } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( action.expandable, Intent(Settings.ACTION_COLOR_CORRECTION_SETTINGS) + .setPackage(settingsPackageRepository.getSettingsPackageName()), ) } is QSTileUserAction.ToggleClick -> {} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingTileUserActionInteractor.kt index 6ab5796dceaa..0ebb51e722af 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingTileUserActionInteractor.kt @@ -24,6 +24,7 @@ import com.android.systemui.animation.DialogCuj import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.qs.shared.QSSettingsPackageRepository import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.interactor.QSTileInput import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor @@ -46,6 +47,7 @@ constructor( private val keyguardStateController: KeyguardStateController, private val dialogTransitionAnimator: DialogTransitionAnimator, private val activityStarter: ActivityStarter, + private val settingsPackageRepository: QSSettingsPackageRepository, ) : QSTileUserActionInteractor<FontScalingTileModel> { override suspend fun handleInput(input: QSTileInput<FontScalingTileModel>): Unit = @@ -63,7 +65,7 @@ constructor( ?.dialogTransitionController( DialogCuj( InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG + INTERACTION_JANK_TAG, ) ) ?.let { dialogTransitionAnimator.show(dialog, it) } ?: dialog.show() @@ -78,7 +80,7 @@ constructor( /* cancelAction= */ null, /* dismissShade= */ true, /* afterKeyguardGone= */ true, - /* deferred= */ false + /* deferred= */ false, ) } } @@ -86,6 +88,7 @@ constructor( qsTileIntentUserActionHandler.handle( action.expandable, Intent(Settings.ACTION_TEXT_READING_SETTINGS) + .setPackage(settingsPackageRepository.getSettingsPackageName()), ) } is QSTileUserAction.ToggleClick -> {} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractor.kt index aa8387732160..f78349718697 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractor.kt @@ -19,6 +19,7 @@ package com.android.systemui.qs.tiles.impl.inversion.domain.interactor import android.content.Intent import android.provider.Settings import com.android.systemui.accessibility.data.repository.ColorInversionRepository +import com.android.systemui.qs.shared.QSSettingsPackageRepository import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.interactor.QSTileInput import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor @@ -32,21 +33,20 @@ class ColorInversionUserActionInteractor constructor( private val colorInversionRepository: ColorInversionRepository, private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler, + private val settingsPackageRepository: QSSettingsPackageRepository, ) : QSTileUserActionInteractor<ColorInversionTileModel> { override suspend fun handleInput(input: QSTileInput<ColorInversionTileModel>): Unit = with(input) { when (action) { is QSTileUserAction.Click -> { - colorInversionRepository.setIsEnabled( - !data.isEnabled, - user, - ) + colorInversionRepository.setIsEnabled(!data.isEnabled, user) } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( action.expandable, Intent(Settings.ACTION_COLOR_INVERSION_SETTINGS) + .setPackage(settingsPackageRepository.getSettingsPackageName()), ) } is QSTileUserAction.ToggleClick -> {} 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 8ef51af18881..c0c0aea073f1 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 @@ -16,8 +16,10 @@ package com.android.systemui.qs.ui.viewmodel +import androidx.compose.runtime.getValue import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.lifecycle.Hydrator import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.domain.interactor.ShadeInteractor @@ -28,6 +30,8 @@ import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch /** * Models UI state used to render the content of the quick settings shade overlay. @@ -44,10 +48,21 @@ constructor( quickSettingsContainerViewModelFactory: QuickSettingsContainerViewModel.Factory, ) : ExclusiveActivatable() { + private val hydrator = Hydrator("QuickSettingsContainerViewModel.hydrator") + + val showHeader: Boolean by + hydrator.hydratedStateOf( + traceName = "showHeader", + initialValue = !shadeInteractor.isShadeLayoutWide.value, + source = shadeInteractor.isShadeLayoutWide.map { !it }, + ) + val quickSettingsContainerViewModel = quickSettingsContainerViewModelFactory.create(false) override suspend fun onActivated(): Nothing { coroutineScope { + launch { hydrator.activate() } + launch { sceneInteractor.currentScene.collect { currentScene -> when (currentScene) { diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt index 1c232e9ddced..3696b133000c 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt @@ -22,7 +22,6 @@ import android.net.Uri import android.util.Log import androidx.appcompat.content.res.AppCompatResources import com.android.internal.logging.UiEventLogger -import com.android.systemui.Flags.screenshotContextUrl import com.android.systemui.log.DebugLogger.debugLog import com.android.systemui.res.R import com.android.systemui.screenshot.ActionIntentCreator.createEdit @@ -33,6 +32,7 @@ import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_SHARE_TAPPED import com.android.systemui.screenshot.ui.viewmodel.ActionButtonAppearance import com.android.systemui.screenshot.ui.viewmodel.PreviewAction +import com.android.systemui.shared.Flags.screenshotContextUrl import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject diff --git a/packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java b/packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java index 10ac2cf76763..0650f8606ba9 100644 --- a/packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java @@ -16,8 +16,6 @@ package com.android.systemui.scrim; -import static com.android.systemui.Flags.notificationShadeBlur; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; @@ -216,7 +214,7 @@ public class ScrimDrawable extends Drawable { public void draw(@NonNull Canvas canvas) { mPaint.setColor(mMainColor); mPaint.setAlpha(mAlpha); - if (notificationShadeBlur() || WindowBlurFlag.isEnabled()) { + if (WindowBlurFlag.isEnabled()) { // TODO (b/381263600), wire this at ScrimController, move it to PrimaryBouncerTransition mPaint.setAlpha((int) (0.5f * mAlpha)); } diff --git a/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java b/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java index 0f80e7432a54..03a8d17847f9 100644 --- a/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java +++ b/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java @@ -16,8 +16,6 @@ package com.android.systemui.scrim; -import static com.android.systemui.Flags.notificationShadeBlur; - import static java.lang.Float.isNaN; import android.annotation.NonNull; @@ -44,6 +42,7 @@ import com.android.internal.colorextraction.ColorExtractor; import com.android.systemui.res.R; import com.android.systemui.shade.TouchLogger; import com.android.systemui.util.LargeScreenUtils; +import com.android.systemui.window.flag.WindowBlurFlag; import java.util.concurrent.Executor; @@ -253,7 +252,7 @@ public class ScrimView extends View { if (mBlendWithMainColor) { mainTinted = ColorUtils.blendARGB(mColors.getMainColor(), mTintColor, tintAmount); } - if (notificationShadeBlur()) { + if (WindowBlurFlag.isEnabled()) { int layerAbove = ColorUtils.setAlphaComponent( getResources().getColor(R.color.shade_panel, null), (int) (0.4f * 255)); diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDialogContextInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDialogContextInteractor.kt index 201dc0339a0a..4edba2785e89 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDialogContextInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDialogContextInteractor.kt @@ -77,7 +77,17 @@ constructor( private fun getContextOrDefault(displayId: Int): Context { return try { traceSection({ "Getting dialog context for displayId=$displayId" }) { - displayWindowPropertyRepository.get().get(displayId, DIALOG_WINDOW_TYPE).context + val displayWindowProperties = + displayWindowPropertyRepository.get().get(displayId, DIALOG_WINDOW_TYPE) + if (displayWindowProperties == null) { + Log.e( + TAG, + "DisplayWindowPropertiesRepository returned null for display $displayId. Returning default one", + ) + defaultContext + } else { + displayWindowProperties.context + } } } catch (e: Exception) { // This can happen if the display was disconnected in the meantime. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index d523bc1867c2..48cf7a83c324 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -48,6 +48,9 @@ import com.android.systemui.statusbar.notification.SourceType; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; +import com.android.systemui.statusbar.notification.shared.NotificationMinimalism; +import com.android.systemui.statusbar.notification.shelf.NotificationShelfBackgroundView; +import com.android.systemui.statusbar.notification.shelf.NotificationShelfIconContainer; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.ExpandableViewState; @@ -76,7 +79,11 @@ public class NotificationShelf extends ActivatableNotificationView { private static final SourceType BASE_VALUE = SourceType.from("BaseValue"); private static final SourceType SHELF_SCROLL = SourceType.from("ShelfScroll"); - private NotificationIconContainer mShelfIcons; + @VisibleForTesting + public NotificationShelfIconContainer mShelfIcons; + // This field hides mBackgroundNormal from super class for short-shelf alignment + @VisibleForTesting + public NotificationShelfBackgroundView mBackgroundNormal; private boolean mHideBackground; private int mStatusBarHeight; private boolean mEnableNotificationClipping; @@ -116,6 +123,8 @@ public class NotificationShelf extends ActivatableNotificationView { mShelfIcons.setClipChildren(false); mShelfIcons.setClipToPadding(false); + mBackgroundNormal = (NotificationShelfBackgroundView) super.mBackgroundNormal; + setClipToActualHeight(false); setClipChildren(false); setClipToPadding(false); @@ -268,19 +277,37 @@ public class NotificationShelf extends ActivatableNotificationView { } } - private void setActualWidth(float actualWidth) { + /** + * Set the actual width of the shelf, this will only differ from width for short shelves. + */ + @VisibleForTesting + public void setActualWidth(float actualWidth) { setBackgroundWidth((int) actualWidth); if (mShelfIcons != null) { + mShelfIcons.setAlignToEnd(isAlignedToEnd()); mShelfIcons.setActualLayoutWidth((int) actualWidth); } mActualWidth = actualWidth; } @Override + public void setBackgroundWidth(int width) { + super.setBackgroundWidth(width); + if (!NotificationMinimalism.isEnabled()) { + return; + } + if (mBackgroundNormal != null) { + mBackgroundNormal.setAlignToEnd(isAlignedToEnd()); + } + } + + @Override public void getBoundsOnScreen(Rect outRect, boolean clipToParent) { super.getBoundsOnScreen(outRect, clipToParent); final int actualWidth = getActualWidth(); - if (isLayoutRtl()) { + final boolean alignedToRight = NotificationMinimalism.isEnabled() ? isAlignedToRight() : + isLayoutRtl(); + if (alignedToRight) { outRect.left = outRect.right - actualWidth; } else { outRect.right = outRect.left + actualWidth; @@ -326,11 +353,17 @@ public class NotificationShelf extends ActivatableNotificationView { */ @Override public boolean pointInView(float localX, float localY, float slop) { - final float containerWidth = getWidth(); - final float shelfWidth = getActualWidth(); + final float left, right; - final float left = isLayoutRtl() ? containerWidth - shelfWidth : 0; - final float right = isLayoutRtl() ? containerWidth : shelfWidth; + if (NotificationMinimalism.isEnabled()) { + left = getShelfLeftBound(); + right = getShelfRightBound(); + } else { + final float containerWidth = getWidth(); + final float shelfWidth = getActualWidth(); + left = isLayoutRtl() ? containerWidth - shelfWidth : 0; + right = isLayoutRtl() ? containerWidth : shelfWidth; + } final float top = mClipTopAmount; final float bottom = getActualHeight(); @@ -339,10 +372,53 @@ public class NotificationShelf extends ActivatableNotificationView { && isYInView(localY, slop, top, bottom); } + /** + * @return The left boundary of the shelf. + */ + @VisibleForTesting + public float getShelfLeftBound() { + if (isAlignedToRight()) { + return getWidth() - getActualWidth(); + } else { + return 0; + } + } + + /** + * @return The right boundary of the shelf. + */ + @VisibleForTesting + public float getShelfRightBound() { + if (isAlignedToRight()) { + return getWidth(); + } else { + return getActualWidth(); + } + } + + @VisibleForTesting + public boolean isAlignedToRight() { + return isAlignedToEnd() ^ isLayoutRtl(); + } + + /** + * When notification minimalism is on, on split shade, we want the notification shelf to align + * to the layout end (right for LTR; left for RTL). + * @return whether to align with the minimalism split shade style + */ + @VisibleForTesting + public boolean isAlignedToEnd() { + if (!NotificationMinimalism.isEnabled()) { + return false; + } + return mAmbientState.getUseSplitShade(); + } + @Override public void updateBackgroundColors() { super.updateBackgroundColors(); ColorUpdateLogger colorUpdateLogger = ColorUpdateLogger.getInstance(); + if (colorUpdateLogger != null) { colorUpdateLogger.logEvent("Shelf.updateBackgroundColors()", "normalBgColor=" + hexColorString(getNormalBgColor()) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerText.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerText.kt new file mode 100644 index 000000000000..a747abbc6a6e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerText.kt @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.chips.ui.compose + +import android.os.SystemClock +import android.text.format.DateUtils.formatElapsedTime +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.Measurable +import androidx.compose.ui.layout.MeasureResult +import androidx.compose.ui.layout.MeasureScope +import androidx.compose.ui.node.LayoutModifierNode +import androidx.compose.ui.node.ModifierNodeElement +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.Constraints +import androidx.compose.ui.unit.constrain +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.delay + +/** Platform-optimized interface for getting current time */ +fun interface TimeSource { + fun getCurrentTime(): Long +} + +/** Holds and manages the state for a Chronometer */ +class ChronometerState(private val timeSource: TimeSource, private val startTimeMillis: Long) { + private var currentTimeMillis by mutableLongStateOf(0L) + private val elapsedTimeMillis: Long + get() = maxOf(0L, currentTimeMillis - startTimeMillis) + + val currentTimeText: String by derivedStateOf { formatElapsedTime(elapsedTimeMillis / 1000) } + + suspend fun run() { + while (true) { + currentTimeMillis = timeSource.getCurrentTime() + val delaySkewMillis = (currentTimeMillis - startTimeMillis) % 1000L + delay(1000L - delaySkewMillis) + } + } +} + +/** Remember and manage the ChronometerState */ +@Composable +fun rememberChronometerState(timeSource: TimeSource, startTimeMillis: Long): ChronometerState { + val state = + remember(timeSource, startTimeMillis) { ChronometerState(timeSource, startTimeMillis) } + val lifecycleOwner = LocalLifecycleOwner.current + LaunchedEffect(lifecycleOwner, timeSource, startTimeMillis) { + lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { state.run() } + } + + return state +} + +/** + * A composable chronometer that displays elapsed time with constrained width. The width of the text + * is only allowed to increase. This ensures there is no visual jitter when individual digits in the + * text change due to the timer ticking. + */ +@Composable +fun ChronometerText( + startTimeMillis: Long, + modifier: Modifier = Modifier, + color: Color = Color.Unspecified, + style: TextStyle = LocalTextStyle.current, + timeSource: TimeSource = remember { TimeSource { SystemClock.elapsedRealtime() } }, +) { + val state = rememberChronometerState(timeSource, startTimeMillis) + Text( + text = state.currentTimeText, + style = style, + color = color, + modifier = modifier.neverDecreaseWidth(), + ) +} + +/** A modifier that ensures the width of the content only increases and never decreases. */ +private fun Modifier.neverDecreaseWidth(): Modifier { + return this.then(neverDecreaseWidthElement) +} + +private data object neverDecreaseWidthElement : ModifierNodeElement<NeverDecreaseWidthNode>() { + override fun create(): NeverDecreaseWidthNode { + return NeverDecreaseWidthNode() + } + + override fun update(node: NeverDecreaseWidthNode) { + error("This should never be called") + } +} + +private class NeverDecreaseWidthNode : Modifier.Node(), LayoutModifierNode { + private var minWidth = 0 + + override fun MeasureScope.measure( + measurable: Measurable, + constraints: Constraints, + ): MeasureResult { + val placeable = measurable.measure(Constraints(minWidth = minWidth).constrain(constraints)) + val width = placeable.width + val height = placeable.height + + minWidth = maxOf(minWidth, width) + + return layout(width, height) { placeable.place(0, 0) } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt index d24eddaf321f..d25ca285c53b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/CommandQueueInitializer.kt @@ -72,7 +72,7 @@ constructor( private fun initializeStatusBarForDisplay(displayId: Int, result: RegisterStatusBarResult) { if ((result.mTransientBarTypes and WindowInsets.Type.statusBars()) != 0) { - statusBarModeRepository.forDisplay(displayId).showTransient() + statusBarModeRepository.forDisplay(displayId)?.showTransient() } val commandQueueCallbacks = commandQueueCallbacksLazy.get() commandQueueCallbacks.onSystemBarAttributesChanged( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarter.kt index 9e9a38e87924..b057fb0433fe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarter.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarter.kt @@ -89,21 +89,26 @@ constructor( } private fun createAndStartOrchestratorForDisplay(displayId: Int) { + val statusBarModeRepository = statusBarModeRepositoryStore.forDisplay(displayId) ?: return + val statusBarInitializer = initializerStore.forDisplay(displayId) ?: return + val statusBarWindowController = + statusBarWindowControllerStore.forDisplay(displayId) ?: return + val autoHideController = autoHideControllerStore.forDisplay(displayId) ?: return statusBarOrchestratorFactory .create( displayId, displayScopeRepository.scopeForDisplay(displayId), statusBarWindowStateRepositoryStore.forDisplay(displayId), - statusBarModeRepositoryStore.forDisplay(displayId), - initializerStore.forDisplay(displayId), - statusBarWindowControllerStore.forDisplay(displayId), - autoHideControllerStore.forDisplay(displayId), + statusBarModeRepository, + statusBarInitializer, + statusBarWindowController, + autoHideController, ) .start() } private fun createAndStartInitializerForDisplay(displayId: Int) { - statusBarInitializerStore.forDisplay(displayId).start() + statusBarInitializerStore.forDisplay(displayId)?.start() } private fun startPrivacyDotForDisplay(displayId: Int) { @@ -111,6 +116,6 @@ constructor( // For the default display, privacy dot is started via ScreenDecorations return } - privacyDotWindowControllerStore.forDisplay(displayId).start() + privacyDotWindowControllerStore.forDisplay(displayId)?.start() } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt index 4c54fc49e536..1e127ee054e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt @@ -20,9 +20,11 @@ import android.view.ViewGroup import androidx.annotation.VisibleForTesting import com.android.systemui.CoreStartable import com.android.systemui.fragments.FragmentHostManager +import com.android.systemui.plugins.DarkIconDispatcher import com.android.systemui.res.R import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewUpdatedListener +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController import com.android.systemui.statusbar.data.repository.StatusBarModePerDisplayRepository import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions import com.android.systemui.statusbar.phone.PhoneStatusBarView @@ -34,7 +36,6 @@ import com.android.systemui.statusbar.window.StatusBarWindowController import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import java.lang.IllegalStateException import javax.inject.Provider /** @@ -75,6 +76,8 @@ interface StatusBarInitializer : CoreStartable { fun create( statusBarWindowController: StatusBarWindowController, statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, + statusBarConfigurationController: StatusBarConfigurationController, + darkIconDispatcher: DarkIconDispatcher, ): StatusBarInitializer } } @@ -84,6 +87,8 @@ class StatusBarInitializerImpl constructor( @Assisted private val statusBarWindowController: StatusBarWindowController, @Assisted private val statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, + @Assisted private val statusBarConfigurationController: StatusBarConfigurationController, + @Assisted private val darkIconDispatcher: DarkIconDispatcher, private val collapsedStatusBarFragmentProvider: Provider<CollapsedStatusBarFragment>, private val statusBarRootFactory: StatusBarRootFactory, private val componentFactory: HomeStatusBarComponent.Factory, @@ -131,23 +136,32 @@ constructor( -> val phoneStatusBarView = cv.findViewById<PhoneStatusBarView>(R.id.status_bar) component = - componentFactory.create(phoneStatusBarView).also { component -> - // CollapsedStatusBarFragment used to be responsible initializing - component.init() - - statusBarViewUpdatedListener?.onStatusBarViewUpdated( - component.phoneStatusBarViewController, - component.phoneStatusBarTransitions, + componentFactory + .create( + phoneStatusBarView, + statusBarConfigurationController, + statusBarWindowController, + darkIconDispatcher, ) - - if (StatusBarConnectedDisplays.isEnabled) { - statusBarModePerDisplayRepository.onStatusBarViewInitialized(component) - } else { - creationListeners.forEach { listener -> - listener.onStatusBarViewInitialized(component) + .also { component -> + // CollapsedStatusBarFragment used to be responsible initializing + component.init() + + statusBarViewUpdatedListener?.onStatusBarViewUpdated( + component.phoneStatusBarViewController, + component.phoneStatusBarTransitions, + ) + + if (StatusBarConnectedDisplays.isEnabled) { + statusBarModePerDisplayRepository.onStatusBarViewInitialized( + component + ) + } else { + creationListeners.forEach { listener -> + listener.onStatusBarViewInitialized(component) + } } } - } } // Add the new compose view to the hierarchy because we don't use fragment transactions @@ -163,9 +177,11 @@ constructor( CollapsedStatusBarFragment.TAG, object : FragmentHostManager.FragmentListener { override fun onFragmentViewCreated(tag: String, fragment: Fragment) { - component = - (fragment as CollapsedStatusBarFragment).homeStatusBarComponent - ?: throw IllegalStateException() + val statusBarFragment = fragment as CollapsedStatusBarFragment + if (statusBarFragment.homeStatusBarComponent == null) { + return + } + component = fragment.homeStatusBarComponent statusBarViewUpdatedListener?.onStatusBarViewUpdated( component!!.phoneStatusBarViewController, component!!.phoneStatusBarTransitions, @@ -195,6 +211,8 @@ constructor( override fun create( statusBarWindowController: StatusBarWindowController, statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, + statusBarConfigurationController: StatusBarConfigurationController, + darkIconDispatcher: DarkIconDispatcher, ): StatusBarInitializerImpl } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializerStore.kt index 4f815c1f0b31..de6cd072afd7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializerStore.kt @@ -22,6 +22,8 @@ import com.android.systemui.display.data.repository.DisplayRepository import com.android.systemui.display.data.repository.PerDisplayStore import com.android.systemui.display.data.repository.PerDisplayStoreImpl import com.android.systemui.display.data.repository.SingleDisplayStore +import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import javax.inject.Inject @@ -39,6 +41,8 @@ constructor( private val factory: StatusBarInitializer.Factory, private val statusBarWindowControllerStore: StatusBarWindowControllerStore, private val statusBarModeRepositoryStore: StatusBarModeRepositoryStore, + private val statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore, + private val darkIconDispatcherStore: DarkIconDispatcherStore, ) : StatusBarInitializerStore, PerDisplayStoreImpl<StatusBarInitializer>(backgroundApplicationScope, displayRepository) { @@ -47,10 +51,19 @@ constructor( StatusBarConnectedDisplays.assertInNewMode() } - override fun createInstanceForDisplay(displayId: Int): StatusBarInitializer { + override fun createInstanceForDisplay(displayId: Int): StatusBarInitializer? { + val statusBarWindowController = + statusBarWindowControllerStore.forDisplay(displayId) ?: return null + val statusBarModePerDisplayRepository = + statusBarModeRepositoryStore.forDisplay(displayId) ?: return null + val statusBarConfigurationController = + statusBarConfigurationControllerStore.forDisplay(displayId) ?: return null + val darkIconDispatcher = darkIconDispatcherStore.forDisplay(displayId) ?: return null return factory.create( - statusBarWindowController = statusBarWindowControllerStore.forDisplay(displayId), - statusBarModePerDisplayRepository = statusBarModeRepositoryStore.forDisplay(displayId), + statusBarWindowController, + statusBarModePerDisplayRepository, + statusBarConfigurationController, + darkIconDispatcher, ) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/DarkIconDispatcherStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/DarkIconDispatcherStore.kt index 8183a487cee2..041f3c816149 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/DarkIconDispatcherStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/DarkIconDispatcherStore.kt @@ -65,8 +65,9 @@ constructor( StatusBarConnectedDisplays.assertInNewMode() } - override fun createInstanceForDisplay(displayId: Int): SysuiDarkIconDispatcher { - val properties = displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) + override fun createInstanceForDisplay(displayId: Int): SysuiDarkIconDispatcher? { + val properties = + displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) ?: return null return factory.create(displayId, properties.context) } @@ -103,7 +104,7 @@ constructor(private val store: SysuiDarkIconDispatcherStore) : DarkIconDispatche override val defaultDisplay: DarkIconDispatcher get() = store.defaultDisplay - override fun forDisplay(displayId: Int): DarkIconDispatcher = store.forDisplay(displayId) + override fun forDisplay(displayId: Int): DarkIconDispatcher? = store.forDisplay(displayId) } @Module diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/LightBarControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/LightBarControllerStore.kt index e4987555833b..c629d10b90b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/LightBarControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/LightBarControllerStore.kt @@ -49,13 +49,16 @@ constructor( LightBarControllerStore, PerDisplayStoreImpl<LightBarController>(backgroundApplicationScope, displayRepository) { - override fun createInstanceForDisplay(displayId: Int): LightBarController { + override fun createInstanceForDisplay(displayId: Int): LightBarController? { + val darkIconDispatcher = darkIconDispatcherStore.forDisplay(displayId) ?: return null + val statusBarModePerDisplayRepository = + statusBarModeRepositoryStore.forDisplay(displayId) ?: return null return factory .create( displayId, displayScopeRepository.scopeForDisplay(displayId), - darkIconDispatcherStore.forDisplay(displayId), - statusBarModeRepositoryStore.forDisplay(displayId), + darkIconDispatcher, + statusBarModePerDisplayRepository, ) .also { it.start() } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotViewControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotViewControllerStore.kt index bd61c44e3d9b..d48c94bd0893 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotViewControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotViewControllerStore.kt @@ -52,11 +52,14 @@ constructor( PrivacyDotViewControllerStore, PerDisplayStoreImpl<PrivacyDotViewController>(backgroundApplicationScope, displayRepository) { - override fun createInstanceForDisplay(displayId: Int): PrivacyDotViewController { + override fun createInstanceForDisplay(displayId: Int): PrivacyDotViewController? { + val configurationController = + statusBarConfigurationControllerStore.forDisplay(displayId) ?: return null + val contentInsetsProvider = contentInsetsProviderStore.forDisplay(displayId) ?: return null return factory.create( displayScopeRepository.scopeForDisplay(displayId), - statusBarConfigurationControllerStore.forDisplay(displayId), - contentInsetsProviderStore.forDisplay(displayId), + configurationController, + contentInsetsProvider, ) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotWindowControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotWindowControllerStore.kt index a1f56552629b..086cc99957ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotWindowControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotWindowControllerStore.kt @@ -58,15 +58,18 @@ constructor( StatusBarConnectedDisplays.assertInNewMode() } - override fun createInstanceForDisplay(displayId: Int): PrivacyDotWindowController { + override fun createInstanceForDisplay(displayId: Int): PrivacyDotWindowController? { if (displayId == Display.DEFAULT_DISPLAY) { throw IllegalArgumentException("This class should only be used for connected displays") } val displayWindowProperties = displayWindowPropertiesRepository.get(displayId, TYPE_NAVIGATION_BAR_PANEL) + ?: return null + val privacyDotViewController = + privacyDotViewControllerStore.forDisplay(displayId) ?: return null return windowControllerFactory.create( displayId = displayId, - privacyDotViewController = privacyDotViewControllerStore.forDisplay(displayId), + privacyDotViewController = privacyDotViewController, viewCaptureAwareWindowManager = viewCaptureAwareWindowManagerFactory.create(displayWindowProperties.windowManager), inflater = displayWindowProperties.layoutInflater, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt index 6cf2c73a7138..38cea832ad76 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStore.kt @@ -62,9 +62,9 @@ constructor( StatusBarConnectedDisplays.assertInNewMode() } - override fun createInstanceForDisplay(displayId: Int): StatusBarConfigurationController { + override fun createInstanceForDisplay(displayId: Int): StatusBarConfigurationController? { val displayWindowProperties = - displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) + displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) ?: return null return configurationControllerFactory.create(displayWindowProperties.context) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt index e471b12c1d58..554c46f6c219 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt @@ -59,13 +59,17 @@ constructor( displayRepository, ) { - override fun createInstanceForDisplay(displayId: Int): StatusBarContentInsetsProvider { - val context = displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR).context + override fun createInstanceForDisplay(displayId: Int): StatusBarContentInsetsProvider? { + val displayWindowProperties = + displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) ?: return null + val context = displayWindowProperties.context + val configurationController = + statusBarConfigurationControllerStore.forDisplay(displayId) ?: return null val cameraProtectionLoader = cameraProtectionLoaderFactory.create(context) return factory .create( context, - statusBarConfigurationControllerStore.forDisplay(displayId), + configurationController, sysUICutoutProviderFactory.create(context, cameraProtectionLoader), ) .also { it.start() } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/SystemEventChipAnimationControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/SystemEventChipAnimationControllerStore.kt index 7760f58805c9..ffc125539521 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/SystemEventChipAnimationControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/SystemEventChipAnimationControllerStore.kt @@ -62,11 +62,17 @@ constructor( StatusBarConnectedDisplays.assertInNewMode() } - override fun createInstanceForDisplay(displayId: Int): SystemEventChipAnimationController { + override fun createInstanceForDisplay(displayId: Int): SystemEventChipAnimationController? { + val displayWindowProperties = + displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) ?: return null + val statusBarWindowController = + statusBarWindowControllerStore.forDisplay(displayId) ?: return null + val contentInsetsProvider = + statusBarContentInsetsProviderStore.forDisplay(displayId) ?: return null return factory.create( - displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR).context, - statusBarWindowControllerStore.forDisplay(displayId), - statusBarContentInsetsProviderStore.forDisplay(displayId), + displayWindowProperties.context, + statusBarWindowController, + contentInsetsProvider, ) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/MultiDisplaySystemEventChipAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/MultiDisplaySystemEventChipAnimationController.kt index f2bb7b16439d..4b9721ea4fe5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/MultiDisplaySystemEventChipAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/MultiDisplaySystemEventChipAnimationController.kt @@ -72,5 +72,5 @@ constructor( } private fun controllersForAllDisplays() = - displayRepository.displays.value.map { controllerStore.forDisplay(it.displayId) } + displayRepository.displays.value.mapNotNull { controllerStore.forDisplay(it.displayId) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotWindowController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotWindowController.kt index 9928ac67f185..f7799bb75ae0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotWindowController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotWindowController.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.events +import android.util.Log import android.view.Display import android.view.DisplayCutout.BOUNDS_POSITION_BOTTOM import android.view.DisplayCutout.BOUNDS_POSITION_LEFT @@ -23,6 +24,7 @@ import android.view.DisplayCutout.BOUNDS_POSITION_RIGHT import android.view.DisplayCutout.BOUNDS_POSITION_TOP import android.view.LayoutInflater import android.view.View +import android.view.WindowManager.InvalidDisplayException import android.view.WindowManager.LayoutParams.WRAP_CONTENT import android.widget.FrameLayout import com.android.app.viewcapture.ViewCaptureAwareWindowManager @@ -97,7 +99,17 @@ constructor( // PrivacyDotViewController expects the dot view to have a FrameLayout parent. val rootView = FrameLayout(context) rootView.addView(this) - viewCaptureAwareWindowManager.addView(rootView, params) + try { + // Wrapping this in a try/catch to avoid crashes when a display is instantly removed + // after being added, and initialization hasn't finished yet. + viewCaptureAwareWindowManager.addView(rootView, params) + } catch (e: InvalidDisplayException) { + Log.e( + TAG, + "Unable to add view to WM. Display with id $displayId does not exist anymore", + e, + ) + } } @AssistedFactory @@ -109,4 +121,8 @@ constructor( inflater: LayoutInflater, ): PrivacyDotWindowController } + + private companion object { + const val TAG = "PrivacyDotWindowController" + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractor.kt index 85c67f5b55a2..4e68bee295fc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractor.kt @@ -41,14 +41,14 @@ import kotlinx.coroutines.flow.stateIn class MediaControlChipInteractor @Inject constructor( - @Background private val applicationScope: CoroutineScope, + @Background private val backgroundScope: CoroutineScope, mediaFilterRepository: MediaFilterRepository, ) { private val currentMediaControls: StateFlow<List<MediaCommonModel.MediaControl>> = mediaFilterRepository.currentMedia .map { mediaList -> mediaList.filterIsInstance<MediaCommonModel.MediaControl>() } .stateIn( - scope = applicationScope, + scope = backgroundScope, started = SharingStarted.WhileSubscribed(), initialValue = emptyList(), ) @@ -64,7 +64,7 @@ constructor( ?.toMediaControlChipModel() } .stateIn( - scope = applicationScope, + scope = backgroundScope, started = SharingStarted.WhileSubscribed(), initialValue = null, ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModel.kt new file mode 100644 index 000000000000..3e854b4dbaf8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModel.kt @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.featurepods.media.ui.viewmodel + +import android.content.Context +import com.android.systemui.common.shared.model.ContentDescription +import com.android.systemui.common.shared.model.Icon +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.featurepods.media.domain.interactor.MediaControlChipInteractor +import com.android.systemui.statusbar.featurepods.media.shared.model.MediaControlChipModel +import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipId +import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel +import com.android.systemui.statusbar.featurepods.popups.ui.viewmodel.StatusBarPopupChipViewModel +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn + +/** + * [StatusBarPopupChipViewModel] for a media control chip in the status bar. This view model is + * responsible for converting the [MediaControlChipModel] to a [PopupChipModel] that can be used to + * display a media control chip. + */ +@SysUISingleton +class MediaControlChipViewModel +@Inject +constructor( + @Background private val backgroundScope: CoroutineScope, + @Application private val applicationContext: Context, + mediaControlChipInteractor: MediaControlChipInteractor, +) : StatusBarPopupChipViewModel { + + /** + * A [StateFlow] of the current [PopupChipModel]. This flow emits a new [PopupChipModel] + * whenever the underlying [MediaControlChipModel] changes. + */ + override val chip: StateFlow<PopupChipModel> = + mediaControlChipInteractor.mediaControlModel + .map { mediaControlModel -> toPopupChipModel(mediaControlModel, applicationContext) } + .stateIn( + backgroundScope, + SharingStarted.WhileSubscribed(), + PopupChipModel.Hidden(PopupChipId.MediaControl), + ) +} + +private fun toPopupChipModel(model: MediaControlChipModel?, context: Context): PopupChipModel { + if (model == null || model.songName.isNullOrEmpty()) { + return PopupChipModel.Hidden(PopupChipId.MediaControl) + } + + val contentDescription = model.appName?.let { ContentDescription.Loaded(description = it) } + return PopupChipModel.Shown( + chipId = PopupChipId.MediaControl, + icon = + model.appIcon?.loadDrawable(context)?.let { + Icon.Loaded(drawable = it, contentDescription = contentDescription) + } + ?: Icon.Resource( + res = com.android.internal.R.drawable.ic_audio_media, + contentDescription = contentDescription, + ), + chipText = model.songName.toString(), + // TODO(b/385202114): Show a popup containing the media carousal when the chip is toggled. + onToggle = {}, + // TODO(b/385202193): Add support for clicking on the icon on a media chip. + onIconPressed = {}, + ) +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/StatusBarPopupChips.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/StatusBarPopupChips.kt index 9f523fc845ab..a9f72ff21a7c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/StatusBarPopupChips.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/StatusBarPopupChips.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.statusbar.chips.notification.shared +package com.android.systemui.statusbar.featurepods.popups import com.android.systemui.Flags import com.android.systemui.flags.FlagToken diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/shared/model/PopupChipModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/shared/model/PopupChipModel.kt index 1663aebd7287..0a6c4d0fd14f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/shared/model/PopupChipModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/shared/model/PopupChipModel.kt @@ -23,7 +23,7 @@ import com.android.systemui.common.shared.model.Icon * displaying its popup at a time. */ sealed class PopupChipId(val value: String) { - data object MediaControls : PopupChipId("MediaControls") + data object MediaControl : PopupChipId("MediaControl") } /** Model for individual status bar popup chips. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopupChipsContainer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopupChipsContainer.kt new file mode 100644 index 000000000000..56bbd74af1c2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopupChipsContainer.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.featurepods.popups.ui.compose + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel + +/** Container view that holds all right hand side chips in the status bar. */ +@Composable +fun StatusBarPopupChipsContainer(chips: List<PopupChipModel.Shown>, modifier: Modifier = Modifier) { + // TODO(b/385353140): Add padding and spacing for this container according to UX specs. + Box { + Row(verticalAlignment = Alignment.CenterVertically) { + // TODO(b/385352859): Show `StatusBarPopupChip` here instead of `Text` once it is ready. + chips.forEach { chip -> Text(text = chip.chipText) } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModel.kt index b390f29b166c..caa8e6cc02c3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModel.kt @@ -18,13 +18,16 @@ package com.android.systemui.statusbar.featurepods.popups.ui.viewmodel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.statusbar.featurepods.media.ui.viewmodel.MediaControlChipViewModel +import com.android.systemui.statusbar.featurepods.popups.StatusBarPopupChips import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipId import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel 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.flowOf +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn @@ -33,16 +36,29 @@ import kotlinx.coroutines.flow.stateIn * PopupChipModels. */ @SysUISingleton -class StatusBarPopupChipsViewModel @Inject constructor(@Background scope: CoroutineScope) { +class StatusBarPopupChipsViewModel +@Inject +constructor( + @Background scope: CoroutineScope, + mediaControlChipViewModel: MediaControlChipViewModel, +) { private data class PopupChipBundle( - val media: PopupChipModel = PopupChipModel.Hidden(chipId = PopupChipId.MediaControls) + val media: PopupChipModel = PopupChipModel.Hidden(chipId = PopupChipId.MediaControl) ) - private val incomingPopupChipBundle: Flow<PopupChipBundle?> = - flowOf(null).stateIn(scope, SharingStarted.Lazily, PopupChipBundle()) + private val incomingPopupChipBundle: StateFlow<PopupChipBundle?> = + mediaControlChipViewModel.chip + .map { chip -> PopupChipBundle(media = chip) } + .stateIn(scope, SharingStarted.WhileSubscribed(), PopupChipBundle()) - val popupChips: Flow<List<PopupChipModel>> = - incomingPopupChipBundle - .map { _ -> listOf(null).filterIsInstance<PopupChipModel.Shown>() } - .stateIn(scope, SharingStarted.Lazily, emptyList()) + val shownPopupChips: StateFlow<List<PopupChipModel.Shown>> = + if (StatusBarPopupChips.isEnabled) { + incomingPopupChipBundle + .map { bundle -> + listOfNotNull(bundle?.media).filterIsInstance<PopupChipModel.Shown>() + } + .stateIn(scope, SharingStarted.WhileSubscribed(), emptyList()) + } else { + MutableStateFlow(emptyList<PopupChipModel.Shown>()).asStateFlow() + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/ConnectedDisplaysStatusBarNotificationIconViewStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/ConnectedDisplaysStatusBarNotificationIconViewStore.kt index 227a1fefb982..eb55856d994b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/ConnectedDisplaysStatusBarNotificationIconViewStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/ConnectedDisplaysStatusBarNotificationIconViewStore.kt @@ -62,8 +62,10 @@ constructor( override fun iconView(key: String): StatusBarIconView? { val entry = notifCollection.getEntry(key) ?: return null + val displayWindowProperties = + displayWindowPropertiesInteractor.getForStatusBar(displayId) ?: return null return cachedIcons.computeIfAbsent(key) { - val context = displayWindowPropertiesInteractor.getForStatusBar(displayId).context + val context = displayWindowProperties.context iconManager.createSbIconView(context, entry) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt index 2ba28a660116..e1032820fb71 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt @@ -68,13 +68,14 @@ constructor( .distinctUntilChanged() /** The colors with which to display the notification icons. */ - fun iconColors(displayId: Int): Flow<NotificationIconColors> = - darkIconInteractor + fun iconColors(displayId: Int): Flow<NotificationIconColors> { + return darkIconInteractor .darkState(displayId) .map { (areas: Collection<Rect>, tint: Int) -> IconColorsImpl(tint, areas) } .flowOn(bgContext) .conflate() .distinctUntilChanged() + } /** [NotificationIconsViewData] indicating which icons to display in the view. */ val icons: Flow<NotificationIconsViewData> = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java index e440d2728263..dd3a9c9dcf21 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java @@ -169,12 +169,12 @@ public class NotificationBackgroundView extends View implements Dumpable, && !mExpandAnimationRunning) { bottom -= mClipBottomAmount; } - final boolean isRtl = isLayoutRtl(); + final boolean alignedToRight = isAlignedToRight(); final int width = getWidth(); final int actualWidth = getActualWidth(); - int left = isRtl ? width - actualWidth : 0; - int right = isRtl ? width : actualWidth; + int left = alignedToRight ? width - actualWidth : 0; + int right = alignedToRight ? width : actualWidth; if (mExpandAnimationRunning) { // Horizontally center this background view inside of the container @@ -185,6 +185,15 @@ public class NotificationBackgroundView extends View implements Dumpable, return new Rect(left, top, right, bottom); } + /** + * @return Whether the background view should be right-aligned. This only matters if the + * actualWidth is different than the full (measured) width. In other words, this is used to + * define the short-shelf alignment. + */ + protected boolean isAlignedToRight() { + return isLayoutRtl(); + } + private void draw(Canvas canvas, Drawable drawable) { NotificationAddXOnHoverToDismiss.assertInLegacyMode(); @@ -196,12 +205,13 @@ public class NotificationBackgroundView extends View implements Dumpable, && !mExpandAnimationRunning) { bottom -= mClipBottomAmount; } - final boolean isRtl = isLayoutRtl(); + + final boolean alignedToRight = isAlignedToRight(); final int width = getWidth(); final int actualWidth = getActualWidth(); - int left = isRtl ? width - actualWidth : 0; - int right = isRtl ? width : actualWidth; + int left = alignedToRight ? width - actualWidth : 0; + int right = alignedToRight ? width : actualWidth; if (mExpandAnimationRunning) { // Horizontally center this background view inside of the container diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfBackgroundView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfBackgroundView.kt new file mode 100644 index 000000000000..d7eea0190e2e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfBackgroundView.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.shelf + +import android.content.Context +import android.util.AttributeSet +import androidx.annotation.VisibleForTesting +import com.android.systemui.statusbar.notification.row.NotificationBackgroundView +import com.android.systemui.statusbar.notification.shared.NotificationMinimalism + +/** The background view for the NotificationShelf. */ +class NotificationShelfBackgroundView +@JvmOverloads +constructor(context: Context, attrs: AttributeSet? = null) : + NotificationBackgroundView(context, attrs) { + + /** Whether the notification shelf is aligned to end, need to keep persistent with the shelf. */ + var alignToEnd = false + + /** @return whether the alignment of the notification shelf is right. */ + @VisibleForTesting + public override fun isAlignedToRight(): Boolean { + if (!NotificationMinimalism.isEnabled) { + return super.isAlignedToRight() + } + return alignToEnd xor isLayoutRtl + } + + override fun toDumpString(): String { + return super.toDumpString() + " alignToEnd=" + alignToEnd + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfIconContainer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfIconContainer.kt new file mode 100644 index 000000000000..5106cccc1755 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfIconContainer.kt @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.shelf + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import com.android.internal.annotations.VisibleForTesting +import com.android.systemui.statusbar.notification.shared.NotificationMinimalism +import com.android.systemui.statusbar.phone.NotificationIconContainer +import kotlin.math.max + +/** The NotificationIconContainer for the NotificationShelf. */ +class NotificationShelfIconContainer +@JvmOverloads +constructor(context: Context, attrs: AttributeSet? = null) : + NotificationIconContainer(context, attrs) { + + /** Whether the notification shelf is aligned to end. */ + var alignToEnd = false + + /** + * @return The left boundary (not the RTL compatible start) of the area that icons can be added. + */ + @VisibleForTesting + public override fun getLeftBound(): Float { + if (!NotificationMinimalism.isEnabled) { + return super.getLeftBound() + } + + if (isAlignedToRight) { + return (max(width - actualWidth, 0) + actualPaddingStart) + } + return actualPaddingStart + } + + /** + * @return The right boundary (not the RTL compatible end) of the area that icons can be added. + */ + @VisibleForTesting + public override fun getRightBound(): Float { + if (!NotificationMinimalism.isEnabled) { + return super.getRightBound() + } + + if (isAlignedToRight) { + return width - actualPaddingEnd + } + return actualWidth - actualPaddingEnd + } + + /** + * For RTL, the icons' x positions should be mirrored around the middle of the shelf so that the + * icons are also added to the shelf from right to left. This function should only be called + * when RTL. + */ + override fun getRtlIconTranslationX(iconState: IconState, iconView: View): Float { + if (!NotificationMinimalism.isEnabled) { + return super.getRtlIconTranslationX(iconState, iconView) + } + + if (!isLayoutRtl) { + return iconState.xTranslation + } + + if (isAlignedToRight) { + return width * 2 - actualWidth - iconState.xTranslation - iconView.width + } + return actualWidth - iconState.xTranslation - iconView.width + } + + @VisibleForTesting + val isAlignedToRight: Boolean + get() { + if (!NotificationMinimalism.isEnabled) { + return isLayoutRtl + } + return alignToEnd xor isLayoutRtl + } +} 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 38a70359e816..50e5a2352f43 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 @@ -866,9 +866,9 @@ public class NotificationStackScrollLayout y = (int) mAmbientState.getHeadsUpTop(); drawDebugInfo(canvas, y, Color.GREEN, /* label= */ "getHeadsUpTop() = " + y); - y += getTopHeadsUpHeight(); + y = (int) (mAmbientState.getStackTop() + mScrollViewFields.getIntrinsicStackHeight()); drawDebugInfo(canvas, y, Color.BLUE, - /* label= */ "getHeadsUpTop() + getTopHeadsUpHeight() = " + y); + /* label= */ "getStackTop() + getIntrinsicStackHeight() = " + y); return; // the rest of the fields are not important in Flexiglass } @@ -2612,20 +2612,13 @@ public class NotificationStackScrollLayout if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return; final int shelfIntrinsicHeight = mShelf != null ? mShelf.getIntrinsicHeight() : 0; - final int footerIntrinsicHeight = - mFooterView != null ? mFooterView.getIntrinsicHeight() : 0; final int notificationsHeight = (int) mNotificationStackSizeCalculator.computeHeight( /* notificationStackScrollLayout= */ this, mMaxDisplayedNotifications, shelfIntrinsicHeight ); - // When there is a limit in the max number of notifications, we never display the footer. - final int fullStackHeight = mMaxDisplayedNotifications != -1 - ? notificationsHeight - : notificationsHeight + footerIntrinsicHeight + mBottomPadding; - - if (mScrollViewFields.getIntrinsicStackHeight() != fullStackHeight) { - mScrollViewFields.setIntrinsicStackHeight(fullStackHeight); + if (mScrollViewFields.getIntrinsicStackHeight() != notificationsHeight) { + mScrollViewFields.setIntrinsicStackHeight(notificationsHeight); notifyStackHeightChangedListeners(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideControllerStore.kt index 744f96918eef..2ae38dd488bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideControllerStore.kt @@ -47,9 +47,9 @@ constructor( StatusBarConnectedDisplays.assertInNewMode() } - override fun createInstanceForDisplay(displayId: Int): AutoHideController { + override fun createInstanceForDisplay(displayId: Int): AutoHideController? { val displayWindowProperties = - displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) + displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) ?: return null return autoHideControllerFactory.create(displayWindowProperties.context) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarControllerImpl.java index ea67f1cdb60a..ca0c1ac9ce7c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarControllerImpl.java @@ -499,9 +499,9 @@ public class LightBarControllerImpl implements /** Creates a {@link LightBarControllerImpl}. */ LightBarControllerImpl create( int displayId, - CoroutineScope coroutineScope, - DarkIconDispatcher darkIconDispatcher, - StatusBarModePerDisplayRepository statusBarModePerDisplayRepository); + @NonNull CoroutineScope coroutineScope, + @NonNull DarkIconDispatcher darkIconDispatcher, + @NonNull StatusBarModePerDisplayRepository statusBarModePerDisplayRepository); } public static class LegacyFactory implements LightBarController.Factory { 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 ecd62bd6943b..c396512ce3a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -198,7 +198,7 @@ public class NotificationIconContainer extends ViewGroup { Paint paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); - canvas.drawRect(getActualPaddingStart(), 0, getLayoutEnd(), getHeight(), paint); + canvas.drawRect(getActualPaddingStart(), 0, getRightBound(), getHeight(), paint); if (DEBUG_OVERFLOW) { if (mLastVisibleIconState == null) { @@ -469,11 +469,11 @@ public class NotificationIconContainer extends ViewGroup { * If this is not a whole number, the fraction means by how much the icon is appearing. */ public void calculateIconXTranslations() { - float translationX = getActualPaddingStart(); + float translationX = getLeftBound(); int firstOverflowIndex = -1; int childCount = getChildCount(); int maxVisibleIcons = mMaxIcons; - float layoutEnd = getLayoutEnd(); + float layoutRight = getRightBound(); mVisualOverflowStart = 0; mFirstVisibleIconState = null; for (int i = 0; i < childCount; i++) { @@ -495,7 +495,7 @@ public class NotificationIconContainer extends ViewGroup { final boolean forceOverflow = shouldForceOverflow(i, mSpeedBumpIndex, iconState.iconAppearAmount, maxVisibleIcons); final boolean isOverflowing = forceOverflow || isOverflowing( - /* isLastChild= */ i == childCount - 1, translationX, layoutEnd, mIconSize); + /* isLastChild= */ i == childCount - 1, translationX, layoutRight, mIconSize); // First icon to overflow. if (firstOverflowIndex == -1 && isOverflowing) { @@ -536,8 +536,7 @@ public class NotificationIconContainer extends ViewGroup { for (int i = 0; i < childCount; i++) { View view = getChildAt(i); IconState iconState = mIconStates.get(view); - iconState.setXTranslation( - getWidth() - iconState.getXTranslation() - view.getWidth()); + iconState.setXTranslation(getRtlIconTranslationX(iconState, view)); } } if (mIsolatedIcon != null) { @@ -553,6 +552,11 @@ public class NotificationIconContainer extends ViewGroup { } } + /** We need this to keep icons ordered from right to left when RTL. */ + protected float getRtlIconTranslationX(IconState iconState, View iconView) { + return getWidth() - iconState.getXTranslation() - iconView.getWidth(); + } + private float getDrawingScale(View view) { return mUseIncreasedIconScale && view instanceof StatusBarIconView ? ((StatusBarIconView) view).getIconScaleIncreased() @@ -563,11 +567,21 @@ public class NotificationIconContainer extends ViewGroup { mUseIncreasedIconScale = useIncreasedIconScale; } - private float getLayoutEnd() { + /** + * @return The right boundary (not the RTL compatible end) of the area that icons can be added. + */ + protected float getRightBound() { return getActualWidth() - getActualPaddingEnd(); } - private float getActualPaddingEnd() { + /** + * @return The left boundary (not the RTL compatible start) of the area that icons can be added. + */ + protected float getLeftBound() { + return getActualPaddingStart(); + } + + protected float getActualPaddingEnd() { if (mActualPaddingEnd == NO_VALUE) { return getPaddingEnd(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt index 394502b2d31f..031754db3c57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt @@ -33,6 +33,7 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.plugins.DarkIconDispatcher import com.android.systemui.res.R +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore import com.android.systemui.statusbar.data.repository.SysuiDarkIconDispatcherStore import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange @@ -54,7 +55,7 @@ constructor( ) { /** Creates listener always using the same light color for overlay */ - fun createListener(view: View) = + fun createListener(view: View): StatusOverlayHoverListener = StatusOverlayHoverListener( view, configurationController, @@ -65,8 +66,10 @@ constructor( /** * Creates listener using [DarkIconDispatcher] to determine light or dark color of the overlay */ - fun createDarkAwareListener(view: View) = - createDarkAwareListener(view, view.darkIconDispatcher.darkChangeFlow()) + fun createDarkAwareListener(view: View): StatusOverlayHoverListener? { + val darkIconDispatcher = view.darkIconDispatcher ?: return null + return createDarkAwareListener(view, darkIconDispatcher.darkChangeFlow()) + } /** * Creates listener using [DarkIconDispatcher] to determine light or dark color of the overlay @@ -78,27 +81,34 @@ constructor( rightHoverMargin: Int = 0, topHoverMargin: Int = 0, bottomHoverMargin: Int = 0, - ) = - createDarkAwareListener( + ): StatusOverlayHoverListener? { + val darkIconDispatcher = view.darkIconDispatcher ?: return null + return createDarkAwareListener( view, - view.darkIconDispatcher.darkChangeFlow(), + darkIconDispatcher.darkChangeFlow(), leftHoverMargin, rightHoverMargin, topHoverMargin, bottomHoverMargin, ) + } /** * Creates listener using provided [DarkChange] producer to determine light or dark color of the * overlay */ - fun createDarkAwareListener(view: View, darkFlow: StateFlow<DarkChange>) = - StatusOverlayHoverListener( + fun createDarkAwareListener( + view: View, + darkFlow: StateFlow<DarkChange>, + ): StatusOverlayHoverListener? { + val configurationController = view.statusBarConfigurationController ?: return null + return StatusOverlayHoverListener( view, - view.statusBarConfigurationController, + configurationController, view.resources, darkFlow.map { toHoverTheme(view, it) }, ) + } private fun createDarkAwareListener( view: View, @@ -107,10 +117,11 @@ constructor( rightHoverMargin: Int = 0, topHoverMargin: Int = 0, bottomHoverMargin: Int = 0, - ) = - StatusOverlayHoverListener( + ): StatusOverlayHoverListener? { + val configurationController = view.statusBarConfigurationController ?: return null + return StatusOverlayHoverListener( view, - view.statusBarConfigurationController, + configurationController, view.resources, darkFlow.map { toHoverTheme(view, it) }, leftHoverMargin, @@ -118,11 +129,12 @@ constructor( topHoverMargin, bottomHoverMargin, ) + } - private val View.statusBarConfigurationController + private val View.statusBarConfigurationController: StatusBarConfigurationController? get() = statusBarConfigurationControllerStore.forDisplay(context.displayId) - private val View.darkIconDispatcher + private val View.darkIconDispatcher: SysuiDarkIconDispatcher? get() = darkIconDispatcherStore.forDisplay(context.displayId) private fun toHoverTheme(view: View, darkChange: DarkChange): HoverTheme { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt index 4f32aaa2654e..037dda91fb00 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt @@ -31,8 +31,10 @@ import com.android.systemui.statusbar.core.StatusBarInitializerImpl import com.android.systemui.statusbar.core.StatusBarInitializerStore import com.android.systemui.statusbar.core.StatusBarOrchestrator import com.android.systemui.statusbar.core.StatusBarRootModernization +import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore import com.android.systemui.statusbar.data.repository.PrivacyDotViewControllerStoreModule import com.android.systemui.statusbar.data.repository.PrivacyDotWindowControllerStoreModule +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore import com.android.systemui.statusbar.events.PrivacyDotViewControllerModule import com.android.systemui.statusbar.phone.AutoHideControllerStore @@ -107,10 +109,14 @@ interface StatusBarPhoneModule { implFactory: StatusBarInitializerImpl.Factory, statusBarWindowControllerStore: StatusBarWindowControllerStore, statusBarModeRepositoryStore: StatusBarModeRepositoryStore, + statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore, + darkIconDispatcherStore: DarkIconDispatcherStore, ): StatusBarInitializerImpl { return implFactory.create( statusBarWindowControllerStore.defaultDisplay, statusBarModeRepositoryStore.defaultDisplay, + statusBarConfigurationControllerStore.defaultDisplay, + darkIconDispatcherStore.defaultDisplay, ) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/data/repository/DarkIconRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/data/repository/DarkIconRepository.kt index 49356eba2842..04646549bfdc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/data/repository/DarkIconRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/data/repository/DarkIconRepository.kt @@ -15,12 +15,14 @@ */ package com.android.systemui.statusbar.phone.data.repository +import android.util.Log import com.android.systemui.dagger.SysUISingleton import com.android.systemui.statusbar.data.repository.SysuiDarkIconDispatcherStore import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange import dagger.Binds import dagger.Module import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow /** Dark-mode state for tinting icons. */ @@ -33,8 +35,22 @@ class DarkIconRepositoryImpl @Inject constructor(private val darkIconDispatcherStore: SysuiDarkIconDispatcherStore) : DarkIconRepository { - override fun darkState(displayId: Int): StateFlow<DarkChange> = - darkIconDispatcherStore.forDisplay(displayId).darkChangeFlow() + override fun darkState(displayId: Int): StateFlow<DarkChange> { + val perDisplayDakIconDispatcher = darkIconDispatcherStore.forDisplay(displayId) + if (perDisplayDakIconDispatcher == null) { + Log.e( + TAG, + "DarkIconDispatcher for display $displayId is null. Returning flow of " + + "DarkChange.EMPTY", + ) + return MutableStateFlow(DarkChange.EMPTY) + } + return perDisplayDakIconDispatcher.darkChangeFlow() + } + + private companion object { + const val TAG = "DarkIconRepositoryImpl" + } } @Module diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/domain/interactor/LightsOutInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/domain/interactor/LightsOutInteractor.kt index ed8b3e8922f3..b15fffb8dd29 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/domain/interactor/LightsOutInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/domain/interactor/LightsOutInteractor.kt @@ -34,8 +34,8 @@ class LightsOutInteractor @Inject constructor(private val repository: StatusBarModeRepositoryStore) { - fun isLowProfile(displayId: Int): Flow<Boolean> = - repository.forDisplay(displayId).statusBarMode.map { + fun isLowProfile(displayId: Int): Flow<Boolean>? = + repository.forDisplay(displayId)?.statusBarMode?.map { when (it) { StatusBarMode.LIGHTS_OUT, StatusBarMode.LIGHTS_OUT_TRANSPARENT -> true diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index d257288637df..c31e34c50b06 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -47,6 +47,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dump.DumpManager; +import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.res.R; import com.android.systemui.scene.shared.flag.SceneContainerFlag; @@ -59,6 +60,9 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; import com.android.systemui.statusbar.core.StatusBarConnectedDisplays; import com.android.systemui.statusbar.core.StatusBarRootModernization; +import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore; +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController; +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore; import com.android.systemui.statusbar.disableflags.DisableFlagsLogger; import com.android.systemui.statusbar.events.SystemStatusAnimationCallback; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; @@ -78,6 +82,8 @@ import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarVie import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarVisibilityChangeListener; import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel; import com.android.systemui.statusbar.policy.KeyguardStateController; +import com.android.systemui.statusbar.window.StatusBarWindowController; +import com.android.systemui.statusbar.window.StatusBarWindowControllerStore; import com.android.systemui.statusbar.window.StatusBarWindowStateController; import com.android.systemui.statusbar.window.StatusBarWindowStateListener; import com.android.systemui.util.CarrierConfigTracker; @@ -156,6 +162,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final NotificationIconContainerStatusBarViewBinder mNicViewBinder; private final DemoModeController mDemoModeController; + private final StatusBarWindowControllerStore mStatusBarWindowControllerStore; + private final StatusBarConfigurationControllerStore mStatusBarConfigurationControllerStore; + private final DarkIconDispatcherStore mDarkIconDispatcherStore; private List<String> mBlockedIcons = new ArrayList<>(); private Map<Startable, Startable.State> mStartableStates = new ArrayMap<>(); @@ -263,7 +272,10 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue DumpManager dumpManager, StatusBarWindowStateController statusBarWindowStateController, KeyguardUpdateMonitor keyguardUpdateMonitor, - DemoModeController demoModeController) { + DemoModeController demoModeController, + StatusBarWindowControllerStore statusBarWindowControllerStore, + StatusBarConfigurationControllerStore statusBarConfigurationControllerStore, + DarkIconDispatcherStore darkIconDispatcherStore) { mHomeStatusBarComponentFactory = homeStatusBarComponentFactory; mOngoingCallController = ongoingCallController; mAnimationScheduler = animationScheduler; @@ -287,6 +299,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue mStatusBarWindowStateController = statusBarWindowStateController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mDemoModeController = demoModeController; + mStatusBarWindowControllerStore = statusBarWindowControllerStore; + mStatusBarConfigurationControllerStore = statusBarConfigurationControllerStore; + mDarkIconDispatcherStore = darkIconDispatcherStore; } private final DemoMode mDemoModeCallback = new DemoMode() { @@ -337,8 +352,27 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mDumpManager.registerDumpable(getDumpableName(), this); - mHomeStatusBarComponent = mHomeStatusBarComponentFactory.create( - (PhoneStatusBarView) getView()); + int displayId = view.getContext().getDisplayId(); + StatusBarConfigurationController configurationController = + mStatusBarConfigurationControllerStore.forDisplay(displayId); + if (configurationController == null) { + return; + } + StatusBarWindowController statusBarWindowController = + mStatusBarWindowControllerStore.forDisplay(displayId); + if (statusBarWindowController == null) { + return; + } + DarkIconDispatcher darkIconDispatcher = mDarkIconDispatcherStore.forDisplay(displayId); + if (darkIconDispatcher == null) { + return; + } + mHomeStatusBarComponent = + mHomeStatusBarComponentFactory.create( + (PhoneStatusBarView) getView(), + configurationController, + statusBarWindowController, + darkIconDispatcher); mHomeStatusBarComponent.init(); mStartableStates.clear(); for (Startable startable : mHomeStatusBarComponent.getStartables()) { @@ -453,6 +487,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue @Override public void onResume() { super.onResume(); + if (mHomeStatusBarComponent == null) { + return; + } mCommandQueue.addCallback(this); mStatusBarStateController.addCallback(this); initOngoingCallChip(); @@ -468,6 +505,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue @Override public void onPause() { super.onPause(); + if (mHomeStatusBarComponent == null) { + return; + } mCommandQueue.removeCallback(this); mStatusBarStateController.removeCallback(this); if (!StatusBarRootModernization.isEnabled()) { @@ -480,6 +520,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue @Override public void onDestroyView() { super.onDestroyView(); + if (mHomeStatusBarComponent == null) { + return; + } mStatusBarIconController.removeIconGroup(mDarkIconManager); mCarrierConfigTracker.removeCallback(mCarrierConfigCallback); mCarrierConfigTracker.removeDataSubscriptionChangedListener(mDefaultDataListener); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java index f8ad0f2324bc..5837752abdaf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java @@ -20,6 +20,7 @@ import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.dagger.qualifiers.DisplaySpecific; import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.plugins.DarkIconDispatcher; +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController; import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor; import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; import com.android.systemui.statusbar.phone.LegacyLightsOutNotifController; @@ -29,6 +30,7 @@ import com.android.systemui.statusbar.phone.PhoneStatusBarViewController; import com.android.systemui.statusbar.phone.StatusBarBoundsProvider; import com.android.systemui.statusbar.phone.StatusBarDemoMode; import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment; +import com.android.systemui.statusbar.window.StatusBarWindowController; import dagger.BindsInstance; import dagger.Subcomponent; @@ -57,7 +59,10 @@ public interface HomeStatusBarComponent { interface Factory { /** */ HomeStatusBarComponent create( - @BindsInstance @RootView PhoneStatusBarView phoneStatusBarView); + @BindsInstance @RootView PhoneStatusBarView phoneStatusBarView, + @BindsInstance StatusBarConfigurationController configurationController, + @BindsInstance StatusBarWindowController statusBarWindowController, + @BindsInstance @DisplaySpecific DarkIconDispatcher darkIconDispatcher); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarModule.java index 182f8d7e2fd6..6a331b938cf1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarModule.java @@ -22,19 +22,14 @@ import android.view.ViewStub; import com.android.systemui.battery.BatteryMeterView; import com.android.systemui.dagger.qualifiers.DisplaySpecific; import com.android.systemui.dagger.qualifiers.RootView; -import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.res.R; import com.android.systemui.statusbar.HeadsUpStatusBarView; -import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore; -import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController; -import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore; import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions; import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.PhoneStatusBarViewController; import com.android.systemui.statusbar.phone.StatusBarLocation; import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.statusbar.window.StatusBarWindowController; -import com.android.systemui.statusbar.window.StatusBarWindowControllerStore; import dagger.Module; import dagger.Provides; @@ -149,29 +144,4 @@ public interface HomeStatusBarModule { static int displayId(@RootView PhoneStatusBarView view) { return view.getContext().getDisplayId(); } - - /** */ - @Provides - @HomeStatusBarScope - static StatusBarConfigurationController configurationController( - @DisplaySpecific int displayId, StatusBarConfigurationControllerStore store) { - return store.forDisplay(displayId); - } - - /** */ - @Provides - @HomeStatusBarScope - static StatusBarWindowController provideWindowController( - @DisplaySpecific int displayId, StatusBarWindowControllerStore store) { - return store.forDisplay(displayId); - } - - /** */ - @Provides - @HomeStatusBarScope - @DisplaySpecific - static DarkIconDispatcher darkIconDispatcher( - @DisplaySpecific int displayId, DarkIconDispatcherStore store) { - return store.forDisplay(displayId); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt index ebf439161a9d..7243ba7def58 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.composable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize @@ -28,13 +29,17 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.app.tracing.coroutines.launchTraced as launch +import com.android.keyguard.AlphaOptimizedLinearLayout import com.android.systemui.plugins.DarkIconDispatcher import com.android.systemui.res.R import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore import com.android.systemui.statusbar.events.domain.interactor.SystemStatusEventAnimationInteractor +import com.android.systemui.statusbar.featurepods.popups.StatusBarPopupChips +import com.android.systemui.statusbar.featurepods.popups.ui.compose.StatusBarPopupChipsContainer import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder import com.android.systemui.statusbar.phone.NotificationIconContainer import com.android.systemui.statusbar.phone.PhoneStatusBarView @@ -65,6 +70,8 @@ constructor( ) { fun create(root: ViewGroup, andThen: (ViewGroup) -> Unit): ComposeView { val composeView = ComposeView(root.context) + val darkIconDispatcher = + darkIconDispatcherStore.forDisplay(root.context.displayId) ?: return composeView composeView.apply { setContent { StatusBarRoot( @@ -75,7 +82,7 @@ constructor( darkIconManagerFactory = darkIconManagerFactory, iconController = iconController, ongoingCallController = ongoingCallController, - darkIconDispatcher = darkIconDispatcherStore.forDisplay(root.context.displayId), + darkIconDispatcher = darkIconDispatcher, eventAnimationInteractor = eventAnimationInteractor, onViewCreated = andThen, ) @@ -172,6 +179,35 @@ fun StatusBarRoot( R.id.notificationIcons ) + // Add a composable container for `StatusBarPopupChip`s + if (StatusBarPopupChips.isEnabled) { + val endSideContent = + phoneStatusBarView.requireViewById<AlphaOptimizedLinearLayout>( + R.id.status_bar_end_side_content + ) + + val composeView = + ComposeView(context).apply { + layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT, + ) + + setViewCompositionStrategy( + ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed + ) + + setContent { + val chips = + statusBarViewModel.statusBarPopupChips + .collectAsStateWithLifecycle() + StatusBarPopupChipsContainer(chips = chips.value) + } + } + endSideContent.addView(composeView, 0) + } + scope.launch { notificationIconsBinder.bindWhileAttached( notificationIconContainer, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt index 7f9a80b2e62f..c9cc17389c17 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt @@ -42,6 +42,8 @@ import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsVie import com.android.systemui.statusbar.events.domain.interactor.SystemStatusEventAnimationInteractor import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle +import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel +import com.android.systemui.statusbar.featurepods.popups.ui.viewmodel.StatusBarPopupChipsViewModel import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor import com.android.systemui.statusbar.notification.headsup.PinnedStatus @@ -61,6 +63,7 @@ import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn @@ -99,6 +102,9 @@ interface HomeStatusBarViewModel { /** View model for the carrier name that may show in the status bar based on carrier config */ val operatorNameViewModel: StatusBarOperatorNameViewModel + /** The popup chips that should be shown on the right-hand side of the status bar. */ + val statusBarPopupChips: StateFlow<List<PopupChipModel.Shown>> + /** * True if the current scene can show the home status bar (aka this status bar), and false if * the current scene should never show the home status bar. @@ -170,6 +176,7 @@ constructor( sceneContainerOcclusionInteractor: SceneContainerOcclusionInteractor, shadeInteractor: ShadeInteractor, ongoingActivityChipsViewModel: OngoingActivityChipsViewModel, + statusBarPopupChipsViewModel: StatusBarPopupChipsViewModel, animations: SystemStatusEventAnimationInteractor, @Application coroutineScope: CoroutineScope, ) : HomeStatusBarViewModel { @@ -188,6 +195,8 @@ constructor( override val ongoingActivityChips = ongoingActivityChipsViewModel.chips + override val statusBarPopupChips = statusBarPopupChipsViewModel.shownPopupChips + override val isHomeStatusBarAllowedByScene: StateFlow<Boolean> = combine( sceneInteractor.currentScene, @@ -208,7 +217,7 @@ constructor( } else { combine( notificationsInteractor.areAnyNotificationsPresent, - lightsOutInteractor.isLowProfile(displayId), + lightsOutInteractor.isLowProfile(displayId) ?: flowOf(false), ) { hasNotifications, isLowProfile -> hasNotifications && isLowProfile } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java index 811a2ec44ccc..848e91d6f896 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java @@ -163,7 +163,18 @@ public class StatusBarWindowControllerImpl implements StatusBarWindowController mLp = getBarLayoutParams(mContext.getDisplay().getRotation()); Trace.endSection(); - mWindowManager.addView(mStatusBarWindowView, mLp); + try { + mWindowManager.addView(mStatusBarWindowView, mLp); + } catch (WindowManager.InvalidDisplayException e) { + // Wrapping this in a try/catch to avoid crashes when a display is instantly removed + // after being added, and initialization hasn't finished yet. + Log.e( + TAG, + "Unable to add view to WindowManager. Display with id " + + mContext.getDisplayId() + + " doesn't exist anymore.", + e); + } mLpChanged.copyFrom(mLp); mContentInsetsProvider.addCallback(this::calculateStatusBarLocationsForAllRotations); @@ -176,7 +187,15 @@ public class StatusBarWindowControllerImpl implements StatusBarWindowController public void stop() { StatusBarConnectedDisplays.assertInNewMode(); - mWindowManager.removeView(mStatusBarWindowView); + try { + mWindowManager.removeView(mStatusBarWindowView); + } catch (IllegalArgumentException e) { + // Wrapping this in a try/catch to avoid crashes when a display is instantly removed + // after being added, and initialization hasn't finished yet. + // When that happens, adding the View to WindowManager fails, and therefore removing + // it here will fail too, since it wasn't added in the first place. + Log.e(TAG, "Failed to remove View from WindowManager. View was not attached", e); + } if (StatusBarRootModernization.isEnabled()) { return; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerStore.kt index 74031612f28e..f7688d2feab5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerStore.kt @@ -54,19 +54,23 @@ constructor( StatusBarConnectedDisplays.assertInNewMode() } - override fun createInstanceForDisplay(displayId: Int): StatusBarWindowController { + override fun createInstanceForDisplay(displayId: Int): StatusBarWindowController? { val statusBarDisplayContext = displayWindowPropertiesRepository.get( displayId = displayId, windowType = WindowManager.LayoutParams.TYPE_STATUS_BAR, - ) + ) ?: return null + val statusBarConfigurationController = + statusBarConfigurationControllerStore.forDisplay(displayId) ?: return null + val contentInsetsProvider = + statusBarContentInsetsProviderStore.forDisplay(displayId) ?: return null val viewCaptureAwareWindowManager = viewCaptureAwareWindowManagerFactory.create(statusBarDisplayContext.windowManager) return controllerFactory.create( statusBarDisplayContext.context, viewCaptureAwareWindowManager, - statusBarConfigurationControllerStore.forDisplay(displayId), - statusBarContentInsetsProviderStore.forDisplay(displayId), + statusBarConfigurationController, + contentInsetsProvider, ) } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt index fbf7072cc0a0..a6c066500054 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt @@ -31,6 +31,7 @@ import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker import com.android.systemui.touchpad.tutorial.ui.gesture.VerticalVelocityTracker import com.android.systemui.touchpad.tutorial.ui.view.TouchpadTutorialActivity import com.android.systemui.touchpad.tutorial.ui.viewmodel.BackGestureScreenViewModel +import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggGestureViewModel import com.android.systemui.touchpad.tutorial.ui.viewmodel.HomeGestureScreenViewModel import dagger.Binds import dagger.Module @@ -53,7 +54,11 @@ interface TouchpadTutorialModule { backGestureScreenViewModel: BackGestureScreenViewModel, homeGestureScreenViewModel: HomeGestureScreenViewModel, ): TouchpadTutorialScreensProvider { - return ScreensProvider(backGestureScreenViewModel, homeGestureScreenViewModel) + return ScreensProvider( + backGestureScreenViewModel, + homeGestureScreenViewModel, + EasterEggGestureViewModel(), + ) } @SysUISingleton @@ -74,14 +79,25 @@ interface TouchpadTutorialModule { private class ScreensProvider( val backGestureScreenViewModel: BackGestureScreenViewModel, val homeGestureScreenViewModel: HomeGestureScreenViewModel, + val easterEggGestureViewModel: EasterEggGestureViewModel, ) : TouchpadTutorialScreensProvider { @Composable override fun BackGesture(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) { - BackGestureTutorialScreen(backGestureScreenViewModel, onDoneButtonClicked, onBack) + BackGestureTutorialScreen( + backGestureScreenViewModel, + easterEggGestureViewModel, + onDoneButtonClicked, + onBack, + ) } @Composable override fun HomeGesture(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) { - HomeGestureTutorialScreen(homeGestureScreenViewModel, onDoneButtonClicked, onBack) + HomeGestureTutorialScreen( + homeGestureScreenViewModel, + easterEggGestureViewModel, + onDoneButtonClicked, + onBack, + ) } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt index 804a764b5349..ae32b7a6175c 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt @@ -25,10 +25,12 @@ import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenCon import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty import com.android.systemui.res.R import com.android.systemui.touchpad.tutorial.ui.viewmodel.BackGestureScreenViewModel +import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggGestureViewModel @Composable fun BackGestureTutorialScreen( viewModel: BackGestureScreenViewModel, + easterEggGestureViewModel: EasterEggGestureViewModel, onDoneButtonClicked: () -> Unit, onBack: () -> Unit, ) { @@ -49,9 +51,12 @@ fun BackGestureTutorialScreen( GestureTutorialScreen( screenConfig = screenConfig, gestureUiStateFlow = viewModel.gestureUiState, - motionEventConsumer = viewModel::handleEvent, - easterEggTriggeredFlow = viewModel.easterEggTriggered, - onEasterEggFinished = viewModel::onEasterEggFinished, + motionEventConsumer = { + easterEggGestureViewModel.accept(it) + viewModel.handleEvent(it) + }, + easterEggTriggeredFlow = easterEggGestureViewModel.easterEggTriggered, + onEasterEggFinished = easterEggGestureViewModel::onEasterEggFinished, onDoneButtonClicked = onDoneButtonClicked, onBack = onBack, ) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt index 5dcd788ea4fd..4f1f40dc4c05 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt @@ -23,11 +23,13 @@ import com.android.compose.theme.LocalAndroidColorScheme import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty import com.android.systemui.res.R +import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggGestureViewModel import com.android.systemui.touchpad.tutorial.ui.viewmodel.HomeGestureScreenViewModel @Composable fun HomeGestureTutorialScreen( viewModel: HomeGestureScreenViewModel, + easterEggGestureViewModel: EasterEggGestureViewModel, onDoneButtonClicked: () -> Unit, onBack: () -> Unit, ) { @@ -48,9 +50,12 @@ fun HomeGestureTutorialScreen( GestureTutorialScreen( screenConfig = screenConfig, gestureUiStateFlow = viewModel.gestureUiState, - motionEventConsumer = viewModel::handleEvent, - easterEggTriggeredFlow = viewModel.easterEggTriggered, - onEasterEggFinished = viewModel::onEasterEggFinished, + motionEventConsumer = { + easterEggGestureViewModel.accept(it) + viewModel.handleEvent(it) + }, + easterEggTriggeredFlow = easterEggGestureViewModel.easterEggTriggered, + onEasterEggFinished = easterEggGestureViewModel::onEasterEggFinished, onDoneButtonClicked = onDoneButtonClicked, onBack = onBack, ) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt index 7ff838981950..6c9e26c4b7ea 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt @@ -23,11 +23,13 @@ import com.android.compose.theme.LocalAndroidColorScheme import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty import com.android.systemui.res.R +import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggGestureViewModel import com.android.systemui.touchpad.tutorial.ui.viewmodel.RecentAppsGestureScreenViewModel @Composable fun RecentAppsGestureTutorialScreen( viewModel: RecentAppsGestureScreenViewModel, + easterEggGestureViewModel: EasterEggGestureViewModel, onDoneButtonClicked: () -> Unit, onBack: () -> Unit, ) { @@ -49,9 +51,12 @@ fun RecentAppsGestureTutorialScreen( GestureTutorialScreen( screenConfig = screenConfig, gestureUiStateFlow = viewModel.gestureUiState, - motionEventConsumer = viewModel::handleEvent, - easterEggTriggeredFlow = viewModel.easterEggTriggered, - onEasterEggFinished = viewModel::onEasterEggFinished, + motionEventConsumer = { + easterEggGestureViewModel.accept(it) + viewModel.handleEvent(it) + }, + easterEggTriggeredFlow = easterEggGestureViewModel.easterEggTriggered, + onEasterEggFinished = easterEggGestureViewModel::onEasterEggFinished, onDoneButtonClicked = onDoneButtonClicked, onBack = onBack, ) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureMonitor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureRecognizer.kt index 7483840d1933..18c490baed3d 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureMonitor.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/EasterEggGestureRecognizer.kt @@ -17,7 +17,7 @@ package com.android.systemui.touchpad.tutorial.ui.gesture import android.view.MotionEvent -import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureMonitor.Companion.CIRCLES_COUNT_THRESHOLD +import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureRecognizer.Companion.CIRCLES_COUNT_THRESHOLD import kotlin.math.abs import kotlin.math.atan2 import kotlin.math.pow @@ -25,10 +25,12 @@ import kotlin.math.sqrt /** * Monitor recognizing easter egg gesture, that is at least [CIRCLES_COUNT_THRESHOLD] circles - * clockwise within one gesture. It tries to be on the safer side of not triggering gesture if we're - * not sure if full circle was done. + * clockwise within one two-fingers gesture. It tries to be on the safer side of not triggering + * gesture if we're not sure if full circle was done. */ -class EasterEggGestureMonitor(private val callback: () -> Unit) { +class EasterEggGestureRecognizer : GestureRecognizer { + + private var gestureStateChangedCallback: (GestureState) -> Unit = {} private var last: Point = Point(0f, 0f) private var cumulativeAngle: Float = 0f @@ -39,7 +41,16 @@ class EasterEggGestureMonitor(private val callback: () -> Unit) { private val points = mutableListOf<Point>() - fun processTouchpadEvent(event: MotionEvent) { + override fun addGestureStateCallback(callback: (GestureState) -> Unit) { + gestureStateChangedCallback = callback + } + + override fun clearGestureStateCallback() { + gestureStateChangedCallback = {} + } + + override fun accept(event: MotionEvent) { + if (!isTwoFingerSwipe(event)) return when (event.action) { MotionEvent.ACTION_DOWN -> { reset() @@ -75,7 +86,7 @@ class EasterEggGestureMonitor(private val callback: () -> Unit) { // without checking if gesture is circular we can have gesture doing arches back and // forth that finally reaches full circle angle if (circleCount >= CIRCLES_COUNT_THRESHOLD && wasGestureCircular(points)) { - callback() + gestureStateChangedCallback(GestureState.Finished) } reset() } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandler.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadEventsFilter.kt index dd275bd11d1e..bddeb0b25ec2 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadGestureHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadEventsFilter.kt @@ -18,33 +18,27 @@ package com.android.systemui.touchpad.tutorial.ui.gesture import android.view.InputDevice import android.view.MotionEvent -import java.util.function.Consumer +import android.view.MotionEvent.ACTION_DOWN +import android.view.MotionEvent.BUTTON_PRIMARY -/** - * Allows listening to touchpadGesture and calling onDone when gesture was triggered. Can have all - * motion events passed to [onMotionEvent] and will filter touchpad events accordingly - */ -class TouchpadGestureHandler( - private val gestureRecognizer: Consumer<MotionEvent>, - private val easterEggGestureMonitor: EasterEggGestureMonitor, -) { +object TouchpadEventsFilter { - fun onMotionEvent(event: MotionEvent): Boolean { + fun isTouchpadAndNonClickEvent(event: MotionEvent): Boolean { // events from touchpad have SOURCE_MOUSE and not SOURCE_TOUCHPAD because of legacy reasons val isFromTouchpad = event.isFromSource(InputDevice.SOURCE_MOUSE) && event.getToolType(0) == MotionEvent.TOOL_TYPE_FINGER - val buttonClick = - event.actionMasked == MotionEvent.ACTION_DOWN && - event.isButtonPressed(MotionEvent.BUTTON_PRIMARY) - return if (isFromTouchpad && !buttonClick) { - if (isTwoFingerSwipe(event)) { - easterEggGestureMonitor.processTouchpadEvent(event) - } - gestureRecognizer.accept(event) - true - } else { - false - } + val isButtonClicked = + event.actionMasked == ACTION_DOWN && event.isButtonPressed(BUTTON_PRIMARY) + return isFromTouchpad && !isButtonClicked + } +} + +fun GestureRecognizer.handleTouchpadMotionEvent(event: MotionEvent): Boolean { + return if (TouchpadEventsFilter.isTouchpadAndNonClickEvent(event)) { + this.accept(event) + true + } else { + false } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt index 6b4cbab3ae09..cefe382a299c 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt @@ -39,6 +39,7 @@ import com.android.systemui.touchpad.tutorial.ui.composable.HomeGestureTutorialS import com.android.systemui.touchpad.tutorial.ui.composable.RecentAppsGestureTutorialScreen import com.android.systemui.touchpad.tutorial.ui.composable.TutorialSelectionScreen import com.android.systemui.touchpad.tutorial.ui.viewmodel.BackGestureScreenViewModel +import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggGestureViewModel import com.android.systemui.touchpad.tutorial.ui.viewmodel.HomeGestureScreenViewModel import com.android.systemui.touchpad.tutorial.ui.viewmodel.RecentAppsGestureScreenViewModel import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.BACK_GESTURE @@ -73,6 +74,7 @@ constructor( backGestureViewModel, homeGestureViewModel, recentAppsGestureViewModel, + EasterEggGestureViewModel(), closeTutorial = ::finishTutorial, ) } @@ -105,6 +107,7 @@ fun TouchpadTutorialScreen( backGestureViewModel: BackGestureScreenViewModel, homeGestureViewModel: HomeGestureScreenViewModel, recentAppsGestureViewModel: RecentAppsGestureScreenViewModel, + easterEggGestureViewModel: EasterEggGestureViewModel, closeTutorial: () -> Unit, ) { val activeScreen by vm.screen.collectAsStateWithLifecycle(STARTED) @@ -130,18 +133,21 @@ fun TouchpadTutorialScreen( BACK_GESTURE -> BackGestureTutorialScreen( backGestureViewModel, + easterEggGestureViewModel, onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) }, onBack = { vm.goTo(TUTORIAL_SELECTION) }, ) HOME_GESTURE -> HomeGestureTutorialScreen( homeGestureViewModel, + easterEggGestureViewModel, onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) }, onBack = { vm.goTo(TUTORIAL_SELECTION) }, ) RECENT_APPS_GESTURE -> RecentAppsGestureTutorialScreen( recentAppsGestureViewModel, + easterEggGestureViewModel, onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) }, onBack = { vm.goTo(TUTORIAL_SELECTION) }, ) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModel.kt index 0154c910be91..93e8d313edcf 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModel.kt @@ -22,17 +22,15 @@ import com.android.systemui.res.R import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState import com.android.systemui.touchpad.tutorial.ui.composable.toGestureUiState import com.android.systemui.touchpad.tutorial.ui.gesture.BackGestureRecognizer -import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureMonitor import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress -import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGestureHandler +import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent import com.android.systemui.util.kotlin.pairwiseBy import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest @@ -40,10 +38,7 @@ class BackGestureScreenViewModel @Inject constructor(configurationInteractor: ConfigurationInteractor) : TouchpadTutorialScreenViewModel { - private val easterEggMonitor = EasterEggGestureMonitor { easterEggTriggered.value = true } - override val easterEggTriggered = MutableStateFlow(false) - - private var handler: TouchpadGestureHandler? = null + private var recognizer: BackGestureRecognizer? = null private val distanceThreshold: Flow<Int> = configurationInteractor @@ -54,16 +49,15 @@ constructor(configurationInteractor: ConfigurationInteractor) : TouchpadTutorial override val gestureUiState: Flow<GestureUiState> = distanceThreshold .flatMapLatest { - val recognizer = BackGestureRecognizer(gestureDistanceThresholdPx = it) - handler = TouchpadGestureHandler(recognizer, easterEggMonitor) - GestureFlowAdapter(recognizer).gestureStateAsFlow + recognizer = BackGestureRecognizer(gestureDistanceThresholdPx = it) + GestureFlowAdapter(recognizer!!).gestureStateAsFlow } .pairwiseBy(GestureState.NotStarted) { previous, current -> toGestureUiState(current, previous) } override fun handleEvent(event: MotionEvent): Boolean { - return handler?.onMotionEvent(event) ?: false + return recognizer?.handleTouchpadMotionEvent(event) ?: false } private fun toGestureUiState(current: GestureState, previous: GestureState): GestureUiState { diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModel.kt new file mode 100644 index 000000000000..69cdab6108ab --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModel.kt @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.touchpad.tutorial.ui.viewmodel + +import android.view.MotionEvent +import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureRecognizer +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState +import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent +import java.util.function.Consumer +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.receiveAsFlow + +class EasterEggGestureViewModel( + private val gestureRecognizer: EasterEggGestureRecognizer = EasterEggGestureRecognizer() +) : Consumer<MotionEvent> { + + private val gestureDone = + GestureFlowAdapter(gestureRecognizer).gestureStateAsFlow.filter { + it == GestureState.Finished + } + + private val easterEggFinished = Channel<Unit>() + + val easterEggTriggered = + merge( + gestureDone.map { Event.GestureFinished }, + easterEggFinished.receiveAsFlow().map { Event.StateRestarted }, + ) + .map { + when (it) { + Event.GestureFinished -> true + Event.StateRestarted -> false + } + } + .onStart { emit(false) } + + override fun accept(event: MotionEvent) { + gestureRecognizer.handleTouchpadMotionEvent(event) + } + + fun onEasterEggFinished() { + easterEggFinished.trySend(Unit) + } + + private sealed interface Event { + data object GestureFinished : Event + + data object StateRestarted : Event + } +} diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModel.kt index 1c865f57b8c7..9a817d810bba 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModel.kt @@ -23,17 +23,15 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.res.R import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState import com.android.systemui.touchpad.tutorial.ui.composable.toGestureUiState -import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureMonitor import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState import com.android.systemui.touchpad.tutorial.ui.gesture.HomeGestureRecognizer -import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGestureHandler import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker import com.android.systemui.touchpad.tutorial.ui.gesture.VerticalVelocityTracker +import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest @@ -47,10 +45,7 @@ constructor( val velocityTracker: VelocityTracker = VerticalVelocityTracker(), ) : TouchpadTutorialScreenViewModel { - private val easterEggMonitor = EasterEggGestureMonitor { easterEggTriggered.value = true } - override val easterEggTriggered = MutableStateFlow(false) - - private var handler: TouchpadGestureHandler? = null + private var recognizer: HomeGestureRecognizer? = null private val distanceThreshold: Flow<Int> = configurationInteractor @@ -67,14 +62,13 @@ constructor( distanceThreshold .combine(velocityThreshold, { distance, velocity -> distance to velocity }) .flatMapLatest { (distance, velocity) -> - val recognizer = + recognizer = HomeGestureRecognizer( gestureDistanceThresholdPx = distance, velocityThresholdPxPerMs = velocity, velocityTracker = velocityTracker, ) - handler = TouchpadGestureHandler(recognizer, easterEggMonitor) - GestureFlowAdapter(recognizer).gestureStateAsFlow + GestureFlowAdapter(recognizer!!).gestureStateAsFlow } .map { toGestureUiState(it) } @@ -86,6 +80,6 @@ constructor( ) override fun handleEvent(event: MotionEvent): Boolean { - return handler?.onMotionEvent(event) ?: false + return recognizer?.handleTouchpadMotionEvent(event) ?: false } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModel.kt index 09947a8b109e..8215078c346d 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModel.kt @@ -23,17 +23,15 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.res.R import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState import com.android.systemui.touchpad.tutorial.ui.composable.toGestureUiState -import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureMonitor import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecognizer -import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGestureHandler import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker import com.android.systemui.touchpad.tutorial.ui.gesture.VerticalVelocityTracker +import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest @@ -47,10 +45,7 @@ constructor( private val velocityTracker: VelocityTracker = VerticalVelocityTracker(), ) : TouchpadTutorialScreenViewModel { - private val easterEggMonitor = EasterEggGestureMonitor { easterEggTriggered.value = true } - override val easterEggTriggered = MutableStateFlow(false) - - private var handler: TouchpadGestureHandler? = null + private var recognizer: RecentAppsGestureRecognizer? = null private val distanceThreshold: Flow<Int> = configurationInteractor.onAnyConfigurationChange @@ -71,14 +66,13 @@ constructor( distanceThreshold .combine(velocityThreshold, { distance, velocity -> distance to velocity }) .flatMapLatest { (distance, velocity) -> - val recognizer = + recognizer = RecentAppsGestureRecognizer( gestureDistanceThresholdPx = distance, velocityThresholdPxPerMs = velocity, velocityTracker = velocityTracker, ) - handler = TouchpadGestureHandler(recognizer, easterEggMonitor) - GestureFlowAdapter(recognizer).gestureStateAsFlow + GestureFlowAdapter(recognizer!!).gestureStateAsFlow } .map { toGestureUiState(it) } @@ -90,6 +84,6 @@ constructor( ) override fun handleEvent(event: MotionEvent): Boolean { - return handler?.onMotionEvent(event) ?: false + return recognizer?.handleTouchpadMotionEvent(event) ?: false } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/TouchpadTutorialScreenViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/TouchpadTutorialScreenViewModel.kt index 500f6a0238c3..31e953d6643c 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/TouchpadTutorialScreenViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/TouchpadTutorialScreenViewModel.kt @@ -19,15 +19,9 @@ package com.android.systemui.touchpad.tutorial.ui.viewmodel import android.view.MotionEvent import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow interface TouchpadTutorialScreenViewModel { val gestureUiState: Flow<GestureUiState> - val easterEggTriggered: MutableStateFlow<Boolean> - - fun onEasterEggFinished() { - easterEggTriggered.value = false - } fun handleEvent(event: MotionEvent): Boolean } diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt index 8bb02793ecc5..8733eeb2bd05 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt @@ -71,6 +71,8 @@ constructor(private val viewModel: VolumeDialogRingerDrawerViewModel) { fun CoroutineScope.bind(view: View) { val volumeDialogBackgroundView = view.requireViewById<View>(R.id.volume_dialog_background) + val ringerHBackgroundView = + view.requireViewById<View>(R.id.volume_ringer_horizontal_background) val drawerContainer = view.requireViewById<MotionLayout>(R.id.volume_ringer_drawer) val unselectedButtonUiModel = RingerButtonUiModel.getUnselectedButton(view.context) val selectedButtonUiModel = RingerButtonUiModel.getSelectedButton(view.context) @@ -84,6 +86,11 @@ constructor(private val viewModel: VolumeDialogRingerDrawerViewModel) { ) var backgroundAnimationProgress: Float by Delegates.observable(0F) { _, _, progress -> + ringerHBackgroundView.applyCorners( + fullRadius = volumeDialogBgFullRadius, + diff = volumeDialogBgFullRadius - volumeDialogBgSmallRadius, + progress, + ) volumeDialogBackgroundView.applyCorners( fullRadius = volumeDialogBgFullRadius, diff = volumeDialogBgFullRadius - volumeDialogBgSmallRadius, @@ -95,6 +102,7 @@ constructor(private val viewModel: VolumeDialogRingerDrawerViewModel) { } drawerContainer.setTransitionListener(ringerDrawerTransitionListener) volumeDialogBackgroundView.background = volumeDialogBackgroundView.background.mutate() + ringerHBackgroundView.background = ringerHBackgroundView.background.mutate() viewModel.ringerViewModel .mapLatest { ringerState -> @@ -184,6 +192,8 @@ constructor(private val viewModel: VolumeDialogRingerDrawerViewModel) { ) volumeDialogBackgroundView.background = volumeDialogBackgroundView.background.mutate() + ringerHBackgroundView.background = + ringerHBackgroundView.background.mutate() } } } @@ -193,6 +203,9 @@ constructor(private val viewModel: VolumeDialogRingerDrawerViewModel) { volumeDialogBackgroundView.setBackgroundResource( R.drawable.volume_dialog_background ) + ringerHBackgroundView.setBackgroundResource( + R.drawable.volume_dialog_background + ) } } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/util/RingerDrawerConstraintsUtils.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/util/RingerDrawerConstraintsUtils.kt index 25ba1bd3a1d8..69ffa3890437 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/util/RingerDrawerConstraintsUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/util/RingerDrawerConstraintsUtils.kt @@ -119,6 +119,15 @@ private fun ConstraintSet.adjustOpenConstraintsForDrawer( ) when (lastOrientation) { ORIENTATION_LANDSCAPE -> { + if (index == 0) { + setMargin( + button.id, + ConstraintSet.LEFT, + motionLayout.context.resources.getDimensionPixelSize( + R.dimen.volume_dialog_ringer_drawer_left_margin + ), + ) + } setButtonPositionLandscapeConstraints(motionLayout, index, button) if (index != motionLayout.childCount - 1) { setMargin( @@ -134,6 +143,9 @@ private fun ConstraintSet.adjustOpenConstraintsForDrawer( setMargin(button.id, ConstraintSet.BOTTOM, 0) } ORIENTATION_PORTRAIT -> { + if (index == 0) { + setMargin(button.id, ConstraintSet.LEFT, 0) + } setButtonPositionPortraitConstraints(motionLayout, index, button) if (index != motionLayout.childCount - 1) { setMargin( diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt index a7ffcd747a6b..67ffb0602860 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt @@ -16,18 +16,15 @@ package com.android.systemui.volume.dialog.sliders.ui -import android.animation.Animator -import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.view.View -import android.view.animation.DecelerateInterpolator +import androidx.dynamicanimation.animation.FloatPropertyCompat +import androidx.dynamicanimation.animation.SpringAnimation +import androidx.dynamicanimation.animation.SpringForce import com.android.systemui.res.R import com.android.systemui.volume.dialog.sliders.dagger.VolumeDialogSliderScope import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderStateModel import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderViewModel -import com.android.systemui.volume.dialog.ui.utils.JankListenerFactory -import com.android.systemui.volume.dialog.ui.utils.suspendAnimate -import com.google.android.material.slider.LabelFormatter import com.google.android.material.slider.Slider import javax.inject.Inject import kotlin.math.roundToInt @@ -35,53 +32,61 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -private const val PROGRESS_CHANGE_ANIMATION_DURATION_MS = 80L - @VolumeDialogSliderScope class VolumeDialogSliderViewBinder @Inject -constructor( - private val viewModel: VolumeDialogSliderViewModel, - private val jankListenerFactory: JankListenerFactory, -) { +constructor(private val viewModel: VolumeDialogSliderViewModel) { - fun CoroutineScope.bind(view: View) { - val sliderView: Slider = - view.requireViewById<Slider>(R.id.volume_dialog_slider).apply { - labelBehavior = LabelFormatter.LABEL_GONE - trackIconActiveColor = trackInactiveTintList + private val sliderValueProperty = + object : FloatPropertyCompat<Slider>("value") { + override fun getValue(slider: Slider): Float = slider.value + + override fun setValue(slider: Slider, value: Float) { + slider.value = value } + } + private val springForce = + SpringForce().apply { + stiffness = SpringForce.STIFFNESS_MEDIUM + dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY + } + + fun CoroutineScope.bind(view: View) { + var isInitialUpdate = true + val sliderView: Slider = view.requireViewById(R.id.volume_dialog_slider) + val animation = SpringAnimation(sliderView, sliderValueProperty) + animation.spring = springForce + sliderView.addOnChangeListener { _, value, fromUser -> viewModel.setStreamVolume(value.roundToInt(), fromUser) } - viewModel.state.onEach { sliderView.setModel(it) }.launchIn(this) + viewModel.state + .onEach { + sliderView.setModel(it, animation, isInitialUpdate) + isInitialUpdate = false + } + .launchIn(this) } @SuppressLint("UseCompatLoadingForDrawables") - private suspend fun Slider.setModel(model: VolumeDialogSliderStateModel) { + private fun Slider.setModel( + model: VolumeDialogSliderStateModel, + animation: SpringAnimation, + isInitialUpdate: Boolean, + ) { valueFrom = model.minValue + animation.setMinValue(model.minValue) valueTo = model.maxValue + animation.setMaxValue(model.maxValue) // coerce the current value to the new value range before animating it. This prevents // animating from the value that is outside of current [valueFrom, valueTo]. value = value.coerceIn(valueFrom, valueTo) - setValueAnimated( - model.value, - jankListenerFactory.update(this, PROGRESS_CHANGE_ANIMATION_DURATION_MS), - ) - trackIconActiveEnd = context.getDrawable(model.iconRes) - } -} - -private suspend fun Slider.setValueAnimated( - newValue: Float, - jankListener: Animator.AnimatorListener, -) { - ObjectAnimator.ofFloat(value, newValue) - .apply { - duration = PROGRESS_CHANGE_ANIMATION_DURATION_MS - interpolator = DecelerateInterpolator() - addListener(jankListener) + setTrackIconActiveStart(model.iconRes) + if (isInitialUpdate) { + value = model.value + } else { + animation.animateToFinalPosition(model.value) } - .suspendAnimate<Float> { value = it } + } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt index 2d5652420ec8..6d8457be1014 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt @@ -73,19 +73,22 @@ constructor( .filterNotNull() val state: Flow<VolumeDialogSliderStateModel> = - model.flatMapLatest { streamModel -> - with(streamModel) { - volumeDialogSliderIconProvider.getStreamIcon( - stream = stream, - level = level, - levelMin = levelMin, - levelMax = levelMax, - isMuted = muted, - isRoutedToBluetooth = routedToBluetooth, - ) - } - .map { icon -> streamModel.toStateModel(icon) } - } + model + .flatMapLatest { streamModel -> + with(streamModel) { + volumeDialogSliderIconProvider.getStreamIcon( + stream = stream, + level = level, + levelMin = levelMin, + levelMax = levelMax, + isMuted = muted, + isRoutedToBluetooth = routedToBluetooth, + ) + } + .map { icon -> streamModel.toStateModel(icon) } + } + .stateIn(coroutineScope, SharingStarted.Eagerly, null) + .filterNotNull() init { userVolumeUpdates diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt index 9b1d86f15c92..52a19e0903e2 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt @@ -19,6 +19,7 @@ package com.android.systemui.volume.dialog.ui.utils import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator +import android.animation.ValueAnimator.AnimatorUpdateListener import android.view.ViewPropertyAnimator import androidx.dynamicanimation.animation.DynamicAnimation import androidx.dynamicanimation.animation.SpringAnimation @@ -69,17 +70,25 @@ suspend fun ViewPropertyAnimator.suspendAnimate( @Suppress("UNCHECKED_CAST") suspend fun <T> ValueAnimator.suspendAnimate(onValueChanged: (T) -> Unit) { suspendCancellableCoroutine { continuation -> - addListener( + val listener = object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) = continuation.resumeIfCan(Unit) + override fun onAnimationEnd(animation: Animator) = + continuation.resumeIfCan(Unit) - override fun onAnimationCancel(animation: Animator) = continuation.resumeIfCan(Unit) - } - ) - addUpdateListener { onValueChanged(it.animatedValue as T) } + override fun onAnimationCancel(animation: Animator) = + continuation.resumeIfCan(Unit) + } + .also(::addListener) + val updateListener = + AnimatorUpdateListener { onValueChanged(it.animatedValue as T) } + .also(::addUpdateListener) start() - continuation.invokeOnCancellation { cancel() } + continuation.invokeOnCancellation { + removeUpdateListener(updateListener) + removeListener(listener) + cancel() + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java index 51a7b5f6f979..bc9d4c7fa0e6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java @@ -42,6 +42,7 @@ import com.android.app.viewcapture.ViewCapture; import com.android.app.viewcapture.ViewCaptureAwareWindowManager; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import com.android.systemui.accessibility.AccessibilityButtonModeObserver; @@ -95,6 +96,8 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { private Lazy<ViewCapture> mLazyViewCapture; @Mock private NavigationModeController mNavigationModeController; + @Mock + private HearingAidDeviceManager mHearingAidDeviceManager; @Before public void setUp() throws Exception { @@ -170,7 +173,7 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { mController = setUpController(); mController.mFloatingMenu = new MenuViewLayerController(mContextWrapper, mWindowManager, mViewCaptureAwareWindowManager, mAccessibilityManager, mSecureSettings, - mNavigationModeController); + mNavigationModeController, mHearingAidDeviceManager); captureKeyguardUpdateMonitorCallback(); mKeyguardCallback.onUserUnlocked(); @@ -198,7 +201,7 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { mController = setUpController(); mController.mFloatingMenu = new MenuViewLayerController(mContextWrapper, mWindowManager, mViewCaptureAwareWindowManager, mAccessibilityManager, mSecureSettings, - mNavigationModeController); + mNavigationModeController, mHearingAidDeviceManager); captureKeyguardUpdateMonitorCallback(); mKeyguardCallback.onUserSwitching(fakeUserId); @@ -213,7 +216,7 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { mController = setUpController(); mController.mFloatingMenu = new MenuViewLayerController(mContextWrapper, mWindowManager, mViewCaptureAwareWindowManager, mAccessibilityManager, mSecureSettings, - mNavigationModeController); + mNavigationModeController, mHearingAidDeviceManager); captureKeyguardUpdateMonitorCallback(); mKeyguardCallback.onUserUnlocked(); mKeyguardCallback.onKeyguardVisibilityChanged(true); @@ -368,9 +371,9 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { final AccessibilityFloatingMenuController controller = new AccessibilityFloatingMenuController(mContextWrapper, windowManager, viewCaptureAwareWindowManager, displayManager, mAccessibilityManager, - mTargetsObserver, mModeObserver, mKeyguardUpdateMonitor, mSecureSettings, - displayTracker, mNavigationModeController, new Handler( - mTestableLooper.getLooper())); + mTargetsObserver, mModeObserver, mHearingAidDeviceManager, + mKeyguardUpdateMonitor, mSecureSettings, displayTracker, + mNavigationModeController, new Handler(mTestableLooper.getLooper())); controller.init(); return controller; diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java index dddaabb66022..856c37934251 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import android.graphics.PointF; - import android.testing.TestableLooper; import android.view.View; import android.view.ViewPropertyAnimator; @@ -40,6 +39,7 @@ import androidx.dynamicanimation.animation.SpringForce; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.Prefs; import com.android.systemui.SysuiTestCase; import com.android.systemui.accessibility.utils.TestUtils; @@ -74,6 +74,8 @@ public class MenuAnimationControllerTest extends SysuiTestCase { @Mock private AccessibilityManager mAccessibilityManager; + @Mock + private HearingAidDeviceManager mHearingAidDeviceManager; @Before public void setUp() throws Exception { @@ -82,7 +84,7 @@ public class MenuAnimationControllerTest extends SysuiTestCase { stubWindowManager); final SecureSettings secureSettings = TestUtils.mockSecureSettings(); final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, - secureSettings); + secureSettings, mHearingAidDeviceManager); mMenuView = spy(new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance, secureSettings)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java index 400b3b388c31..33cfb3890e71 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java @@ -77,6 +77,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.dialog.AccessibilityTarget; import com.android.internal.messages.nano.SystemMessageProto; +import com.android.settingslib.bluetooth.HearingAidDeviceManager; import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestableContext; @@ -140,6 +141,8 @@ public class MenuViewLayerTest extends SysuiTestCase { @Mock private AccessibilityManager mStubAccessibilityManager; @Mock + private HearingAidDeviceManager mHearingAidDeviceManager; + @Mock private PackageManager mMockPackageManager; private final SecureSettings mSecureSettings = TestUtils.mockSecureSettings(); @@ -160,7 +163,7 @@ public class MenuViewLayerTest extends SysuiTestCase { doReturn(mWindowMetrics).when(mStubWindowManager).getCurrentWindowMetrics(); mMenuViewModel = new MenuViewModel( - mSpyContext, mStubAccessibilityManager, mSecureSettings); + mSpyContext, mStubAccessibilityManager, mSecureSettings, mHearingAidDeviceManager); MenuViewAppearance menuViewAppearance = new MenuViewAppearance( mSpyContext, mStubWindowManager); mMenuView = spy( @@ -419,9 +422,10 @@ public class MenuViewLayerTest extends SysuiTestCase { @Test @EnableFlags(Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT) public void onDismissAction_incrementsTexMetricDismiss() { - mMenuViewModel.onTargetFeaturesChanged( - List.of(new TestAccessibilityTarget(mSpyContext, 1234), - new TestAccessibilityTarget(mSpyContext, 5678))); + List<AccessibilityTarget> testTargets = new ArrayList<>(); + testTargets.add(new TestAccessibilityTarget(mSpyContext, 1234)); + testTargets.add(new TestAccessibilityTarget(mSpyContext, 5678)); + mMenuViewModel.onTargetFeaturesChanged(testTargets); mMenuViewLayer.dispatchAccessibilityAction(R.id.action_remove_menu); @@ -431,9 +435,10 @@ public class MenuViewLayerTest extends SysuiTestCase { @Test @EnableFlags(Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT) public void onEditAction_incrementsTexMetricEdit() { - mMenuViewModel.onTargetFeaturesChanged( - List.of(new TestAccessibilityTarget(mSpyContext, 1234), - new TestAccessibilityTarget(mSpyContext, 5678))); + List<AccessibilityTarget> testTargets = new ArrayList<>(); + testTargets.add(new TestAccessibilityTarget(mSpyContext, 1234)); + testTargets.add(new TestAccessibilityTarget(mSpyContext, 5678)); + mMenuViewModel.onTargetFeaturesChanged(testTargets); mMenuViewLayer.dispatchAccessibilityAction(R.id.action_edit); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt index 84976a9d4d39..0b2b86785c75 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt @@ -32,8 +32,8 @@ import com.android.systemui.common.shared.model.Icon import com.android.systemui.communal.domain.interactor.communalSettingsInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.dock.DockManagerFake -import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags +import com.android.systemui.flags.fakeFeatureFlagsClassic import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory @@ -191,10 +191,7 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() { dockManager = DockManagerFake() biometricSettingsRepository = FakeBiometricSettingsRepository() - val featureFlags = - FakeFeatureFlags().apply { set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, false) } - - val withDeps = KeyguardInteractorFactory.create(featureFlags = featureFlags) + val withDeps = KeyguardInteractorFactory.create() keyguardInteractor = withDeps.keyguardInteractor repository = withDeps.repository @@ -287,7 +284,7 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() { keyguardStateController = keyguardStateController, userTracker = userTracker, activityStarter = activityStarter, - featureFlags = featureFlags, + featureFlags = kosmos.fakeFeatureFlagsClassic, repository = { quickAffordanceRepository }, launchAnimator = launchAnimator, logger = logger, diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java index 47371dfd8895..23282b16d8a8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -27,6 +28,8 @@ import static org.mockito.Mockito.when; import android.app.KeyguardManager; import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.media.AudioManager; import android.media.session.MediaController; @@ -38,6 +41,7 @@ import android.testing.TestableLooper; import android.view.View; import android.widget.Button; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.core.graphics.drawable.IconCompat; @@ -128,6 +132,21 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE); mMediaControllers.add(mMediaController); when(mMediaSessionManager.getActiveSessions(any())).thenReturn(mMediaControllers); + createMediaSwitchingController(TEST_PACKAGE); + + // Using a fake package will cause routing operations to fail, so we intercept + // scanning-related operations. + mMediaSwitchingController.mLocalMediaManager = mock(LocalMediaManager.class); + doNothing().when(mMediaSwitchingController.mLocalMediaManager).startScan(); + doNothing().when(mMediaSwitchingController.mLocalMediaManager).stopScan(); + + mMediaOutputBaseDialogImpl = + new MediaOutputBaseDialogImpl( + mContext, mBroadcastSender, mMediaSwitchingController); + mMediaOutputBaseDialogImpl.onCreate(new Bundle()); + } + + private void createMediaSwitchingController(String testPackage) { VolumePanelGlobalStateInteractor volumePanelGlobalStateInteractor = VolumePanelGlobalStateInteractorKosmosKt.getVolumePanelGlobalStateInteractor( mKosmos); @@ -135,7 +154,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { mMediaSwitchingController = new MediaSwitchingController( mContext, - TEST_PACKAGE, + testPackage, mContext.getUser(), /* token */ null, mMediaSessionManager, @@ -150,17 +169,40 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { mFlags, volumePanelGlobalStateInteractor, mUserTracker); + } - // Using a fake package will cause routing operations to fail, so we intercept - // scanning-related operations. - mMediaSwitchingController.mLocalMediaManager = mock(LocalMediaManager.class); - doNothing().when(mMediaSwitchingController.mLocalMediaManager).startScan(); - doNothing().when(mMediaSwitchingController.mLocalMediaManager).stopScan(); + @Test + public void onCreate_noAppOpenIntent_metadataSectionNonClickable() { + createMediaSwitchingController(null); mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl( mContext, mBroadcastSender, mMediaSwitchingController); mMediaOutputBaseDialogImpl.onCreate(new Bundle()); + final LinearLayout mediaMetadataSectionLayout = + mMediaOutputBaseDialogImpl.mDialogView.requireViewById( + R.id.media_metadata_section); + + assertThat(mediaMetadataSectionLayout.isClickable()).isFalse(); + } + + @Test + public void onCreate_appOpenIntentAvailable_metadataSectionClickable() { + final PackageManager packageManager = mock(PackageManager.class); + mContext.setMockPackageManager(packageManager); + Intent intent = new Intent(TEST_PACKAGE); + doReturn(intent).when(packageManager).getLaunchIntentForPackage(TEST_PACKAGE); + createMediaSwitchingController(TEST_PACKAGE); + + mMediaOutputBaseDialogImpl = + new MediaOutputBaseDialogImpl( + mContext, mBroadcastSender, mMediaSwitchingController); + mMediaOutputBaseDialogImpl.onCreate(new Bundle()); + final LinearLayout mediaMetadataSectionLayout = + mMediaOutputBaseDialogImpl.mDialogView.requireViewById( + R.id.media_metadata_section); + + assertThat(mediaMetadataSectionLayout.isClickable()).isTrue(); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDetailsContentControllerTest.java index 782b24825bcf..e4a4953063bb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDetailsContentControllerTest.java @@ -9,8 +9,8 @@ import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; import static com.android.settingslib.wifi.WifiUtils.getHotspotIconResource; -import static com.android.systemui.qs.tiles.dialog.InternetDialogController.TOAST_PARAMS_HORIZONTAL_WEIGHT; -import static com.android.systemui.qs.tiles.dialog.InternetDialogController.TOAST_PARAMS_VERTICAL_WEIGHT; +import static com.android.systemui.qs.tiles.dialog.InternetDetailsContentController.TOAST_PARAMS_HORIZONTAL_WEIGHT; +import static com.android.systemui.qs.tiles.dialog.InternetDetailsContentController.TOAST_PARAMS_VERTICAL_WEIGHT; import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MAX; import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MIN; import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_UNREACHABLE; @@ -105,7 +105,7 @@ import java.util.Map; @SmallTest @RunWith(AndroidJUnit4.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) -public class InternetDialogDelegateControllerTest extends SysuiTestCase { +public class InternetDetailsContentControllerTest extends SysuiTestCase { private static final int SUB_ID = 1; private static final int SUB_ID2 = 2; @@ -160,7 +160,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Mock private WifiUtils.InternetIconInjector mWifiIconInjector; @Mock - InternetDialogController.InternetDialogCallback mInternetDialogCallback; + InternetDetailsContentController.InternetDialogCallback mInternetDialogCallback; @Mock private ViewCaptureAwareWindowManager mWindowManager; @Mock @@ -189,7 +189,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { private FakeFeatureFlags mFlags = new FakeFeatureFlags(); private TestableResources mTestableResources; - private InternetDialogController mInternetDialogController; + private InternetDetailsContentController mInternetDetailsContentController; private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); private List<WifiEntry> mAccessPoints = new ArrayList<>(); private List<WifiEntry> mWifiEntries = new ArrayList<>(); @@ -229,7 +229,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mSystemUIToast.getInAnimation()).thenReturn(mAnimator); when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); - mInternetDialogController = new InternetDialogController(mContext, + mInternetDetailsContentController = new InternetDetailsContentController(mContext, mock(UiEventLogger.class), mock(ActivityStarter.class), mAccessPointController, mSubscriptionManager, mTelephonyManager, mWifiManager, mConnectivityManager, mHandler, mExecutor, mBroadcastDispatcher, @@ -238,11 +238,11 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mCarrierConfigTracker, mLocationController, mDialogTransitionAnimator, mWifiStateWorker, mFlags); mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, - mInternetDialogController.mOnSubscriptionsChangedListener); - mInternetDialogController.onStart(mInternetDialogCallback, true); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); - mInternetDialogController.mActivityStarter = mActivityStarter; - mInternetDialogController.mWifiIconInjector = mWifiIconInjector; + mInternetDetailsContentController.mOnSubscriptionsChangedListener); + mInternetDetailsContentController.onStart(mInternetDialogCallback, true); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.mActivityStarter = mActivityStarter; + mInternetDetailsContentController.mWifiIconInjector = mWifiIconInjector; mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, false); mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, false); @@ -260,7 +260,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void connectCarrierNetwork_mergedCarrierEntryCanConnect_connectAndCreateSysUiToast() { - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); when(spyController.isMobileDataEnabled()).thenReturn(true); when(mKeyguardStateController.isUnlocked()).thenReturn(true); when(mConnectivityManager.getActiveNetwork()).thenReturn(mNetwork); @@ -282,7 +282,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenSettingsOff() { - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); when(spyController.isMobileDataEnabled()).thenReturn(false); mTestableResources.addOverride(R.string.wifi_wont_autoconnect_for_now, TOAST_MESSAGE_STRING); @@ -296,7 +296,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenKeyguardLocked() { - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); when(spyController.isMobileDataEnabled()).thenReturn(true); when(mKeyguardStateController.isUnlocked()).thenReturn(false); @@ -311,8 +311,6 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenMobileIsPrimary() { - InternetDialogController spyController = spy(mInternetDialogController); - when(spyController.isMobileDataEnabled()).thenReturn(true); when(mKeyguardStateController.isUnlocked()).thenReturn(true); when(mConnectivityManager.getActiveNetwork()).thenReturn(mNetwork); when(mConnectivityManager.getNetworkCapabilities(mNetwork)) @@ -322,7 +320,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mTestableResources.addOverride(R.string.wifi_wont_autoconnect_for_now, TOAST_MESSAGE_STRING); - mInternetDialogController.connectCarrierNetwork(); + mInternetDetailsContentController.connectCarrierNetwork(); verify(mMergedCarrierEntry, never()).connect(null /* callback */, false /* showToast */); verify(mToastFactory, never()).createToast(any(), any(), anyString(), anyString(), anyInt(), @@ -333,7 +331,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void makeOverlayToast_withGravityFlags_addViewWithLayoutParams() { mTestableResources.addOverride(TOAST_MESSAGE_STRING_ID, TOAST_MESSAGE_STRING); - mInternetDialogController.makeOverlayToast(TOAST_MESSAGE_STRING_ID); + mInternetDetailsContentController.makeOverlayToast(TOAST_MESSAGE_STRING_ID); ArgumentCaptor<WindowManager.LayoutParams> paramsCaptor = ArgumentCaptor.forClass( WindowManager.LayoutParams.class); @@ -349,7 +347,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void makeOverlayToast_withAnimation_verifyAnimatorStart() { mTestableResources.addOverride(TOAST_MESSAGE_STRING_ID, TOAST_MESSAGE_STRING); - mInternetDialogController.makeOverlayToast(TOAST_MESSAGE_STRING_ID); + mInternetDetailsContentController.makeOverlayToast(TOAST_MESSAGE_STRING_ID); verify(mAnimator).start(); } @@ -358,7 +356,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void getDialogTitleText_withAirplaneModeOn_returnAirplaneMode() { fakeAirplaneModeEnabled(true); - assertTrue(TextUtils.equals(mInternetDialogController.getDialogTitleText(), + assertTrue(TextUtils.equals(mInternetDetailsContentController.getDialogTitleText(), getResourcesString("airplane_mode"))); } @@ -366,7 +364,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void getDialogTitleText_withAirplaneModeOff_returnInternet() { fakeAirplaneModeEnabled(false); - assertTrue(TextUtils.equals(mInternetDialogController.getDialogTitleText(), + assertTrue(TextUtils.equals(mInternetDetailsContentController.getDialogTitleText(), getResourcesString("quick_settings_internet_label"))); } @@ -375,13 +373,13 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { fakeAirplaneModeEnabled(true); when(mWifiStateWorker.isWifiEnabled()).thenReturn(false); - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isEqualTo(getResourcesString("wifi_is_off")); // if the Wi-Fi disallow config, then don't return Wi-Fi related string. - mInternetDialogController.mCanConfigWifi = false; + mInternetDetailsContentController.mCanConfigWifi = false; - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isNotEqualTo(getResourcesString("wifi_is_off")); } @@ -390,13 +388,13 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { fakeAirplaneModeEnabled(false); when(mWifiStateWorker.isWifiEnabled()).thenReturn(false); - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isEqualTo(getResourcesString("wifi_is_off")); // if the Wi-Fi disallow config, then don't return Wi-Fi related string. - mInternetDialogController.mCanConfigWifi = false; + mInternetDetailsContentController.mCanConfigWifi = false; - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isNotEqualTo(getResourcesString("wifi_is_off")); } @@ -404,15 +402,15 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void getSubtitleText_withNoWifiEntry_returnSearchWifi() { fakeAirplaneModeEnabled(false); when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); - mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); + mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); - assertThat(mInternetDialogController.getSubtitleText(true)) + assertThat(mInternetDetailsContentController.getSubtitleText(true)) .isEqualTo(getResourcesString("wifi_empty_list_wifi_on")); // if the Wi-Fi disallow config, then don't return Wi-Fi related string. - mInternetDialogController.mCanConfigWifi = false; + mInternetDetailsContentController.mCanConfigWifi = false; - assertThat(mInternetDialogController.getSubtitleText(true)) + assertThat(mInternetDetailsContentController.getSubtitleText(true)) .isNotEqualTo(getResourcesString("wifi_empty_list_wifi_on")); } @@ -422,13 +420,13 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { fakeAirplaneModeEnabled(false); when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isEqualTo(getResourcesString("tap_a_network_to_connect")); // if the Wi-Fi disallow config, then don't return Wi-Fi related string. - mInternetDialogController.mCanConfigWifi = false; + mInternetDetailsContentController.mCanConfigWifi = false; - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isNotEqualTo(getResourcesString("tap_a_network_to_connect")); } @@ -438,14 +436,14 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); when(mKeyguardStateController.isUnlocked()).thenReturn(false); - assertTrue(TextUtils.equals(mInternetDialogController.getSubtitleText(false), + assertTrue(TextUtils.equals(mInternetDetailsContentController.getSubtitleText(false), getResourcesString("unlock_to_view_networks"))); } @Test public void getSubtitleText_withNoService_returnNoNetworksAvailable() { mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); fakeAirplaneModeEnabled(false); when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); spyController.onAccessPointsChanged(null /* accessPoints */); @@ -466,7 +464,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void getSubtitleText_withNoService_returnNoNetworksAvailable_flagOff() { - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); fakeAirplaneModeEnabled(false); when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); spyController.onAccessPointsChanged(null /* accessPoints */); @@ -488,22 +486,22 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void getSubtitleText_withMobileDataDisabled_returnNoOtherAvailable() { fakeAirplaneModeEnabled(false); when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); - mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); - InternetDialogController spyController = spy(mInternetDialogController); + mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); doReturn(ServiceState.STATE_IN_SERVICE).when(mServiceState).getState(); spyController.mSubIdServiceState.put(SUB_ID, mServiceState); - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isEqualTo(getResourcesString("non_carrier_network_unavailable")); // if the Wi-Fi disallow config, then don't return Wi-Fi related string. - mInternetDialogController.mCanConfigWifi = false; + mInternetDetailsContentController.mCanConfigWifi = false; when(spyController.isMobileDataEnabled()).thenReturn(false); - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isNotEqualTo(getResourcesString("non_carrier_network_unavailable")); } @@ -511,21 +509,22 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void getSubtitleText_withCarrierNetworkActiveOnly_returnNoOtherAvailable() { fakeAirplaneModeEnabled(false); when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); - mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); + mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); when(mMergedCarrierEntry.isDefaultNetwork()).thenReturn(true); - assertThat(mInternetDialogController.getSubtitleText(false)) + assertThat(mInternetDetailsContentController.getSubtitleText(false)) .isEqualTo(getResourcesString("non_carrier_network_unavailable")); } @Test public void getWifiDetailsSettingsIntent_withNoKey_returnNull() { - assertThat(mInternetDialogController.getWifiDetailsSettingsIntent(null)).isNull(); + assertThat(mInternetDetailsContentController.getWifiDetailsSettingsIntent(null)).isNull(); } @Test public void getWifiDetailsSettingsIntent_withKey_returnIntent() { - assertThat(mInternetDialogController.getWifiDetailsSettingsIntent("test_key")).isNotNull(); + assertThat(mInternetDetailsContentController.getWifiDetailsSettingsIntent( + "test_key")).isNotNull(); } @Test @@ -533,7 +532,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { final Drawable drawable = mock(Drawable.class); when(mWifiIconInjector.getIcon(anyBoolean(), anyInt())).thenReturn(drawable); - mInternetDialogController.getInternetWifiDrawable(mConnectedEntry); + mInternetDetailsContentController.getInternetWifiDrawable(mConnectedEntry); verify(mWifiIconInjector).getIcon(eq(false), anyInt()); verify(drawable).setTint(mContext.getColor(R.color.connected_network_primary_color)); @@ -543,7 +542,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void getWifiDrawable_withWifiLevelUnreachable_returnNull() { when(mConnectedEntry.getLevel()).thenReturn(WIFI_LEVEL_UNREACHABLE); - assertThat(mInternetDialogController.getWifiDrawable(mConnectedEntry)).isNull(); + assertThat(mInternetDetailsContentController.getWifiDrawable(mConnectedEntry)).isNull(); } @Test @@ -553,19 +552,21 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { Drawable hotspotDrawable = mock(Drawable.class); mTestableResources.addOverride(getHotspotIconResource(DEVICE_TYPE_PHONE), hotspotDrawable); - assertThat(mInternetDialogController.getWifiDrawable(entry)).isEqualTo(hotspotDrawable); + assertThat(mInternetDetailsContentController.getWifiDrawable(entry)).isEqualTo( + hotspotDrawable); } @Test public void startActivityForDialog_always_startActivityWithoutDismissShade() { - mInternetDialogController.startActivityForDialog(mock(Intent.class)); + mInternetDetailsContentController.startActivityForDialog(mock(Intent.class)); verify(mActivityStarter).startActivity(any(Intent.class), eq(false) /* dismissShade */); } @Test public void launchWifiDetailsSetting_withNoWifiEntryKey_doNothing() { - mInternetDialogController.launchWifiDetailsSetting(null /* key */, mDialogLaunchView); + mInternetDetailsContentController.launchWifiDetailsSetting(null /* key */, + mDialogLaunchView); verify(mActivityStarter, never()) .postStartActivityDismissingKeyguard(any(Intent.class), anyInt()); @@ -573,7 +574,8 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void launchWifiDetailsSetting_withWifiEntryKey_startActivity() { - mInternetDialogController.launchWifiDetailsSetting("wifi_entry_key", mDialogLaunchView); + mInternetDetailsContentController.launchWifiDetailsSetting("wifi_entry_key", + mDialogLaunchView); verify(mActivityStarter).postStartActivityDismissingKeyguard(any(Intent.class), anyInt(), any()); @@ -583,22 +585,22 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void isDeviceLocked_keyguardIsUnlocked_returnFalse() { when(mKeyguardStateController.isUnlocked()).thenReturn(true); - assertThat(mInternetDialogController.isDeviceLocked()).isFalse(); + assertThat(mInternetDetailsContentController.isDeviceLocked()).isFalse(); } @Test public void isDeviceLocked_keyguardIsLocked_returnTrue() { when(mKeyguardStateController.isUnlocked()).thenReturn(false); - assertThat(mInternetDialogController.isDeviceLocked()).isTrue(); + assertThat(mInternetDetailsContentController.isDeviceLocked()).isTrue(); } @Test public void onAccessPointsChanged_canNotConfigWifi_doNothing() { reset(mInternetDialogCallback); - mInternetDialogController.mCanConfigWifi = false; + mInternetDetailsContentController.mCanConfigWifi = false; - mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); + mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); verify(mInternetDialogCallback, never()).onAccessPointsChanged(any(), any(), anyBoolean()); } @@ -607,7 +609,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void onAccessPointsChanged_nullAccessPoints_callbackBothNull() { reset(mInternetDialogCallback); - mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); + mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); verify(mInternetDialogCallback).onAccessPointsChanged(null /* wifiEntries */, null /* connectedEntry */, false /* hasMoreEntry */); @@ -619,7 +621,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mAccessPoints.clear(); mAccessPoints.add(mConnectedEntry); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); mWifiEntries.clear(); verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, mConnectedEntry, @@ -632,7 +634,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mAccessPoints.clear(); mAccessPoints.add(mWifiEntry1); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); mWifiEntries.clear(); mWifiEntries.add(mWifiEntry1); @@ -647,7 +649,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mAccessPoints.add(mConnectedEntry); mAccessPoints.add(mWifiEntry1); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); mWifiEntries.clear(); mWifiEntries.add(mWifiEntry1); @@ -663,7 +665,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mAccessPoints.add(mWifiEntry1); mAccessPoints.add(mWifiEntry2); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); mWifiEntries.clear(); mWifiEntries.add(mWifiEntry1); @@ -681,7 +683,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mAccessPoints.add(mWifiEntry2); mAccessPoints.add(mWifiEntry3); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); mWifiEntries.clear(); mWifiEntries.add(mWifiEntry1); @@ -699,7 +701,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mAccessPoints.add(mWifiEntry3); mAccessPoints.add(mWifiEntry4); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); mWifiEntries.clear(); mWifiEntries.add(mWifiEntry1); @@ -718,7 +720,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mWifiEntry1.hasInternetAccess()).thenReturn(false); mAccessPoints.add(mWifiEntry1); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); mWifiEntries.clear(); mWifiEntries.add(mWifiEntry1); @@ -735,9 +737,10 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mWifiEntry1.hasInternetAccess()).thenReturn(false); mAccessPoints.add(mWifiEntry1); - mInternetDialogController.onAccessPointsChanged(mAccessPoints); + mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); - verify(mWifiEntry1).setListener(mInternetDialogController.mConnectedWifiInternetMonitor); + verify(mWifiEntry1).setListener( + mInternetDetailsContentController.mConnectedWifiInternetMonitor); } @Test @@ -746,8 +749,9 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mWifiEntry1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED); when(mWifiEntry1.isDefaultNetwork()).thenReturn(true); when(mWifiEntry1.hasInternetAccess()).thenReturn(false); - InternetDialogController.ConnectedWifiInternetMonitor mConnectedWifiInternetMonitor = - mInternetDialogController.mConnectedWifiInternetMonitor; + InternetDetailsContentController.ConnectedWifiInternetMonitor + mConnectedWifiInternetMonitor = + mInternetDetailsContentController.mConnectedWifiInternetMonitor; mConnectedWifiInternetMonitor.registerCallbackIfNeed(mWifiEntry1); // When the hasInternetAccess() changed to true, and call back the onUpdated() function. @@ -762,7 +766,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { reset(mInternetDialogCallback); when(mWifiStateWorker.isWifiEnabled()).thenReturn(false); - mInternetDialogController.onWifiScan(true); + mInternetDetailsContentController.onWifiScan(true); verify(mInternetDialogCallback).onWifiScan(false); } @@ -772,7 +776,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { reset(mInternetDialogCallback); when(mKeyguardStateController.isUnlocked()).thenReturn(false); - mInternetDialogController.onWifiScan(true); + mInternetDetailsContentController.onWifiScan(true); verify(mInternetDialogCallback).onWifiScan(false); } @@ -781,7 +785,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void onWifiScan_onWifiScanFalse_callbackOnWifiScanFalse() { reset(mInternetDialogCallback); - mInternetDialogController.onWifiScan(false); + mInternetDetailsContentController.onWifiScan(false); verify(mInternetDialogCallback).onWifiScan(false); } @@ -790,7 +794,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void onWifiScan_onWifiScanTrue_callbackOnWifiScanTrue() { reset(mInternetDialogCallback); - mInternetDialogController.onWifiScan(true); + mInternetDetailsContentController.onWifiScan(true); verify(mInternetDialogCallback).onWifiScan(true); } @@ -800,7 +804,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(SUB_ID)) .thenReturn(true); - mInternetDialogController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); + mInternetDetailsContentController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); verify(mMergedCarrierEntry, never()).setEnabled(anyBoolean()); } @@ -811,7 +815,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { .thenReturn(false); when(mAccessPointController.getMergedCarrierEntry()).thenReturn(null); - mInternetDialogController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); + mInternetDetailsContentController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); } @Test @@ -819,11 +823,11 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(SUB_ID)) .thenReturn(false); - mInternetDialogController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); + mInternetDetailsContentController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); verify(mMergedCarrierEntry).setEnabled(true); - mInternetDialogController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, false); + mInternetDetailsContentController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, false); verify(mMergedCarrierEntry).setEnabled(false); } @@ -833,11 +837,11 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mLocationController.isLocationEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); - assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); + assertThat(mInternetDetailsContentController.isWifiScanEnabled()).isFalse(); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); - assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); + assertThat(mInternetDetailsContentController.isWifiScanEnabled()).isFalse(); } @Test @@ -845,17 +849,17 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(mLocationController.isLocationEnabled()).thenReturn(true); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); - assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); + assertThat(mInternetDetailsContentController.isWifiScanEnabled()).isFalse(); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); - assertThat(mInternetDialogController.isWifiScanEnabled()).isTrue(); + assertThat(mInternetDetailsContentController.isWifiScanEnabled()).isTrue(); } @Test public void getSignalStrengthIcon_differentSubId() { mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); Drawable icons = spyController.getSignalStrengthIcon(SUB_ID, mContext, 1, 1, 0, false); Drawable icons2 = spyController.getSignalStrengthIcon(SUB_ID2, mContext, 1, 1, 0, false); @@ -870,12 +874,12 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { doReturn(SUB_ID2).when(info).getSubscriptionId(); when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); - int subId = mInternetDialogController.getActiveAutoSwitchNonDdsSubId(); + int subId = mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); assertThat(subId).isEqualTo(SUB_ID2); // active on CBRS doReturn(true).when(info).isOpportunistic(); - subId = mInternetDialogController.getActiveAutoSwitchNonDdsSubId(); + subId = mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); assertThat(subId).isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID); // active on DDS @@ -883,7 +887,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { doReturn(SUB_ID).when(info).getSubscriptionId(); when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); - subId = mInternetDialogController.getActiveAutoSwitchNonDdsSubId(); + subId = mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); assertThat(subId).isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID); } @@ -894,7 +898,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { doReturn(SUB_ID2).when(info).getSubscriptionId(); when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); - int subId = mInternetDialogController.getActiveAutoSwitchNonDdsSubId(); + int subId = mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); assertThat(subId).isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID); } @@ -908,22 +912,24 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { doReturn(false).when(info).isOpportunistic(); when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); - mInternetDialogController.getActiveAutoSwitchNonDdsSubId(); + mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); // 1st time is onStart(), 2nd time is getActiveAutoSwitchNonDdsSubId() verify(mTelephonyManager, times(2)).registerTelephonyCallback(any(), any()); - assertThat(mInternetDialogController.mSubIdTelephonyCallbackMap.size()).isEqualTo(2); + assertThat(mInternetDetailsContentController.mSubIdTelephonyCallbackMap.size()).isEqualTo( + 2); // Adds non DDS subId again doReturn(SUB_ID2).when(info).getSubscriptionId(); doReturn(false).when(info).isOpportunistic(); when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); - mInternetDialogController.getActiveAutoSwitchNonDdsSubId(); + mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); // Does not add due to cached subInfo in mSubIdTelephonyCallbackMap. verify(mTelephonyManager, times(2)).registerTelephonyCallback(any(), any()); - assertThat(mInternetDialogController.mSubIdTelephonyCallbackMap.size()).isEqualTo(2); + assertThat(mInternetDetailsContentController.mSubIdTelephonyCallbackMap.size()).isEqualTo( + 2); } @Test @@ -936,7 +942,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(SubscriptionManager.getResourcesForSubId(any(), eq(SUB_ID))).thenReturn(res1); when(SubscriptionManager.getResourcesForSubId(any(), eq(SUB_ID2))).thenReturn(res2); - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); Map<Integer, TelephonyDisplayInfo> mSubIdTelephonyDisplayInfoMap = spyController.mSubIdTelephonyDisplayInfoMap; TelephonyDisplayInfo info1 = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_EDGE, @@ -961,7 +967,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void getMobileNetworkSummary_flagOff() { - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); doReturn(true).when(spyController).isMobileDataEnabled(); doReturn(true).when(spyController).activeNetworkIsCellular(); String dds = spyController.getMobileNetworkSummary(SUB_ID); @@ -972,7 +978,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void launchMobileNetworkSettings_validSubId() { mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); doReturn(SUB_ID2).when(spyController).getActiveAutoSwitchNonDdsSubId(); spyController.launchMobileNetworkSettings(mDialogLaunchView); @@ -983,7 +989,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void launchMobileNetworkSettings_invalidSubId() { mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); doReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID) .when(spyController).getActiveAutoSwitchNonDdsSubId(); spyController.launchMobileNetworkSettings(mDialogLaunchView); @@ -995,7 +1001,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { @Test public void setAutoDataSwitchMobileDataPolicy() { mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); - mInternetDialogController.setAutoDataSwitchMobileDataPolicy(SUB_ID, true); + mInternetDetailsContentController.setAutoDataSwitchMobileDataPolicy(SUB_ID, true); verify(mTelephonyManager).setMobileDataPolicyEnabled(eq( TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH), eq(true)); @@ -1006,9 +1012,9 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { // Fake mobile data level as SIGNAL_STRENGTH_POOR(1) when(mSignalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_POOR); // Fake carrier network level as WIFI_LEVEL_MAX(4) - when(mInternetDialogController.getCarrierNetworkLevel()).thenReturn(WIFI_LEVEL_MAX); + when(mInternetDetailsContentController.getCarrierNetworkLevel()).thenReturn(WIFI_LEVEL_MAX); - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); spyController.getSignalStrengthDrawableWithLevel(false /* isCarrierNetworkActive */, 0); verify(spyController).getSignalStrengthIcon(eq(0), any(), eq(SIGNAL_STRENGTH_POOR), @@ -1020,9 +1026,9 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { // Fake mobile data level as SIGNAL_STRENGTH_POOR(1) when(mSignalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_POOR); // Fake carrier network level as WIFI_LEVEL_MAX(4) - when(mInternetDialogController.getCarrierNetworkLevel()).thenReturn(WIFI_LEVEL_MAX); + when(mInternetDetailsContentController.getCarrierNetworkLevel()).thenReturn(WIFI_LEVEL_MAX); - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); spyController.getSignalStrengthDrawableWithLevel(true /* isCarrierNetworkActive */, 0); verify(spyController).getSignalStrengthIcon(eq(0), any(), eq(WIFI_LEVEL_MAX), @@ -1033,14 +1039,16 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void getCarrierNetworkLevel_mergedCarrierEntryIsNull_returnMinLevel() { when(mAccessPointController.getMergedCarrierEntry()).thenReturn(null); - assertThat(mInternetDialogController.getCarrierNetworkLevel()).isEqualTo(WIFI_LEVEL_MIN); + assertThat(mInternetDetailsContentController.getCarrierNetworkLevel()).isEqualTo( + WIFI_LEVEL_MIN); } @Test public void getCarrierNetworkLevel_getUnreachableLevel_returnMinLevel() { when(mMergedCarrierEntry.getLevel()).thenReturn(WIFI_LEVEL_UNREACHABLE); - assertThat(mInternetDialogController.getCarrierNetworkLevel()).isEqualTo(WIFI_LEVEL_MIN); + assertThat(mInternetDetailsContentController.getCarrierNetworkLevel()).isEqualTo( + WIFI_LEVEL_MIN); } @Test @@ -1048,7 +1056,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { for (int level = WIFI_LEVEL_MIN; level <= WIFI_LEVEL_MAX; level++) { when(mMergedCarrierEntry.getLevel()).thenReturn(level); - assertThat(mInternetDialogController.getCarrierNetworkLevel()).isEqualTo(level); + assertThat(mInternetDetailsContentController.getCarrierNetworkLevel()).isEqualTo(level); } } @@ -1057,7 +1065,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { Resources res = mock(Resources.class); doReturn("Carrier network changing").when(res).getString(anyInt()); when(SubscriptionManager.getResourcesForSubId(any(), eq(SUB_ID))).thenReturn(res); - InternetDialogController spyController = spy(mInternetDialogController); + InternetDetailsContentController spyController = spy(mInternetDetailsContentController); Map<Integer, TelephonyDisplayInfo> mSubIdTelephonyDisplayInfoMap = spyController.mSubIdTelephonyDisplayInfoMap; TelephonyDisplayInfo info = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_LTE, @@ -1076,14 +1084,14 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { public void getConfiguratorQrCodeGeneratorIntentOrNull_wifiNotShareable_returnNull() { mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, true); when(mConnectedEntry.canShare()).thenReturn(false); - assertThat(mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull( + assertThat(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( mConnectedEntry)).isNull(); } @Test public void getConfiguratorQrCodeGeneratorIntentOrNull_flagOff_returnNull() { mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, false); when(mConnectedEntry.canShare()).thenReturn(true); - assertThat(mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull( + assertThat(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( mConnectedEntry)).isNull(); } @@ -1092,7 +1100,7 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, true); when(mConnectedEntry.canShare()).thenReturn(true); when(mConnectedEntry.getWifiConfiguration()).thenReturn(null); - assertThat(mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull( + assertThat(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( mConnectedEntry)).isNull(); } @@ -1101,30 +1109,34 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, true); when(mConnectedEntry.canShare()).thenReturn(true); when(mConnectedEntry.getWifiConfiguration()).thenReturn(mWifiConfiguration); - assertThat(mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull( + assertThat(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( mConnectedEntry)).isNotNull(); } @Test public void onStop_cleanUp() { doReturn(SUB_ID).when(mTelephonyManager).getSubscriptionId(); - assertThat(mInternetDialogController.mSubIdTelephonyManagerMap.get(SUB_ID)).isEqualTo( + assertThat( + mInternetDetailsContentController.mSubIdTelephonyManagerMap.get(SUB_ID)).isEqualTo( mTelephonyManager); - assertThat(mInternetDialogController.mSubIdTelephonyCallbackMap.get(SUB_ID)).isNotNull(); - assertThat(mInternetDialogController.mCallback).isNotNull(); + assertThat(mInternetDetailsContentController.mSubIdTelephonyCallbackMap.get( + SUB_ID)).isNotNull(); + assertThat(mInternetDetailsContentController.mCallback).isNotNull(); - mInternetDialogController.onStop(); + mInternetDetailsContentController.onStop(); verify(mTelephonyManager).unregisterTelephonyCallback(any(TelephonyCallback.class)); - assertThat(mInternetDialogController.mSubIdTelephonyDisplayInfoMap.isEmpty()).isTrue(); - assertThat(mInternetDialogController.mSubIdTelephonyManagerMap.isEmpty()).isTrue(); - assertThat(mInternetDialogController.mSubIdTelephonyCallbackMap.isEmpty()).isTrue(); - verify(mSubscriptionManager).removeOnSubscriptionsChangedListener(mInternetDialogController - .mOnSubscriptionsChangedListener); - verify(mAccessPointController).removeAccessPointCallback(mInternetDialogController); + assertThat( + mInternetDetailsContentController.mSubIdTelephonyDisplayInfoMap.isEmpty()).isTrue(); + assertThat(mInternetDetailsContentController.mSubIdTelephonyManagerMap.isEmpty()).isTrue(); + assertThat(mInternetDetailsContentController.mSubIdTelephonyCallbackMap.isEmpty()).isTrue(); + verify(mSubscriptionManager).removeOnSubscriptionsChangedListener( + mInternetDetailsContentController + .mOnSubscriptionsChangedListener); + verify(mAccessPointController).removeAccessPointCallback(mInternetDetailsContentController); verify(mConnectivityManager).unregisterNetworkCallback( any(ConnectivityManager.NetworkCallback.class)); - assertThat(mInternetDialogController.mCallback).isNull(); + assertThat(mInternetDetailsContentController.mCallback).isNull(); } @Test @@ -1132,16 +1144,16 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(SubscriptionManager.getDefaultDataSubscriptionId()) .thenReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID); - mInternetDialogController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); + mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); - assertThat(mInternetDialogController.hasActiveSubIdOnDds()).isFalse(); + assertThat(mInternetDetailsContentController.hasActiveSubIdOnDds()).isFalse(); } @Test public void hasActiveSubIdOnDds_activeDds_returnTrue() { - mInternetDialogController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); + mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); - assertThat(mInternetDialogController.hasActiveSubIdOnDds()).isTrue(); + assertThat(mInternetDetailsContentController.hasActiveSubIdOnDds()).isTrue(); } @Test @@ -1153,9 +1165,9 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(info.getProfileClass()).thenReturn(PROFILE_CLASS_PROVISIONING); when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(info); - mInternetDialogController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); + mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); - assertThat(mInternetDialogController.hasActiveSubIdOnDds()).isFalse(); + assertThat(mInternetDetailsContentController.hasActiveSubIdOnDds()).isFalse(); } @Test @@ -1167,9 +1179,9 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(info.isOnlyNonTerrestrialNetwork()).thenReturn(true); when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(info); - mInternetDialogController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); + mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); - assertFalse(mInternetDialogController.hasActiveSubIdOnDds()); + assertFalse(mInternetDetailsContentController.hasActiveSubIdOnDds()); } @Test @@ -1181,9 +1193,9 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase { when(info.isOnlyNonTerrestrialNetwork()).thenReturn(false); when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(info); - mInternetDialogController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); + mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); - assertTrue(mInternetDialogController.hasActiveSubIdOnDds()); + assertTrue(mInternetDetailsContentController.hasActiveSubIdOnDds()); } private String getResourcesString(String name) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacyTest.java index 8560b67dee33..238551589361 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacyTest.java @@ -1,6 +1,6 @@ package com.android.systemui.qs.tiles.dialog; -import static com.android.systemui.qs.tiles.dialog.InternetDialogController.MAX_WIFI_ENTRY_COUNT; +import static com.android.systemui.qs.tiles.dialog.InternetDetailsContentController.MAX_WIFI_ENTRY_COUNT; import static com.google.common.truth.Truth.assertThat; @@ -58,7 +58,7 @@ import kotlinx.coroutines.CoroutineScope; @RunWith(AndroidJUnit4.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @UiThreadTest -public class InternetDialogDelegateTest extends SysuiTestCase { +public class InternetDialogDelegateLegacyTest extends SysuiTestCase { private static final String MOBILE_NETWORK_TITLE = "Mobile Title"; private static final String MOBILE_NETWORK_SUMMARY = "Mobile Summary"; @@ -78,7 +78,7 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Mock private InternetAdapter mInternetAdapter; @Mock - private InternetDialogController mInternetDialogController; + private InternetDetailsContentController mInternetDetailsContentController; @Mock private KeyguardStateController mKeyguard; @Mock @@ -91,7 +91,7 @@ public class InternetDialogDelegateTest extends SysuiTestCase { private Window mWindow; private FakeExecutor mBgExecutor = new FakeExecutor(new FakeSystemClock()); - private InternetDialogDelegate mInternetDialogDelegate; + private InternetDialogDelegateLegacy mInternetDialogDelegateLegacy; private View mDialogView; private View mSubTitle; private LinearLayout mEthernet; @@ -118,12 +118,12 @@ public class InternetDialogDelegateTest extends SysuiTestCase { when(mInternetWifiEntry.hasInternetAccess()).thenReturn(true); when(mWifiEntries.size()).thenReturn(1); - when(mInternetDialogController.getMobileNetworkTitle(anyInt())) + when(mInternetDetailsContentController.getMobileNetworkTitle(anyInt())) .thenReturn(MOBILE_NETWORK_TITLE); - when(mInternetDialogController.getMobileNetworkSummary(anyInt())) + when(mInternetDetailsContentController.getMobileNetworkSummary(anyInt())) .thenReturn(MOBILE_NETWORK_SUMMARY); - when(mInternetDialogController.isWifiEnabled()).thenReturn(true); - when(mInternetDialogController.getActiveAutoSwitchNonDdsSubId()).thenReturn( + when(mInternetDetailsContentController.isWifiEnabled()).thenReturn(true); + when(mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId()).thenReturn( SubscriptionManager.INVALID_SUBSCRIPTION_ID); mMockitoSession = ExtendedMockito.mockitoSession() .spyStatic(WifiEnterpriseRestrictionUtils.class) @@ -137,10 +137,10 @@ public class InternetDialogDelegateTest extends SysuiTestCase { } private void createInternetDialog() { - mInternetDialogDelegate = new InternetDialogDelegate( + mInternetDialogDelegateLegacy = new InternetDialogDelegateLegacy( mContext, mock(InternetDialogManager.class), - mInternetDialogController, + mInternetDetailsContentController, true, true, true, @@ -152,13 +152,13 @@ public class InternetDialogDelegateTest extends SysuiTestCase { mKeyguard, mSystemUIDialogFactory, new FakeShadeDialogContextInteractor(mContext)); - mInternetDialogDelegate.createDialog(); - mInternetDialogDelegate.onCreate(mSystemUIDialog, null); - mInternetDialogDelegate.mAdapter = mInternetAdapter; - mInternetDialogDelegate.mConnectedWifiEntry = mInternetWifiEntry; - mInternetDialogDelegate.mWifiEntriesCount = mWifiEntries.size(); + mInternetDialogDelegateLegacy.createDialog(); + mInternetDialogDelegateLegacy.onCreate(mSystemUIDialog, null); + mInternetDialogDelegateLegacy.mAdapter = mInternetAdapter; + mInternetDialogDelegateLegacy.mConnectedWifiEntry = mInternetWifiEntry; + mInternetDialogDelegateLegacy.mWifiEntriesCount = mWifiEntries.size(); - mDialogView = mInternetDialogDelegate.mDialogView; + mDialogView = mInternetDialogDelegateLegacy.mDialogView; mSubTitle = mDialogView.requireViewById(R.id.internet_dialog_subtitle); mEthernet = mDialogView.requireViewById(R.id.ethernet_layout); mMobileDataLayout = mDialogView.requireViewById(R.id.mobile_network_layout); @@ -171,13 +171,13 @@ public class InternetDialogDelegateTest extends SysuiTestCase { mSeeAll = mDialogView.requireViewById(R.id.see_all_layout); mWifiScanNotify = mDialogView.requireViewById(R.id.wifi_scan_notify_layout); mAirplaneModeSummaryText = mDialogView.requireViewById(R.id.airplane_mode_summary); - mInternetDialogDelegate.onStart(mSystemUIDialog); + mInternetDialogDelegateLegacy.onStart(mSystemUIDialog); } @After public void tearDown() { - mInternetDialogDelegate.onStop(mSystemUIDialog); - mInternetDialogDelegate.dismissDialog(); + mInternetDialogDelegateLegacy.onStop(mSystemUIDialog); + mInternetDialogDelegateLegacy.dismissDialog(); mMockitoSession.finishMocking(); } @@ -189,9 +189,9 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void hideWifiViews_WifiViewsGone() { - mInternetDialogDelegate.hideWifiViews(); + mInternetDialogDelegateLegacy.hideWifiViews(); - assertThat(mInternetDialogDelegate.mIsProgressBarVisible).isFalse(); + assertThat(mInternetDialogDelegateLegacy.mIsProgressBarVisible).isFalse(); assertThat(mWifiToggle.getVisibility()).isEqualTo(View.GONE); assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.GONE); assertThat(mWifiList.getVisibility()).isEqualTo(View.GONE); @@ -200,76 +200,76 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_withApmOn_internetDialogSubTitleGone() { - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mSubTitle.getVisibility()).isEqualTo(View.VISIBLE); }); } @Test public void updateDialog_withApmOff_internetDialogSubTitleVisible() { - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(false); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mSubTitle.getVisibility()).isEqualTo(View.VISIBLE); }); } @Test public void updateDialog_apmOffAndHasEthernet_showEthernet() { - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); - when(mInternetDialogController.hasEthernet()).thenReturn(true); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(false); + when(mInternetDetailsContentController.hasEthernet()).thenReturn(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mEthernet.getVisibility()).isEqualTo(View.VISIBLE); }); } @Test public void updateDialog_apmOffAndNoEthernet_hideEthernet() { - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); - when(mInternetDialogController.hasEthernet()).thenReturn(false); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(false); + when(mInternetDetailsContentController.hasEthernet()).thenReturn(false); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mEthernet.getVisibility()).isEqualTo(View.GONE); }); } @Test public void updateDialog_apmOnAndHasEthernet_showEthernet() { - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - when(mInternetDialogController.hasEthernet()).thenReturn(true); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(true); + when(mInternetDetailsContentController.hasEthernet()).thenReturn(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mEthernet.getVisibility()).isEqualTo(View.VISIBLE); }); } @Test public void updateDialog_apmOnAndNoEthernet_hideEthernet() { - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - when(mInternetDialogController.hasEthernet()).thenReturn(false); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(true); + when(mInternetDetailsContentController.hasEthernet()).thenReturn(false); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mEthernet.getVisibility()).isEqualTo(View.GONE); }); } @@ -277,14 +277,14 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_apmOffAndNotCarrierNetwork_mobileDataLayoutGone() { // Mobile network should be gone if the list of active subscriptionId is null. - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(false); - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); - when(mInternetDialogController.hasActiveSubIdOnDds()).thenReturn(false); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(false); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(false); + when(mInternetDetailsContentController.hasActiveSubIdOnDds()).thenReturn(false); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.GONE); }); } @@ -292,14 +292,14 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_apmOnWithCarrierNetworkAndWifiStatus_mobileDataLayoutVisible() { // Carrier network should be visible if airplane mode ON and Wi-Fi is ON. - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - when(mInternetDialogController.isWifiEnabled()).thenReturn(true); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(true); + when(mInternetDetailsContentController.isWifiEnabled()).thenReturn(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.VISIBLE); }); } @@ -307,42 +307,42 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_apmOnWithCarrierNetworkAndWifiStatus_mobileDataLayoutGone() { // Carrier network should be gone if airplane mode ON and Wi-Fi is off. - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - when(mInternetDialogController.isWifiEnabled()).thenReturn(false); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(true); + when(mInternetDetailsContentController.isWifiEnabled()).thenReturn(false); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.GONE); }); } @Test public void updateDialog_apmOnAndNoCarrierNetwork_mobileDataLayoutGone() { - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(false); - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(false); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.GONE); }); } @Test public void updateDialog_apmOnAndWifiOnHasCarrierNetwork_showAirplaneSummary() { - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - mInternetDialogDelegate.mConnectedWifiEntry = null; - doReturn(false).when(mInternetDialogController).activeNetworkIsCellular(); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(true); + mInternetDialogDelegateLegacy.mConnectedWifiEntry = null; + doReturn(false).when(mInternetDetailsContentController).activeNetworkIsCellular(); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mMobileDataLayout.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.VISIBLE); }); @@ -350,87 +350,87 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_apmOffAndWifiOnHasCarrierNetwork_notShowApmSummary() { - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); - mInternetDialogDelegate.mConnectedWifiEntry = null; - doReturn(false).when(mInternetDialogController).activeNetworkIsCellular(); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(false); + mInternetDialogDelegateLegacy.mConnectedWifiEntry = null; + doReturn(false).when(mInternetDetailsContentController).activeNetworkIsCellular(); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.GONE); }); } @Test public void updateDialog_apmOffAndHasCarrierNetwork_notShowApmSummary() { - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(false); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.GONE); }); } @Test public void updateDialog_apmOnAndNoCarrierNetwork_notShowApmSummary() { - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(false); - when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(false); + when(mInternetDetailsContentController.isAirplaneModeEnabled()).thenReturn(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.GONE); }); } @Test public void updateDialog_mobileDataIsEnabled_checkMobileDataSwitch() { - doReturn(true).when(mInternetDialogController).hasActiveSubIdOnDds(); - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); - when(mInternetDialogController.isMobileDataEnabled()).thenReturn(true); + doReturn(true).when(mInternetDetailsContentController).hasActiveSubIdOnDds(); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDetailsContentController.isMobileDataEnabled()).thenReturn(true); mMobileToggleSwitch.setChecked(false); - mInternetDialogDelegate.updateDialog(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mMobileToggleSwitch.isChecked()).isTrue(); }); } @Test public void updateDialog_mobileDataIsNotChanged_checkMobileDataSwitch() { - doReturn(true).when(mInternetDialogController).hasActiveSubIdOnDds(); - when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); - when(mInternetDialogController.isMobileDataEnabled()).thenReturn(false); + doReturn(true).when(mInternetDetailsContentController).hasActiveSubIdOnDds(); + when(mInternetDetailsContentController.isCarrierNetworkActive()).thenReturn(true); + when(mInternetDetailsContentController.isMobileDataEnabled()).thenReturn(false); mMobileToggleSwitch.setChecked(false); - mInternetDialogDelegate.updateDialog(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mMobileToggleSwitch.isChecked()).isFalse(); }); } @Test public void updateDialog_wifiOnAndHasInternetWifi_showConnectedWifi() { - when(mInternetDialogController.getActiveAutoSwitchNonDdsSubId()).thenReturn(1); - doReturn(true).when(mInternetDialogController).hasActiveSubIdOnDds(); + when(mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId()).thenReturn(1); + doReturn(true).when(mInternetDetailsContentController).hasActiveSubIdOnDds(); // The preconditions WiFi ON and Internet WiFi are already in setUp() - doReturn(false).when(mInternetDialogController).activeNetworkIsCellular(); + doReturn(false).when(mInternetDetailsContentController).activeNetworkIsCellular(); - mInternetDialogDelegate.updateDialog(true); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.VISIBLE); LinearLayout secondaryLayout = mDialogView.requireViewById( R.id.secondary_mobile_network_layout); @@ -441,13 +441,13 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOnAndNoConnectedWifi_hideConnectedWifi() { // The precondition WiFi ON is already in setUp() - mInternetDialogDelegate.mConnectedWifiEntry = null; - doReturn(false).when(mInternetDialogController).activeNetworkIsCellular(); - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.mConnectedWifiEntry = null; + doReturn(false).when(mInternetDetailsContentController).activeNetworkIsCellular(); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.GONE); }); } @@ -455,13 +455,13 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOnAndNoWifiEntry_showWifiListAndSeeAllArea() { // The precondition WiFi ON is already in setUp() - mInternetDialogDelegate.mConnectedWifiEntry = null; - mInternetDialogDelegate.mWifiEntriesCount = 0; - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.mConnectedWifiEntry = null; + mInternetDialogDelegateLegacy.mWifiEntriesCount = 0; + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.GONE); // Show a blank block to fix the dialog height even if there is no WiFi list assertThat(mWifiList.getVisibility()).isEqualTo(View.VISIBLE); @@ -473,13 +473,13 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOnAndOneWifiEntry_showWifiListAndSeeAllArea() { // The precondition WiFi ON is already in setUp() - mInternetDialogDelegate.mConnectedWifiEntry = null; - mInternetDialogDelegate.mWifiEntriesCount = 1; - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.mConnectedWifiEntry = null; + mInternetDialogDelegateLegacy.mWifiEntriesCount = 1; + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.GONE); // Show a blank block to fix the dialog height even if there is no WiFi list assertThat(mWifiList.getVisibility()).isEqualTo(View.VISIBLE); @@ -491,12 +491,12 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOnAndHasConnectedWifi_showAllWifiAndSeeAllArea() { // The preconditions WiFi ON and WiFi entries are already in setUp() - mInternetDialogDelegate.mWifiEntriesCount = 0; - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.mWifiEntriesCount = 0; + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.VISIBLE); // Show a blank block to fix the dialog height even if there is no WiFi list assertThat(mWifiList.getVisibility()).isEqualTo(View.VISIBLE); @@ -508,14 +508,14 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOnAndHasMaxWifiList_showWifiListAndSeeAll() { // The preconditions WiFi ON and WiFi entries are already in setUp() - mInternetDialogDelegate.mConnectedWifiEntry = null; - mInternetDialogDelegate.mWifiEntriesCount = MAX_WIFI_ENTRY_COUNT; - mInternetDialogDelegate.mHasMoreWifiEntries = true; - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.mConnectedWifiEntry = null; + mInternetDialogDelegateLegacy.mWifiEntriesCount = MAX_WIFI_ENTRY_COUNT; + mInternetDialogDelegateLegacy.mHasMoreWifiEntries = true; + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.GONE); assertThat(mWifiList.getVisibility()).isEqualTo(View.VISIBLE); verify(mInternetAdapter).setMaxEntriesCount(3); @@ -526,13 +526,13 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOnAndHasBothWifiEntry_showBothWifiEntryAndSeeAll() { // The preconditions WiFi ON and WiFi entries are already in setUp() - mInternetDialogDelegate.mWifiEntriesCount = MAX_WIFI_ENTRY_COUNT - 1; - mInternetDialogDelegate.mHasMoreWifiEntries = true; - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.mWifiEntriesCount = MAX_WIFI_ENTRY_COUNT - 1; + mInternetDialogDelegateLegacy.mHasMoreWifiEntries = true; + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mWifiList.getVisibility()).isEqualTo(View.VISIBLE); verify(mInternetAdapter).setMaxEntriesCount(2); @@ -543,13 +543,13 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_deviceLockedAndNoConnectedWifi_showWifiToggle() { // The preconditions WiFi entries are already in setUp() - when(mInternetDialogController.isDeviceLocked()).thenReturn(true); - mInternetDialogDelegate.mConnectedWifiEntry = null; - mInternetDialogDelegate.updateDialog(false); + when(mInternetDetailsContentController.isDeviceLocked()).thenReturn(true); + mInternetDialogDelegateLegacy.mConnectedWifiEntry = null; + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { // Show WiFi Toggle without background assertThat(mWifiToggle.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mWifiToggle.getBackground()).isNull(); @@ -563,12 +563,12 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_deviceLockedAndHasConnectedWifi_showWifiToggleWithBackground() { // The preconditions WiFi ON and WiFi entries are already in setUp() - when(mInternetDialogController.isDeviceLocked()).thenReturn(true); - mInternetDialogDelegate.updateDialog(false); + when(mInternetDetailsContentController.isDeviceLocked()).thenReturn(true); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { // Show WiFi Toggle with highlight background assertThat(mWifiToggle.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mWifiToggle.getBackground()).isNotNull(); @@ -581,14 +581,14 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_disallowChangeWifiState_disableWifiSwitch() { - mInternetDialogDelegate.dismissDialog(); + mInternetDialogDelegateLegacy.dismissDialog(); when(WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(mContext)).thenReturn(false); createInternetDialog(); - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { // Disable Wi-Fi switch and show restriction message in summary. assertThat(mWifiToggleSwitch.isEnabled()).isFalse(); assertThat(mWifiToggleSummary.getVisibility()).isEqualTo(View.VISIBLE); @@ -598,14 +598,14 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_allowChangeWifiState_enableWifiSwitch() { - mInternetDialogDelegate.dismissDialog(); + mInternetDialogDelegateLegacy.dismissDialog(); when(WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(mContext)).thenReturn(true); createInternetDialog(); - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { // Enable Wi-Fi switch and hide restriction message in summary. assertThat(mWifiToggleSwitch.isEnabled()).isTrue(); assertThat(mWifiToggleSummary.getVisibility()).isEqualTo(View.GONE); @@ -614,22 +614,22 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_showSecondaryDataSub() { - when(mInternetDialogController.getActiveAutoSwitchNonDdsSubId()).thenReturn(1); - doReturn(1).when(mInternetDialogController).getActiveAutoSwitchNonDdsSubId(); - doReturn(true).when(mInternetDialogController).hasActiveSubIdOnDds(); - doReturn(false).when(mInternetDialogController).isAirplaneModeEnabled(); - clearInvocations(mInternetDialogController); - mInternetDialogDelegate.updateDialog(true); + when(mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId()).thenReturn(1); + doReturn(1).when(mInternetDetailsContentController).getActiveAutoSwitchNonDdsSubId(); + doReturn(true).when(mInternetDetailsContentController).hasActiveSubIdOnDds(); + doReturn(false).when(mInternetDetailsContentController).isAirplaneModeEnabled(); + clearInvocations(mInternetDetailsContentController); + mInternetDialogDelegateLegacy.updateDialog(true); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { LinearLayout primaryLayout = mDialogView.requireViewById( R.id.mobile_network_layout); LinearLayout secondaryLayout = mDialogView.requireViewById( R.id.secondary_mobile_network_layout); - verify(mInternetDialogController).getMobileNetworkSummary(1); + verify(mInternetDetailsContentController).getMobileNetworkSummary(1); assertThat(primaryLayout.getBackground()).isNotEqualTo( secondaryLayout.getBackground()); }); @@ -639,11 +639,11 @@ public class InternetDialogDelegateTest extends SysuiTestCase { public void updateDialog_wifiOn_hideWifiScanNotify() { // The preconditions WiFi ON and WiFi entries are already in setUp() - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mWifiScanNotify.getVisibility()).isEqualTo(View.GONE); }); @@ -652,13 +652,13 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOffAndWifiScanOff_hideWifiScanNotify() { - when(mInternetDialogController.isWifiEnabled()).thenReturn(false); - when(mInternetDialogController.isWifiScanEnabled()).thenReturn(false); - mInternetDialogDelegate.updateDialog(false); + when(mInternetDetailsContentController.isWifiEnabled()).thenReturn(false); + when(mInternetDetailsContentController.isWifiScanEnabled()).thenReturn(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mWifiScanNotify.getVisibility()).isEqualTo(View.GONE); }); @@ -667,14 +667,14 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOffAndWifiScanOnAndDeviceLocked_hideWifiScanNotify() { - when(mInternetDialogController.isWifiEnabled()).thenReturn(false); - when(mInternetDialogController.isWifiScanEnabled()).thenReturn(true); - when(mInternetDialogController.isDeviceLocked()).thenReturn(true); - mInternetDialogDelegate.updateDialog(false); + when(mInternetDetailsContentController.isWifiEnabled()).thenReturn(false); + when(mInternetDetailsContentController.isWifiScanEnabled()).thenReturn(true); + when(mInternetDetailsContentController.isDeviceLocked()).thenReturn(true); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mWifiScanNotify.getVisibility()).isEqualTo(View.GONE); }); @@ -683,14 +683,14 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiOffAndWifiScanOnAndDeviceUnlocked_showWifiScanNotify() { - when(mInternetDialogController.isWifiEnabled()).thenReturn(false); - when(mInternetDialogController.isWifiScanEnabled()).thenReturn(true); - when(mInternetDialogController.isDeviceLocked()).thenReturn(false); - mInternetDialogDelegate.updateDialog(false); + when(mInternetDetailsContentController.isWifiEnabled()).thenReturn(false); + when(mInternetDetailsContentController.isWifiScanEnabled()).thenReturn(true); + when(mInternetDetailsContentController.isDeviceLocked()).thenReturn(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mWifiScanNotify.getVisibility()).isEqualTo(View.VISIBLE); TextView wifiScanNotifyText = mDialogView.requireViewById( R.id.wifi_scan_notify_text); @@ -701,26 +701,26 @@ public class InternetDialogDelegateTest extends SysuiTestCase { @Test public void updateDialog_wifiIsDisabled_uncheckWifiSwitch() { - when(mInternetDialogController.isWifiEnabled()).thenReturn(false); + when(mInternetDetailsContentController.isWifiEnabled()).thenReturn(false); mWifiToggleSwitch.setChecked(true); - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mWifiToggleSwitch.isChecked()).isFalse(); }); } @Test public void updateDialog_wifiIsEnabled_checkWifiSwitch() throws Exception { - when(mInternetDialogController.isWifiEnabled()).thenReturn(true); + when(mInternetDetailsContentController.isWifiEnabled()).thenReturn(true); mWifiToggleSwitch.setChecked(false); - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { assertThat(mWifiToggleSwitch.isChecked()).isTrue(); }); } @@ -729,26 +729,26 @@ public class InternetDialogDelegateTest extends SysuiTestCase { public void onClickSeeMoreButton_clickSeeAll_verifyLaunchNetworkSetting() { mSeeAll.performClick(); - verify(mInternetDialogController).launchNetworkSetting( + verify(mInternetDetailsContentController).launchNetworkSetting( mDialogView.requireViewById(R.id.see_all_layout)); } @Test public void onWifiScan_isScanTrue_setProgressBarVisibleTrue() { - mInternetDialogDelegate.mIsProgressBarVisible = false; + mInternetDialogDelegateLegacy.mIsProgressBarVisible = false; - mInternetDialogDelegate.onWifiScan(true); + mInternetDialogDelegateLegacy.onWifiScan(true); - assertThat(mInternetDialogDelegate.mIsProgressBarVisible).isTrue(); + assertThat(mInternetDialogDelegateLegacy.mIsProgressBarVisible).isTrue(); } @Test public void onWifiScan_isScanFalse_setProgressBarVisibleFalse() { - mInternetDialogDelegate.mIsProgressBarVisible = true; + mInternetDialogDelegateLegacy.mIsProgressBarVisible = true; - mInternetDialogDelegate.onWifiScan(false); + mInternetDialogDelegateLegacy.onWifiScan(false); - assertThat(mInternetDialogDelegate.mIsProgressBarVisible).isFalse(); + assertThat(mInternetDialogDelegateLegacy.mIsProgressBarVisible).isFalse(); } @Test @@ -757,73 +757,77 @@ public class InternetDialogDelegateTest extends SysuiTestCase { // Then the maximum count is equal to MAX_WIFI_ENTRY_COUNT. setNetworkVisible(false, false, false); - assertThat(mInternetDialogDelegate.getWifiListMaxCount()).isEqualTo(MAX_WIFI_ENTRY_COUNT); + assertThat(mInternetDialogDelegateLegacy.getWifiListMaxCount()).isEqualTo( + MAX_WIFI_ENTRY_COUNT); // If the Connected Wi-Fi is displayed then reduce one of the Wi-Fi list max count. setNetworkVisible(false, false, true); - assertThat(mInternetDialogDelegate.getWifiListMaxCount()) + assertThat(mInternetDialogDelegateLegacy.getWifiListMaxCount()) .isEqualTo(MAX_WIFI_ENTRY_COUNT - 1); // Only one of Ethernet, MobileData is displayed. // Then the maximum count is equal to MAX_WIFI_ENTRY_COUNT. setNetworkVisible(true, false, false); - assertThat(mInternetDialogDelegate.getWifiListMaxCount()).isEqualTo(MAX_WIFI_ENTRY_COUNT); + assertThat(mInternetDialogDelegateLegacy.getWifiListMaxCount()).isEqualTo( + MAX_WIFI_ENTRY_COUNT); setNetworkVisible(false, true, false); - assertThat(mInternetDialogDelegate.getWifiListMaxCount()).isEqualTo(MAX_WIFI_ENTRY_COUNT); + assertThat(mInternetDialogDelegateLegacy.getWifiListMaxCount()).isEqualTo( + MAX_WIFI_ENTRY_COUNT); // If the Connected Wi-Fi is displayed then reduce one of the Wi-Fi list max count. setNetworkVisible(true, false, true); - assertThat(mInternetDialogDelegate.getWifiListMaxCount()) + assertThat(mInternetDialogDelegateLegacy.getWifiListMaxCount()) .isEqualTo(MAX_WIFI_ENTRY_COUNT - 1); setNetworkVisible(false, true, true); - assertThat(mInternetDialogDelegate.getWifiListMaxCount()) + assertThat(mInternetDialogDelegateLegacy.getWifiListMaxCount()) .isEqualTo(MAX_WIFI_ENTRY_COUNT - 1); // Both of Ethernet, MobileData, ConnectedWiFi is displayed. // Then the maximum count is equal to MAX_WIFI_ENTRY_COUNT - 1. setNetworkVisible(true, true, false); - assertThat(mInternetDialogDelegate.getWifiListMaxCount()) + assertThat(mInternetDialogDelegateLegacy.getWifiListMaxCount()) .isEqualTo(MAX_WIFI_ENTRY_COUNT - 1); // If the Connected Wi-Fi is displayed then reduce one of the Wi-Fi list max count. setNetworkVisible(true, true, true); - assertThat(mInternetDialogDelegate.getWifiListMaxCount()) + assertThat(mInternetDialogDelegateLegacy.getWifiListMaxCount()) .isEqualTo(MAX_WIFI_ENTRY_COUNT - 2); } @Test public void updateDialog_shareWifiIntentNull_hideButton() { - when(mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull(any())) + when(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull(any())) .thenReturn(null); - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { - assertThat(mInternetDialogDelegate.mShareWifiButton.getVisibility()).isEqualTo( - View.GONE); + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { + assertThat( + mInternetDialogDelegateLegacy.mShareWifiButton.getVisibility()) + .isEqualTo(View.GONE); }); } @Test public void updateDialog_shareWifiShareable_showButton() { - when(mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull(any())) + when(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull(any())) .thenReturn(new Intent()); - mInternetDialogDelegate.updateDialog(false); + mInternetDialogDelegateLegacy.updateDialog(false); mBgExecutor.runAllReady(); - mInternetDialogDelegate.mDataInternetContent.observe( - mInternetDialogDelegate.mLifecycleOwner, i -> { - assertThat(mInternetDialogDelegate.mShareWifiButton.getVisibility()) + mInternetDialogDelegateLegacy.mDataInternetContent.observe( + mInternetDialogDelegateLegacy.mLifecycleOwner, i -> { + assertThat(mInternetDialogDelegateLegacy.mShareWifiButton.getVisibility()) .isEqualTo(View.VISIBLE); }); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt index 2d35ea5d4e95..61943f2283e0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt @@ -65,7 +65,7 @@ import com.android.systemui.statusbar.notification.AssistantFeedbackController import com.android.systemui.statusbar.notification.NotificationActivityStarter import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor -import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier import com.android.systemui.statusbar.notification.stack.NotificationListContainer import com.android.systemui.statusbar.notificationLockscreenUserManager @@ -128,7 +128,7 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { private val shadeController = kosmos.shadeControllerSceneImpl private val notificationLockscreenUserManager = kosmos.notificationLockscreenUserManager private val statusBarStateController = kosmos.statusBarStateController - private val headsUpManager = kosmos.headsUpManager + private val headsUpManager = kosmos.mockHeadsUpManager private val activityStarter = kosmos.activityStarter private val userManager = kosmos.userManager private val activeNotificationsInteractor = kosmos.activeNotificationsInteractor diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index 411c81d13e0b..1fcf02d417e1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -36,6 +36,8 @@ import static com.android.systemui.statusbar.phone.CentralSurfaces.MSG_DISMISS_K import static com.google.common.truth.Truth.assertThat; +import static kotlinx.coroutines.flow.FlowKt.flowOf; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -54,8 +56,6 @@ import static org.mockito.Mockito.when; import static java.util.Collections.emptySet; -import static kotlinx.coroutines.flow.FlowKt.flowOf; - import android.app.ActivityManager; import android.app.IWallpaperManager; import android.app.NotificationManager; @@ -132,6 +132,7 @@ import com.android.systemui.navigationbar.NavigationBarController; import com.android.systemui.notetask.NoteTaskController; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; +import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.PluginDependencyProvider; import com.android.systemui.plugins.PluginManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -175,6 +176,7 @@ import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.core.StatusBarConnectedDisplays; import com.android.systemui.statusbar.core.StatusBarInitializerImpl; import com.android.systemui.statusbar.data.repository.FakeStatusBarModeRepository; +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController; import com.android.systemui.statusbar.data.repository.StatusBarModePerDisplayRepository; import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.NotificationActivityStarter; @@ -216,6 +218,10 @@ import com.android.systemui.volume.VolumeComponent; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.startingsurface.StartingSurface; +import dagger.Lazy; + +import kotlinx.coroutines.test.TestScope; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -232,9 +238,6 @@ import java.util.Set; import javax.inject.Provider; -import dagger.Lazy; -import kotlinx.coroutines.test.TestScope; - @SmallTest @RunWith(AndroidJUnit4.class) @RunWithLooper(setAsMainLooper = true) @@ -536,6 +539,8 @@ public class CentralSurfacesImplTest extends SysuiTestCase { new StatusBarInitializerImpl( mStatusBarWindowController, mStatusBarModePerDisplayRepository, + mock(StatusBarConfigurationController.class), + mock(DarkIconDispatcher.class), mCollapsedStatusBarFragmentProvider, mock(StatusBarRootFactory.class), mock(HomeStatusBarComponent.Factory.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java index 0b4436755fa5..3a99328fa8ed 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -61,6 +62,9 @@ import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; import com.android.systemui.statusbar.core.StatusBarRootModernization; +import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore; +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController; +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore; import com.android.systemui.statusbar.disableflags.DisableFlagsLogger; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder; @@ -75,6 +79,8 @@ import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.FakeHomeStatu import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.FakeHomeStatusBarViewModel; import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.StatusBarOperatorNameViewModel; import com.android.systemui.statusbar.policy.KeyguardStateController; +import com.android.systemui.statusbar.window.StatusBarWindowController; +import com.android.systemui.statusbar.window.StatusBarWindowControllerStore; import com.android.systemui.statusbar.window.StatusBarWindowStateController; import com.android.systemui.statusbar.window.StatusBarWindowStateListener; import com.android.systemui.util.CarrierConfigTracker; @@ -134,6 +140,12 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { private StatusBarWindowStateController mStatusBarWindowStateController; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock private StatusBarWindowControllerStore mStatusBarWindowControllerStore; + @Mock private StatusBarWindowController mStatusBarWindowController; + @Mock private StatusBarConfigurationControllerStore mStatusBarConfigurationControllerStore; + @Mock private StatusBarConfigurationController mStatusBarConfigurationController; + @Mock private DarkIconDispatcherStore mDarkIconDispatcherStore; + @Mock private DarkIconDispatcher mDarkIconDispatcher; @Rule public final AnimatorTestRule mAnimatorTestRule = new AnimatorTestRule(this); @@ -145,6 +157,12 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { @Before public void setup() { + when(mStatusBarWindowControllerStore.forDisplay(anyInt())) + .thenReturn(mStatusBarWindowController); + when(mStatusBarConfigurationControllerStore.forDisplay(anyInt())) + .thenReturn(mStatusBarConfigurationController); + when(mDarkIconDispatcherStore.forDisplay(anyInt())).thenReturn(mDarkIconDispatcher); + injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES); mDependency.injectMockDependency(DarkIconDispatcher.class); @@ -1276,11 +1294,14 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { mDumpManager, mStatusBarWindowStateController, mKeyguardUpdateMonitor, - mock(DemoModeController.class)); + mock(DemoModeController.class), + mStatusBarWindowControllerStore, + mStatusBarConfigurationControllerStore, + mDarkIconDispatcherStore); } private void setUpDaggerComponent() { - when(mStatusBarFragmentComponentFactory.create(any())) + when(mStatusBarFragmentComponentFactory.create(any(), any(), any(), any())) .thenReturn(mHomeStatusBarComponent); when(mHomeStatusBarComponent.getHeadsUpAppearanceController()) .thenReturn(mHeadsUpAppearanceController); diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index af12d0119c58..7508838810ad 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -198,6 +198,7 @@ import com.android.wm.shell.sysui.ShellCommandHandler; import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.taskview.TaskView; +import com.android.wm.shell.taskview.TaskViewRepository; import com.android.wm.shell.taskview.TaskViewTransitions; import com.android.wm.shell.transition.Transitions; @@ -362,6 +363,7 @@ public class BubblesTest extends SysuiTestCase { private ShadeInteractor mShadeInteractor; private NotificationShadeWindowModel mNotificationShadeWindowModel; private ShellTaskOrganizer mShellTaskOrganizer; + private TaskViewRepository mTaskViewRepository; private TaskViewTransitions mTaskViewTransitions; private TestableBubblePositioner mPositioner; @@ -398,7 +400,8 @@ public class BubblesTest extends SysuiTestCase { if (Transitions.ENABLE_SHELL_TRANSITIONS) { doReturn(true).when(mTransitions).isRegistered(); } - mTaskViewTransitions = new TaskViewTransitions(mTransitions); + mTaskViewRepository = new TaskViewRepository(); + mTaskViewTransitions = new TaskViewTransitions(mTransitions, mTaskViewRepository); mTestableLooper = TestableLooper.get(this); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestableContext.java b/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestableContext.java index b8be6aa50015..64d89c5ac8ba 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestableContext.java +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestableContext.java @@ -81,6 +81,14 @@ public class SysuiTestableContext extends TestableContext { return super.getDisplay(); } + @Override + public int getDisplayId() { + if (mCustomDisplay != null) { + return mCustomDisplay.getDisplayId(); + } + return super.getDisplayId(); + } + public SysuiTestableContext createDefaultDisplayContext() { Display display = getBaseContext().getSystemService(DisplayManager.class).getDisplays()[0]; return (SysuiTestableContext) createDisplayContext(display); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/FeatureFlagsClassicKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/FeatureFlagsClassicKosmos.kt index d9235cc56c00..2f7936a5a43d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/FeatureFlagsClassicKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/FeatureFlagsClassicKosmos.kt @@ -34,7 +34,6 @@ val Kosmos.fakeFeatureFlagsClassic by Kosmos.Fixture { FakeFeatureFlagsClassic().apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) - set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, false) set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false) set(Flags.NSSL_DEBUG_LINES, false) set(Flags.COMMUNAL_SERVICE_ENABLED, false) 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 6df2318c6935..d59b5d56db3f 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 @@ -63,7 +63,6 @@ val Kosmos.defaultKeyguardBlueprint by defaultNotificationStackScrollLayoutSection = mock(), aodNotificationIconsSection = mock(), aodBurnInSection = mock(), - communalTutorialIndicatorSection = mock(), clockSection = keyguardClockSection, smartspaceSection = keyguardSmartspaceSection, keyguardSliceViewSection = mock(), @@ -85,7 +84,6 @@ val Kosmos.splitShadeBlueprint by splitShadeGuidelines = mock(), aodNotificationIconsSection = mock(), aodBurnInSection = mock(), - communalTutorialIndicatorSection = mock(), clockSection = keyguardClockSection, smartspaceSection = keyguardSmartspaceSection, mediaSection = mock(), diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModelKosmos.kt new file mode 100644 index 000000000000..c1c0807c9cf2 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToPrimaryBouncerTransitionViewModelKosmos.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.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 + +val Kosmos.glanceableHubToPrimaryBouncerTransitionViewModel by Fixture { + GlanceableHubToPrimaryBouncerTransitionViewModel( + animationFlow = keyguardTransitionAnimationFlow, + blurConfig = blurConfig, + ) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModelKosmos.kt new file mode 100644 index 000000000000..004f97d95673 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToPrimaryBouncerTransitionViewModelKosmos.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.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 + +val Kosmos.occludedToPrimaryBouncerTransitionViewModel by Fixture { + OccludedToPrimaryBouncerTransitionViewModel( + animationFlow = keyguardTransitionAnimationFlow, + blurConfig = blurConfig, + ) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModelKosmos.kt new file mode 100644 index 000000000000..2256c10eebc9 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToOccludedTransitionViewModelKosmos.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.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 + +val Kosmos.primaryBouncerToOccludedTransitionViewModel by Fixture { + PrimaryBouncerToOccludedTransitionViewModel( + animationFlow = keyguardTransitionAnimationFlow, + blurConfig = blurConfig, + ) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/FakeMediaControllerFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/FakeMediaControllerFactory.kt index b833750a2c4a..b20678e95a86 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/FakeMediaControllerFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/FakeMediaControllerFactory.kt @@ -35,7 +35,7 @@ class FakeMediaControllerFactory(context: Context) : MediaControllerFactory(cont return mediaControllersForToken[token]!! } - override suspend fun create(token: SessionToken, looper: Looper): Media3Controller { + override suspend fun create(token: SessionToken, looper: Looper): Media3Controller? { return media3Controller ?: super.create(token, looper) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializerFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializerFactory.kt index 50a19a9bc68a..fb2e2a3b76a9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializerFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/FakeStatusBarInitializerFactory.kt @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.core +import com.android.systemui.plugins.DarkIconDispatcher +import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController import com.android.systemui.statusbar.data.repository.StatusBarModePerDisplayRepository import com.android.systemui.statusbar.window.StatusBarWindowController @@ -24,5 +26,7 @@ class FakeStatusBarInitializerFactory() : StatusBarInitializer.Factory { override fun create( statusBarWindowController: StatusBarWindowController, statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, + statusBarConfigurationController: StatusBarConfigurationController, + darkIconDispatcher: DarkIconDispatcher, ): StatusBarInitializer = FakeStatusBarInitializer() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt index 6e990277df6b..b8dafb23b206 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/core/StatusBarInitializerKosmos.kt @@ -19,7 +19,9 @@ package com.android.systemui.statusbar.core import com.android.systemui.display.data.repository.displayRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.statusbar.data.repository.darkIconDispatcherStore import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository +import com.android.systemui.statusbar.data.repository.statusBarConfigurationControllerStore import com.android.systemui.statusbar.window.fakeStatusBarWindowControllerStore val Kosmos.fakeStatusBarInitializer by Kosmos.Fixture { FakeStatusBarInitializer() } @@ -39,6 +41,8 @@ val Kosmos.multiDisplayStatusBarInitializerStore by fakeStatusBarInitializerFactory, fakeStatusBarWindowControllerStore, fakeStatusBarModeRepository, + statusBarConfigurationControllerStore, + darkIconDispatcherStore, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractorKosmos.kt index 0025ad42ba53..f7e235a9c749 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractorKosmos.kt @@ -17,13 +17,13 @@ package com.android.systemui.statusbar.featurepods.media.domain.interactor import com.android.systemui.kosmos.Kosmos -import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.kosmos.backgroundScope import com.android.systemui.media.controls.data.repository.mediaFilterRepository val Kosmos.mediaControlChipInteractor: MediaControlChipInteractor by Kosmos.Fixture { MediaControlChipInteractor( - applicationScope = applicationCoroutineScope, + backgroundScope = backgroundScope, mediaFilterRepository = mediaFilterRepository, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModelKosmos.kt new file mode 100644 index 000000000000..7145907a14a8 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModelKosmos.kt @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.featurepods.media.ui.viewmodel + +import android.content.testableContext +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.statusbar.featurepods.media.domain.interactor.mediaControlChipInteractor + +val Kosmos.mediaControlChipViewModel: MediaControlChipViewModel by + Kosmos.Fixture { + MediaControlChipViewModel( + backgroundScope = applicationCoroutineScope, + applicationContext = testableContext, + mediaControlChipInteractor = mediaControlChipInteractor, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModelKosmos.kt index 62cdc87f980f..93502f365202 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/featurepods/popups/ui/viewmodel/StatusBarPopupChipsViewModelKosmos.kt @@ -18,6 +18,12 @@ package com.android.systemui.statusbar.featurepods.popups.ui.viewmodel import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope +import com.android.systemui.statusbar.featurepods.media.ui.viewmodel.mediaControlChipViewModel val Kosmos.statusBarPopupChipsViewModel: StatusBarPopupChipsViewModel by - Kosmos.Fixture { StatusBarPopupChipsViewModel(testScope.backgroundScope) } + Kosmos.Fixture { + StatusBarPopupChipsViewModel( + testScope.backgroundScope, + mediaControlChipViewModel = mediaControlChipViewModel, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/AvalancheControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/AvalancheControllerKosmos.kt new file mode 100644 index 000000000000..2a2f5f974a19 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/AvalancheControllerKosmos.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.headsup + +import com.android.internal.logging.uiEventLoggerFake +import com.android.systemui.dump.dumpManager +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.util.mockito.mock + +var Kosmos.mockAvalancheController by Fixture { mock<AvalancheController>() } + +val Kosmos.avalancheController by Fixture { + AvalancheController(dumpManager, uiEventLoggerFake, headsUpManagerLogger, bgHandler = mock()) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerKosmos.kt index de9485d48383..dfc8a68968cb 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerKosmos.kt @@ -16,8 +16,44 @@ package com.android.systemui.statusbar.notification.headsup +import android.content.applicationContext +import android.view.accessibility.accessibilityManagerWrapper +import com.android.internal.logging.uiEventLoggerFake +import com.android.systemui.concurrency.fakeExecutor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.kosmos.testScope +import com.android.systemui.plugins.statusbar.statusBarStateController +import com.android.systemui.shade.domain.interactor.shadeInteractor +import com.android.systemui.statusbar.notification.collection.provider.visualStabilityProvider +import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager +import com.android.systemui.statusbar.phone.keyguardBypassController +import com.android.systemui.statusbar.policy.configurationController +import com.android.systemui.util.concurrency.mockExecutorHandler +import com.android.systemui.util.kotlin.JavaAdapter import com.android.systemui.util.mockito.mock +import com.android.systemui.util.settings.fakeGlobalSettings +import com.android.systemui.util.time.fakeSystemClock -var Kosmos.headsUpManager by Fixture { mock<HeadsUpManager>() } +var Kosmos.mockHeadsUpManager by Fixture { mock<HeadsUpManager>() } + +var Kosmos.headsUpManager: HeadsUpManager by Fixture { + HeadsUpManagerImpl( + applicationContext, + headsUpManagerLogger, + statusBarStateController, + keyguardBypassController, + mock<GroupMembershipManager>(), + visualStabilityProvider, + configurationController, + mockExecutorHandler(fakeExecutor), + fakeGlobalSettings, + fakeSystemClock, + fakeExecutor, + accessibilityManagerWrapper, + uiEventLoggerFake, + JavaAdapter(testScope.backgroundScope), + shadeInteractor, + avalancheController, + ) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLoggerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLoggerKosmos.kt new file mode 100644 index 000000000000..d595fa6f05d2 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/headsup/HeadsUpManagerLoggerKosmos.kt @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.headsup + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.log.logcatLogBuffer +import org.mockito.kotlin.mock + +val Kosmos.mockHeadsUpManagerLogger by Fixture { mock<HeadsUpManagerLogger>() } + +val Kosmos.headsUpManagerLogger by Fixture { + HeadsUpManagerLogger(logcatLogBuffer("HeadsUpManagerLogger")) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/OnUserInteractionCallbackKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/OnUserInteractionCallbackKosmos.kt index ec54c33f1156..cc3f21b2277a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/OnUserInteractionCallbackKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/OnUserInteractionCallbackKosmos.kt @@ -22,14 +22,14 @@ import com.android.systemui.statusbar.notification.collection.coordinator.visual import com.android.systemui.statusbar.notification.collection.inflation.OnUserInteractionCallbackImpl import com.android.systemui.statusbar.notification.collection.notifCollection import com.android.systemui.statusbar.notification.collection.render.notificationVisibilityProvider -import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager var Kosmos.onUserInteractionCallback: OnUserInteractionCallback by Kosmos.Fixture { OnUserInteractionCallbackImpl( notificationVisibilityProvider, notifCollection, - headsUpManager, + mockHeadsUpManager, statusBarStateController, visualStabilityCoordinator, ) 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 383e31d99314..65f4ec1c437c 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 @@ -21,6 +21,7 @@ import com.android.systemui.dump.dumpManager import com.android.systemui.kosmos.Kosmos 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 @@ -33,6 +34,6 @@ val Kosmos.ambientState by Fixture { /*bypassController=*/ stackScrollAlgorithmBypassController, /*statusBarKeyguardViewManager=*/ statusBarKeyguardViewManager, /*largeScreenShadeInterpolator=*/ largeScreenShadeInterpolator, - /*avalancheController=*/ avalancheController, + /*avalancheController=*/ mockAvalancheController, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmKosmos.kt index a5c4bfd61945..67343c95f6e1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmKosmos.kt @@ -18,7 +18,6 @@ package com.android.systemui.statusbar.notification.stack import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import com.android.systemui.statusbar.notification.headsup.AvalancheController import com.android.systemui.util.mockito.mock var Kosmos.stackScrollAlgorithmSectionProvider by Fixture { @@ -28,5 +27,3 @@ var Kosmos.stackScrollAlgorithmSectionProvider by Fixture { var Kosmos.stackScrollAlgorithmBypassController by Fixture { mock<StackScrollAlgorithm.BypassController>() } - -var Kosmos.avalancheController by Fixture { mock<AvalancheController>() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/WindowRootViewVisibilityInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/WindowRootViewVisibilityInteractorKosmos.kt index e972c2c77902..64f16dac6242 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/WindowRootViewVisibilityInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/WindowRootViewVisibilityInteractorKosmos.kt @@ -25,14 +25,14 @@ import com.android.systemui.scene.data.repository.windowRootViewVisibilityReposi import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor -import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager val Kosmos.windowRootViewVisibilityInteractor by Fixture { WindowRootViewVisibilityInteractor( scope = applicationCoroutineScope, windowRootViewVisibilityRepository = windowRootViewVisibilityRepository, keyguardRepository = keyguardRepository, - headsUpManager = headsUpManager, + headsUpManager = mockHeadsUpManager, powerInteractor = powerInteractor, activeNotificationsInteractor = activeNotificationsInteractor, ) { 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 f86824a1af6d..d0bf584d9a62 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 @@ -26,7 +26,7 @@ import com.android.systemui.keyguard.wakefulnessLifecycle import com.android.systemui.kosmos.Kosmos import com.android.systemui.plugins.statusbar.statusBarStateController import com.android.systemui.shade.domain.interactor.shadeLockscreenInteractor -import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager import com.android.systemui.statusbar.notificationShadeWindowController import com.android.systemui.statusbar.policy.batteryController import com.android.systemui.statusbar.policy.deviceProvisionedController @@ -42,7 +42,7 @@ val Kosmos.dozeServiceHost: DozeServiceHost by wakefulnessLifecycle, statusBarStateController, deviceProvisionedController, - headsUpManager, + mockHeadsUpManager, batteryController, scrimController, { biometricUnlockController }, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ShadeTouchableRegionManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ShadeTouchableRegionManagerKosmos.kt index 5b7f23b0cff2..9adaeff9c552 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ShadeTouchableRegionManagerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/ShadeTouchableRegionManagerKosmos.kt @@ -24,7 +24,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor -import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager import com.android.systemui.statusbar.notificationShadeWindowController import com.android.systemui.statusbar.policy.configurationController import com.android.systemui.util.kotlin.JavaAdapter @@ -36,7 +36,7 @@ var Kosmos.shadeTouchableRegionManager by applicationContext, notificationShadeWindowController, configurationController, - headsUpManager, + mockHeadsUpManager, shadeInteractor, { sceneInteractor }, JavaAdapter(testScope.backgroundScope), 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 6083414240a6..7743a1c7e0cd 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 @@ -36,7 +36,7 @@ import com.android.systemui.shade.shadeController import com.android.systemui.statusbar.commandQueue import com.android.systemui.statusbar.notification.collection.provider.launchFullScreenIntentProvider import com.android.systemui.statusbar.notification.collection.render.notificationVisibilityProvider -import com.android.systemui.statusbar.notification.headsup.headsUpManager +import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager import com.android.systemui.statusbar.notification.notificationTransitionAnimatorControllerProvider import com.android.systemui.statusbar.notification.row.onUserInteractionCallback import com.android.systemui.statusbar.notificationClickNotifier @@ -58,7 +58,7 @@ val Kosmos.statusBarNotificationActivityStarter by fakeExecutorHandler, fakeExecutor, notificationVisibilityProvider, - headsUpManager, + mockHeadsUpManager, activityStarter, commandQueue, notificationClickNotifier, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt index 924b6b43b49a..b38a723f1fa7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt @@ -25,6 +25,7 @@ import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.chips.ui.viewmodel.ongoingActivityChipsViewModel import com.android.systemui.statusbar.events.domain.interactor.systemStatusEventAnimationInteractor +import com.android.systemui.statusbar.featurepods.popups.ui.viewmodel.statusBarPopupChipsViewModel import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor import com.android.systemui.statusbar.phone.domain.interactor.darkIconInteractor @@ -48,6 +49,7 @@ var Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by sceneContainerOcclusionInteractor, shadeInteractor, ongoingActivityChipsViewModel, + statusBarPopupChipsViewModel, systemStatusEventAnimationInteractor, applicationCoroutineScope, ) diff --git a/services/backup/java/com/android/server/backup/BackupManagerConstants.java b/services/backup/java/com/android/server/backup/BackupManagerConstants.java index 4bd987a17447..b753d01562ca 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerConstants.java +++ b/services/backup/java/com/android/server/backup/BackupManagerConstants.java @@ -72,6 +72,9 @@ public class BackupManagerConstants extends KeyValueSettingObserver { public static final String BACKUP_FINISHED_NOTIFICATION_RECEIVERS = "backup_finished_notification_receivers"; + @VisibleForTesting + public static final String WAKELOCK_TIMEOUT_MILLIS = "wakelock_timeout_millis"; + // Hard coded default values. @VisibleForTesting public static final long DEFAULT_KEY_VALUE_BACKUP_INTERVAL_MILLISECONDS = @@ -97,6 +100,9 @@ public class BackupManagerConstants extends KeyValueSettingObserver { @VisibleForTesting public static final String DEFAULT_BACKUP_FINISHED_NOTIFICATION_RECEIVERS = ""; + @VisibleForTesting + public static final long DEFAULT_WAKELOCK_TIMEOUT_MILLIS = 30 * 60 * 1000; // 30 minutes + // Backup manager constants. private long mKeyValueBackupIntervalMilliseconds; private long mKeyValueBackupFuzzMilliseconds; @@ -106,6 +112,7 @@ public class BackupManagerConstants extends KeyValueSettingObserver { private boolean mFullBackupRequireCharging; private int mFullBackupRequiredNetworkType; private String[] mBackupFinishedNotificationReceivers; + private long mWakelockTimeoutMillis; public BackupManagerConstants(Handler handler, ContentResolver resolver) { super(handler, resolver, Settings.Secure.getUriFor(SETTING)); @@ -152,6 +159,8 @@ public class BackupManagerConstants extends KeyValueSettingObserver { } else { mBackupFinishedNotificationReceivers = backupFinishedNotificationReceivers.split(":"); } + mWakelockTimeoutMillis = parser.getLong(WAKELOCK_TIMEOUT_MILLIS, + DEFAULT_WAKELOCK_TIMEOUT_MILLIS); } // The following are access methods for the individual parameters. @@ -235,4 +244,9 @@ public class BackupManagerConstants extends KeyValueSettingObserver { } return mBackupFinishedNotificationReceivers; } + + public synchronized long getWakelockTimeoutMillis() { + Slog.v(TAG, "wakelock timeout: " + mWakelockTimeoutMillis); + return mWakelockTimeoutMillis; + } } diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 549f8fa77b53..ac1f50f85d64 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -181,11 +181,14 @@ public class UserBackupManagerService { public static class BackupWakeLock { private final PowerManager.WakeLock mPowerManagerWakeLock; private boolean mHasQuit = false; - private int mUserId; + private final int mUserId; + private final BackupManagerConstants mBackupManagerConstants; - public BackupWakeLock(PowerManager.WakeLock powerManagerWakeLock, int userId) { + public BackupWakeLock(PowerManager.WakeLock powerManagerWakeLock, int userId, + BackupManagerConstants backupManagerConstants) { mPowerManagerWakeLock = powerManagerWakeLock; mUserId = userId; + mBackupManagerConstants = backupManagerConstants; } /** Acquires the {@link PowerManager.WakeLock} if hasn't been quit. */ @@ -199,7 +202,9 @@ public class UserBackupManagerService { + mPowerManagerWakeLock.getTag())); return; } - mPowerManagerWakeLock.acquire(); + // Set a timeout for the wakelock. Otherwise if we fail internally and never call + // release(), the device might stay awake and drain battery indefinitely. + mPowerManagerWakeLock.acquire(mBackupManagerConstants.getWakelockTimeoutMillis()); Slog.v( TAG, addUserIdToLogMessage( @@ -674,10 +679,8 @@ public class UserBackupManagerService { mBackupPreferences = new UserBackupPreferences(mContext, mBaseStateDir); // Power management - mWakelock = new BackupWakeLock( - mPowerManager.newWakeLock( - PowerManager.PARTIAL_WAKE_LOCK, - "*backup*-" + userId + "-" + userBackupThread.getThreadId()), userId); + mWakelock = new BackupWakeLock(mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, + "*backup*-" + userId + "-" + userBackupThread.getThreadId()), userId, mConstants); // Set up the various sorts of package tracking we do mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule"); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 50b6990c0c1c..c9f06ac87269 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -10837,8 +10837,12 @@ public class ActivityManagerService extends IActivityManager.Stub opti++; } synchronized (this) { + // TODO: b/361161826 - Always pass in the dumpAll and let + // BroadcastController decide how to treat it. + final boolean requestDumpAll = "filter".equals(dumpPackage) + ? dumpAll : true; mBroadcastController.dumpBroadcastsLocked(fd, pw, args, opti, - /* dumpAll= */ true, dumpPackage); + requestDumpAll, dumpPackage); } } else if ("broadcast-stats".equals(cmd)) { if (opti < args.length) { diff --git a/services/core/java/com/android/server/am/BroadcastController.java b/services/core/java/com/android/server/am/BroadcastController.java index aa06b7ecf76c..bfacfbba4e22 100644 --- a/services/core/java/com/android/server/am/BroadcastController.java +++ b/services/core/java/com/android/server/am/BroadcastController.java @@ -47,6 +47,8 @@ import static com.android.server.am.ActivityManagerService.UPDATE_HTTP_PROXY_MSG import static com.android.server.am.ActivityManagerService.UPDATE_TIME_PREFERENCE_MSG; import static com.android.server.am.ActivityManagerService.UPDATE_TIME_ZONE; import static com.android.server.am.ActivityManagerService.checkComponentPermission; +import static com.android.server.am.BroadcastRecord.debugLog; +import static com.android.server.am.BroadcastRecord.intentToString; import android.annotation.NonNull; import android.annotation.Nullable; @@ -1017,6 +1019,13 @@ class BroadcastController { android.Manifest.permission.ACCESS_BROADCAST_RESPONSE_STATS, callingPid, callingUid, "recordResponseEventWhileInBackground"); } + + if (brOptions.isDebugLogEnabled()) { + if (!isShellOrRoot(callingUid) + && (callerApp == null || !callerApp.hasActiveInstrumentation())) { + brOptions.setDebugLogEnabled(false); + } + } } // Verify that protected broadcasts are only being sent by system code, @@ -1622,6 +1631,10 @@ class BroadcastController { } } while (ir < NR) { + // Instant Apps cannot use FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS + if (callerInstantApp) { + intent.setFlags(intent.getFlags() & ~Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS); + } if (receivers == null) { receivers = new ArrayList(); } @@ -1647,7 +1660,9 @@ class BroadcastController { callerAppProcessState, mService.mPlatformCompat); broadcastSentEventRecord.setBroadcastRecord(r); - if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Enqueueing ordered broadcast " + r); + if (DEBUG_BROADCAST || r.debugLog()) { + Slog.v(TAG_BROADCAST, "Enqueueing broadcast " + r); + } queue.enqueueBroadcastLocked(r); } else { // There was nobody interested in the broadcast, but we still want to record @@ -1657,11 +1672,19 @@ class BroadcastController { // This was an implicit broadcast... let's record it for posterity. addBroadcastStatLocked(intent.getAction(), callerPackage, 0, 0, 0); } + if (DEBUG_BROADCAST || debugLog(brOptions)) { + Slog.v(TAG_BROADCAST, "Skipping broadcast " + intentToString(intent) + + " due to no receivers"); + } } return ActivityManager.BROADCAST_SUCCESS; } + private boolean isShellOrRoot(int uid) { + return uid == SHELL_UID || uid == ROOT_UID; + } + @GuardedBy("mService") private void scheduleCanceledResultTo(ProcessRecord resultToApp, IIntentReceiver resultTo, Intent intent, int userId, BroadcastOptions options, int callingUid, @@ -2178,6 +2201,8 @@ class BroadcastController { boolean printedAnything = false; boolean onlyReceivers = false; int filteredUid = Process.INVALID_UID; + boolean onlyFilter = false; + String dumpIntentAction = null; if ("history".equals(dumpPackage)) { if (opti < args.length && "-s".equals(args[opti])) { @@ -2185,8 +2210,7 @@ class BroadcastController { } onlyHistory = true; dumpPackage = null; - } - if ("receivers".equals(dumpPackage)) { + } else if ("receivers".equals(dumpPackage)) { onlyReceivers = true; dumpPackage = null; if (opti + 2 <= args.length) { @@ -2205,7 +2229,23 @@ class BroadcastController { } } } + } else if ("filter".equals(dumpPackage)) { + onlyFilter = true; + dumpPackage = null; + if (opti + 2 <= args.length) { + if ("--action".equals(args[opti++])) { + dumpIntentAction = args[opti++]; + if (dumpIntentAction == null) { + pw.printf("Missing argument for --action option\n"); + return; + } + } else { + pw.printf("Unknown argument: %s\n", args[opti]); + return; + } + } } + if (DEBUG_BROADCAST) { Slogf.d(TAG_BROADCAST, "dumpBroadcastsLocked(): dumpPackage=%s, onlyHistory=%b, " + "onlyReceivers=%b, filteredUid=%d", dumpPackage, onlyHistory, @@ -2213,7 +2253,7 @@ class BroadcastController { } pw.println("ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)"); - if (!onlyHistory && dumpAll) { + if (!onlyHistory && !onlyFilter && dumpAll) { if (mRegisteredReceivers.size() > 0) { boolean printed = false; Iterator it = mRegisteredReceivers.values().iterator(); @@ -2257,14 +2297,14 @@ class BroadcastController { if (!onlyReceivers) { needSep = mBroadcastQueue.dumpLocked(fd, pw, args, opti, - dumpConstants, dumpHistory, dumpAll, dumpPackage, needSep); + dumpConstants, dumpHistory, dumpAll, dumpPackage, dumpIntentAction, needSep); printedAnything |= needSep; } needSep = true; synchronized (mStickyBroadcasts) { - if (!onlyHistory && !onlyReceivers && mStickyBroadcasts != null + if (!onlyHistory && !onlyReceivers && !onlyFilter && mStickyBroadcasts != null && dumpPackage == null) { for (int user = 0; user < mStickyBroadcasts.size(); user++) { if (needSep) { @@ -2312,13 +2352,12 @@ class BroadcastController { } } - if (!onlyHistory && !onlyReceivers && dumpAll) { + if (!onlyHistory && !onlyReceivers && !onlyFilter && dumpAll) { pw.println(); - pw.println(" Queue " + mBroadcastQueue.toString() + ": " + pw.println(" Queue " + mBroadcastQueue + ": " + mBroadcastQueue.describeStateLocked()); pw.println(" mHandler:"); mService.mHandler.dump(new PrintWriterPrinter(pw), " "); - needSep = true; printedAnything = true; } diff --git a/services/core/java/com/android/server/am/BroadcastHistory.java b/services/core/java/com/android/server/am/BroadcastHistory.java index d6e3d4336e8e..6ddf60b369e6 100644 --- a/services/core/java/com/android/server/am/BroadcastHistory.java +++ b/services/core/java/com/android/server/am/BroadcastHistory.java @@ -29,6 +29,7 @@ import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.Objects; /** * Collection of recent historical broadcasts that are available to be dumped @@ -163,10 +164,11 @@ public class BroadcastHistory { @NeverCompile public boolean dumpLocked(@NonNull PrintWriter pw, @Nullable String dumpPackage, - @NonNull String queueName, @NonNull SimpleDateFormat sdf, - boolean dumpAll, boolean needSep) { - dumpBroadcastList(pw, sdf, mFrozenBroadcasts, "Frozen"); - dumpBroadcastList(pw, sdf, mPendingBroadcasts, "Pending"); + @Nullable String dumpIntentAction, @NonNull String queueName, + @NonNull SimpleDateFormat sdf, boolean dumpAll) { + boolean needSep = true; + dumpBroadcastList(pw, sdf, mFrozenBroadcasts, dumpIntentAction, dumpAll, "Frozen"); + dumpBroadcastList(pw, sdf, mPendingBroadcasts, dumpIntentAction, dumpAll, "Pending"); int i; boolean printed = false; @@ -187,6 +189,10 @@ public class BroadcastHistory { if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) { continue; } + if (dumpIntentAction != null && !Objects.equals(dumpIntentAction, + r.intent.getAction())) { + continue; + } if (!printed) { if (needSep) { pw.println(); @@ -195,9 +201,16 @@ public class BroadcastHistory { pw.println(" Historical broadcasts [" + queueName + "]:"); printed = true; } - if (dumpAll) { + if (dumpIntentAction != null) { + pw.print(" Historical Broadcast " + queueName + " #"); + pw.print(i); pw.println(":"); + r.dump(pw, " ", sdf); + if (!dumpAll) { + break; + } + } else if (dumpAll) { pw.print(" Historical Broadcast " + queueName + " #"); - pw.print(i); pw.println(":"); + pw.print(i); pw.println(":"); r.dump(pw, " ", sdf); } else { pw.print(" #"); pw.print(i); pw.print(": "); pw.println(r); @@ -213,7 +226,7 @@ public class BroadcastHistory { } } while (ringIndex != lastIndex); - if (dumpPackage == null) { + if (dumpPackage == null && dumpIntentAction == null) { lastIndex = ringIndex = mSummaryHistoryNext; if (dumpAll) { printed = false; @@ -276,15 +289,28 @@ public class BroadcastHistory { } private void dumpBroadcastList(@NonNull PrintWriter pw, @NonNull SimpleDateFormat sdf, - @NonNull ArrayList<BroadcastRecord> broadcasts, @NonNull String flavor) { + @NonNull ArrayList<BroadcastRecord> broadcasts, @Nullable String dumpIntentAction, + boolean dumpAll, @NonNull String flavor) { pw.print(" "); pw.print(flavor); pw.println(" broadcasts:"); if (broadcasts.isEmpty()) { pw.println(" <empty>"); } else { + boolean printedAnything = false; for (int idx = broadcasts.size() - 1; idx >= 0; --idx) { final BroadcastRecord r = broadcasts.get(idx); + if (dumpIntentAction != null && !Objects.equals(dumpIntentAction, + r.intent.getAction())) { + continue; + } pw.print(flavor); pw.print(" broadcast #"); pw.print(idx); pw.println(":"); r.dump(pw, " ", sdf); + printedAnything = true; + if (dumpIntentAction != null && !dumpAll) { + break; + } + } + if (!printedAnything) { + pw.println(" <no-matches>"); } } } diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 6386af673e8b..a7d74a9fe54a 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -264,7 +264,8 @@ public abstract class BroadcastQueue { @GuardedBy("mService") public abstract boolean dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args, int opti, boolean dumpConstants, boolean dumpHistory, - boolean dumpAll, @Nullable String dumpPackage, boolean needSep); + boolean dumpAll, @Nullable String dumpPackage, @Nullable String dumpIntentAction, + boolean needSep); /** * Execute {@link #dumpLocked} and store the output into @@ -276,7 +277,7 @@ public abstract class BroadcastQueue { PrintWriter pw = new PrintWriter(out)) { pw.print("Message: "); pw.println(msg); - dumpLocked(fd, pw, null, 0, false, false, false, null, false); + dumpLocked(fd, pw, null, 0, false, false, false, null, null, false); pw.flush(); } }, DropBoxManager.IS_TEXT); diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index 9e4666cca140..b270513e5563 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -798,7 +798,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue { mService.mOomAdjuster.mCachedAppOptimizer.freezeAppAsyncImmediateLSP(r.callerApp); return; } - if (DEBUG_BROADCAST) logv("Enqueuing " + r + " for " + r.receivers.size() + " receivers"); + if (DEBUG_BROADCAST || r.debugLog()) { + logv("Enqueuing " + r + " for " + r.receivers.size() + " receivers"); + } final int cookie = traceBegin("enqueueBroadcast"); r.applySingletonPolicy(mService); @@ -1019,7 +1021,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue { & Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0; long startTimeNs = SystemClock.uptimeNanos(); - if (DEBUG_BROADCAST) logv("Scheduling " + r + " to cold " + queue); + if (DEBUG_BROADCAST || r.debugLog()) { + logv("Scheduling " + r + " to cold " + queue); + } queue.app = mService.startProcessLocked(queue.processName, info, true, intentFlags, hostingRecord, zygotePolicyFlags, allowWhileBooting, false); if (queue.app == null) { @@ -1176,7 +1180,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } - if (DEBUG_BROADCAST) logv("Scheduling " + r + " to warm " + app); + if (DEBUG_BROADCAST || r.debugLog()) { + logv("Scheduling " + r + " to warm " + app); + } setDeliveryState(queue, app, r, index, receiver, BroadcastRecord.DELIVERY_SCHEDULED, "scheduleReceiverWarmLocked"); @@ -1562,12 +1568,17 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // bookkeeping to update for ordered broadcasts if (!isDeliveryStateTerminal(oldDeliveryState) && isDeliveryStateTerminal(newDeliveryState)) { - if (DEBUG_BROADCAST - && newDeliveryState != BroadcastRecord.DELIVERY_DELIVERED) { - logw("Delivery state of " + r + " to " + receiver + if ((DEBUG_BROADCAST && newDeliveryState != BroadcastRecord.DELIVERY_DELIVERED) + || r.debugLog()) { + final String msg = "Delivery state of " + r + " to " + receiver + " via " + app + " changed from " + deliveryStateToString(oldDeliveryState) + " to " - + deliveryStateToString(newDeliveryState) + " because " + reason); + + deliveryStateToString(newDeliveryState) + " because " + reason; + if (newDeliveryState == BroadcastRecord.DELIVERY_DELIVERED) { + logv(msg); + } else { + logw(msg); + } } notifyFinishReceiver(queue, app, r, index, receiver); @@ -2417,12 +2428,33 @@ class BroadcastQueueModernImpl extends BroadcastQueue { @GuardedBy("mService") public boolean dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args, int opti, boolean dumpConstants, boolean dumpHistory, - boolean dumpAll, @Nullable String dumpPackage, boolean needSep) { + boolean dumpAll, @Nullable String dumpPackage, @Nullable String dumpIntentAction, + boolean needSep) { final long now = SystemClock.uptimeMillis(); final IndentingPrintWriter ipw = new IndentingPrintWriter(pw); ipw.increaseIndent(); ipw.println(); + if (dumpIntentAction == null) { + dumpProcessQueues(ipw, now); + dumpBroadcastsWithIgnoredPolicies(ipw); + dumpForegroundUids(ipw); + + if (dumpConstants) { + mFgConstants.dump(ipw); + mBgConstants.dump(ipw); + } + } + + if (dumpHistory) { + final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + needSep = mHistory.dumpLocked(ipw, dumpPackage, dumpIntentAction, mQueueName, + sdf, dumpAll); + } + return needSep; + } + + private void dumpProcessQueues(@NonNull IndentingPrintWriter ipw, @UptimeMillisLong long now) { ipw.println("📋 Per-process queues:"); ipw.increaseIndent(); for (int i = 0; i < mProcessQueues.size(); i++) { @@ -2470,28 +2502,21 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } ipw.decreaseIndent(); ipw.println(); + } + private void dumpBroadcastsWithIgnoredPolicies(@NonNull IndentingPrintWriter ipw) { ipw.println("Broadcasts with ignored delivery group policies:"); ipw.increaseIndent(); mService.dumpDeliveryGroupPolicyIgnoredActions(ipw); ipw.decreaseIndent(); ipw.println(); + } + private void dumpForegroundUids(@NonNull IndentingPrintWriter ipw) { ipw.println("Foreground UIDs:"); ipw.increaseIndent(); ipw.println(mUidForeground); ipw.decreaseIndent(); ipw.println(); - - if (dumpConstants) { - mFgConstants.dump(ipw); - mBgConstants.dump(ipw); - } - - if (dumpHistory) { - final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - needSep = mHistory.dumpLocked(ipw, dumpPackage, mQueueName, sdf, dumpAll, needSep); - } - return needSep; } } diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java index 8d0805d3fa13..c1b0a76b24af 100644 --- a/services/core/java/com/android/server/am/BroadcastRecord.java +++ b/services/core/java/com/android/server/am/BroadcastRecord.java @@ -1285,31 +1285,43 @@ final class BroadcastRecord extends Binder { } @Override + @NonNull public String toString() { if (mCachedToString == null) { - String label = intent.getAction(); - if (label == null) { - label = intent.toString(); - } mCachedToString = "BroadcastRecord{" + toShortString() + "}"; } return mCachedToString; } + @NonNull public String toShortString() { if (mCachedToShortString == null) { - String label = intent.getAction(); - if (label == null) { - label = intent.toString(); - } + final String label = intentToString(intent); mCachedToShortString = Integer.toHexString(System.identityHashCode(this)) + " " + label + "/u" + userId; } return mCachedToShortString; } + @NonNull + public static String intentToString(@NonNull Intent intent) { + String label = intent.getAction(); + if (label == null) { + label = intent.toString(); + } + return label; + } + + public boolean debugLog() { + return debugLog(options); + } + + public static boolean debugLog(@Nullable BroadcastOptions options) { + return options != null && options.isDebugLogEnabled(); + } + @NeverCompile - public void dumpDebug(ProtoOutputStream proto, long fieldId) { + public void dumpDebug(@NonNull ProtoOutputStream proto, long fieldId) { long token = proto.start(fieldId); proto.write(BroadcastRecordProto.USER_ID, userId); proto.write(BroadcastRecordProto.INTENT_ACTION, intent.getAction()); diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 49149e1fa415..1503d889c298 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -1005,6 +1005,11 @@ class ProcessRecord implements WindowProcessListener { } @GuardedBy(anyOf = {"mService", "mProcLock"}) + boolean hasActiveInstrumentation() { + return mInstr != null; + } + + @GuardedBy(anyOf = {"mService", "mProcLock"}) boolean isKilledByAm() { return mKilledByAm; } diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java index c82933c5069e..c99e8c8ff799 100644 --- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java @@ -382,6 +382,12 @@ public class SettingsToPropertiesMapper { newSingleThreadScheduledExecutor(), (DeviceConfig.Properties properties) -> { + // send prop stage request to new storage + if (enableAconfigStorageDaemon()) { + stageFlagsInNewStorage(properties); + return; + } + for (String flagName : properties.getKeyset()) { String flagValue = properties.getString(flagName, null); if (flagName == null || flagValue == null) { @@ -409,11 +415,6 @@ public class SettingsToPropertiesMapper { setProperty(propertyName, flagValue); } - // send prop stage request to new storage - if (enableAconfigStorageDaemon()) { - stageFlagsInNewStorage(properties); - } - }); // add prop sync callback for flag local overrides @@ -423,6 +424,7 @@ public class SettingsToPropertiesMapper { (DeviceConfig.Properties properties) -> { if (enableAconfigStorageDaemon()) { setLocalOverridesInNewStorage(properties); + return; } if (Flags.supportLocalOverridesSysprops()) { diff --git a/services/core/java/com/android/server/display/DisplayTopologyCoordinator.java b/services/core/java/com/android/server/display/DisplayTopologyCoordinator.java index 461a9f3f2a0d..88650394020b 100644 --- a/services/core/java/com/android/server/display/DisplayTopologyCoordinator.java +++ b/services/core/java/com/android/server/display/DisplayTopologyCoordinator.java @@ -16,8 +16,9 @@ package com.android.server.display; +import static android.hardware.display.DisplayTopology.pxToDp; + import android.hardware.display.DisplayTopology; -import android.util.DisplayMetrics; import android.view.Display; import android.view.DisplayInfo; @@ -140,8 +141,7 @@ class DisplayTopologyCoordinator { * @return The width of the display in dp */ private float getWidth(DisplayInfo info) { - return info.logicalWidth * (float) DisplayMetrics.DENSITY_DEFAULT - / info.logicalDensityDpi; + return pxToDp(info.logicalWidth, info.logicalDensityDpi); } /** @@ -149,8 +149,7 @@ class DisplayTopologyCoordinator { * @return The height of the display in dp */ private float getHeight(DisplayInfo info) { - return info.logicalHeight * (float) DisplayMetrics.DENSITY_DEFAULT - / info.logicalDensityDpi; + return pxToDp(info.logicalHeight, info.logicalDensityDpi); } private boolean isDisplayAllowedInTopology(DisplayInfo info) { diff --git a/services/core/java/com/android/server/input/InputSettingsObserver.java b/services/core/java/com/android/server/input/InputSettingsObserver.java index 56cb6f49f6c4..febf24edc294 100644 --- a/services/core/java/com/android/server/input/InputSettingsObserver.java +++ b/services/core/java/com/android/server/input/InputSettingsObserver.java @@ -71,6 +71,9 @@ class InputSettingsObserver extends ContentObserver { (reason) -> updateMouseSwapPrimaryButton()), Map.entry(Settings.System.getUriFor(Settings.System.MOUSE_SCROLLING_ACCELERATION), (reason) -> updateMouseScrollingAcceleration()), + Map.entry(Settings.System.getUriFor( + Settings.System.MOUSE_POINTER_ACCELERATION_ENABLED), + (reason) -> updateMouseAccelerationEnabled()), Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_POINTER_SPEED), (reason) -> updateTouchpadPointerSpeed()), Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_NATURAL_SCROLLING), @@ -191,6 +194,11 @@ class InputSettingsObserver extends ContentObserver { InputSettings.isMouseScrollingAccelerationEnabled(mContext)); } + private void updateMouseAccelerationEnabled() { + mNative.setMouseAccelerationEnabled( + InputSettings.isMousePointerAccelerationEnabled(mContext)); + } + private void updateTouchpadPointerSpeed() { mNative.setTouchpadPointerSpeed( constrainPointerSpeedValue(InputSettings.getTouchpadPointerSpeed(mContext))); diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index ab5a680867e9..7dbde64a6412 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -138,6 +138,8 @@ interface NativeInputManagerService { void setMouseSwapPrimaryButtonEnabled(boolean enabled); + void setMouseAccelerationEnabled(boolean enabled); + void setTouchpadPointerSpeed(int speed); void setTouchpadNaturalScrollingEnabled(boolean enabled); @@ -429,6 +431,9 @@ interface NativeInputManagerService { public native void setMouseSwapPrimaryButtonEnabled(boolean enabled); @Override + public native void setMouseAccelerationEnabled(boolean enabled); + + @Override public native void setTouchpadPointerSpeed(int speed); @Override diff --git a/services/core/java/com/android/server/inputmethod/IInputMethodManagerImpl.java b/services/core/java/com/android/server/inputmethod/IInputMethodManagerImpl.java index e1f26d6e0cbc..a8b61af61cf2 100644 --- a/services/core/java/com/android/server/inputmethod/IInputMethodManagerImpl.java +++ b/services/core/java/com/android/server/inputmethod/IInputMethodManagerImpl.java @@ -159,6 +159,9 @@ final class IInputMethodManagerImpl extends IInputMethodManager.Stub { Manifest.permission.WRITE_SECURE_SETTINGS}) void onImeSwitchButtonClickFromSystem(int displayId); + @PermissionVerified(Manifest.permission.TEST_INPUT_METHOD) + boolean shouldShowImeSwitcherButtonForTest(); + InputMethodSubtype getCurrentInputMethodSubtype(@UserIdInt int userId); void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes, @@ -380,6 +383,14 @@ final class IInputMethodManagerImpl extends IInputMethodManager.Stub { mCallback.onImeSwitchButtonClickFromSystem(displayId); } + @EnforcePermission(Manifest.permission.TEST_INPUT_METHOD) + @Override + public boolean shouldShowImeSwitcherButtonForTest() { + super.shouldShowImeSwitcherButtonForTest_enforcePermission(); + + return mCallback.shouldShowImeSwitcherButtonForTest(); + } + @Override public InputMethodSubtype getCurrentInputMethodSubtype(@UserIdInt int userId) { return mCallback.getCurrentInputMethodSubtype(userId); diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index c653dec1a299..1f414ac07ba3 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -4129,6 +4129,20 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. } } + /** + * A test API for CTS to check whether the IME Switcher button should be shown when the IME + * is shown. + */ + @IInputMethodManagerImpl.PermissionVerified(Manifest.permission.TEST_INPUT_METHOD) + public boolean shouldShowImeSwitcherButtonForTest() { + final int callingUserId = UserHandle.getCallingUserId(); + synchronized (ImfLock.class) { + final int userId = resolveImeUserIdLocked(callingUserId); + return shouldShowImeSwitcherLocked( + InputMethodService.IME_ACTIVE | InputMethodService.IME_VISIBLE, userId); + } + } + @NonNull private static IllegalArgumentException getExceptionForUnknownImeId( @Nullable String imeId) { diff --git a/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java b/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java index 49d4332d9e2a..b863c96facee 100644 --- a/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java +++ b/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java @@ -302,6 +302,12 @@ final class ZeroJankProxy implements IInputMethodManagerImpl.Callback { mInner.onImeSwitchButtonClickFromSystem(displayId); } + @IInputMethodManagerImpl.PermissionVerified(Manifest.permission.TEST_INPUT_METHOD) + @Override + public boolean shouldShowImeSwitcherButtonForTest() { + return mInner.shouldShowImeSwitcherButtonForTest(); + } + @Override public InputMethodSubtype getCurrentInputMethodSubtype(int userId) { return mInner.getCurrentInputMethodSubtype(userId); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 7375a68c547b..f50e8aa7eb7b 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3082,16 +3082,42 @@ public class NotificationManagerService extends SystemService { private void sendRegisteredOnlyBroadcast(Intent baseIntent) { int[] userIds = mUmInternal.getProfileIds(mAmi.getCurrentUserId(), true); - Intent intent = new Intent(baseIntent).addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - for (int userId : userIds) { - getContext().sendBroadcastAsUser(intent, UserHandle.of(userId), null); - } - // explicitly send the broadcast to all DND packages, even if they aren't currently running - for (int userId : userIds) { - for (String pkg : mConditionProviders.getAllowedPackages(userId)) { - Intent pkgIntent = new Intent(baseIntent).setPackage(pkg).setFlags( - Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - getContext().sendBroadcastAsUser(pkgIntent, UserHandle.of(userId)); + if (Flags.nmBinderPerfReduceZenBroadcasts()) { + for (int userId : userIds) { + Context userContext = getContext().createContextAsUser(UserHandle.of(userId), 0); + String[] dndPackages = mConditionProviders.getAllowedPackages(userId) + .toArray(new String[0]); + + // We send the broadcast to all DND packages in the second step, so leave them out + // of this first broadcast for *running* receivers. That ensures each package only + // receives it once. + Intent registeredOnlyIntent = new Intent(baseIntent) + .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + userContext.sendBroadcastMultiplePermissions(registeredOnlyIntent, + /* receiverPermissions= */ new String[0], + /* excludedPermissions= */ new String[0], + /* excludedPackages= */ dndPackages); + + for (String pkg : dndPackages) { + Intent pkgIntent = new Intent(baseIntent).setPackage(pkg) + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + userContext.sendBroadcast(pkgIntent); + } + } + } else { + Intent intent = new Intent(baseIntent).addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + for (int userId : userIds) { + getContext().sendBroadcastAsUser(intent, UserHandle.of(userId), null); + } + + // explicitly send the broadcast to all DND packages, even if they aren't currently + // running + for (int userId : userIds) { + for (String pkg : mConditionProviders.getAllowedPackages(userId)) { + Intent pkgIntent = new Intent(baseIntent).setPackage(pkg).setFlags( + Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + getContext().sendBroadcastAsUser(pkgIntent, UserHandle.of(userId)); + } } } } @@ -4276,16 +4302,16 @@ public class NotificationManagerService extends SystemService { @Override @FlaggedApi(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) - public @NonNull String[] getTypeAdjustmentDeniedPackages() { + public @NonNull int[] getAllowedAdjustmentKeyTypesForPackage(String pkg) { checkCallerIsSystemOrSystemUiOrShell(); - return mAssistants.getTypeAdjustmentDeniedPackages(); + return mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg); } - @Override @FlaggedApi(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) - public void setTypeAdjustmentForPackageState(String pkg, boolean enabled) { + public void setAssistantAdjustmentKeyTypeStateForPackage(String pkg, int type, + boolean enabled) { checkCallerIsSystemOrSystemUiOrShell(); - mAssistants.setTypeAdjustmentForPackageState(pkg, enabled); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(pkg, type, enabled); handleSavePolicyFile(); } @@ -7083,7 +7109,7 @@ public class NotificationManagerService extends SystemService { toRemove.add(potentialKey); } else if (notificationClassificationUi() && !mAssistants.isTypeAdjustmentAllowedForPackage( - r.getSbn().getPackageName())) { + r.getSbn().getPackageName(), adjustments.getInt(KEY_TYPE))) { toRemove.add(potentialKey); } } @@ -11740,7 +11766,11 @@ public class NotificationManagerService extends SystemService { private static final String ATT_DENIED = "denied_adjustments"; private static final String ATT_ENABLED_TYPES = "enabled_key_types"; private static final String ATT_NAS_UNSUPPORTED = "unsupported_adjustments"; - private static final String ATT_TYPES_DENIED_APPS = "types_denied_apps"; + // Encapsulates a list of packages and the bundle types enabled for each package. + private static final String TAG_TYPES_ENABLED_FOR_APPS = "types_enabled_for_apps"; + // Encapsulates the bundle types enabled for a package. + private static final String ATT_APP_ENABLED_TYPES = "app_enabled_types"; + private static final String ATT_PACKAGE = "package"; private final Object mLock = new Object(); @@ -11756,8 +11786,14 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mLock") private Map<Integer, HashSet<String>> mNasUnsupported = new ArrayMap<>(); + // Types of classifications (aka bundles) enabled/allowed for this package. + // If the set is NULL (or package is not in the list), default classification allow list + // (the global one) should be used. + // If the set is empty, that indicates the package explicitly has all classifications + // disallowed. @GuardedBy("mLock") - private Set<String> mClassificationTypeDeniedPackages = new ArraySet<>(); + private Map<String, Set<Integer>> mClassificationTypePackagesEnabledTypes = + new ArrayMap<>(); protected ComponentName mDefaultFromConfig = null; @@ -11958,41 +11994,88 @@ public class NotificationManagerService extends SystemService { } } + /** + * Returns whether the type adjustment is allowed for this particular package. + * If no package-specific restrictions have been set, defaults to the same value as + * isAdjustmentKeyTypeAllowed(type). + */ @FlaggedApi(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) - protected @NonNull boolean isTypeAdjustmentAllowedForPackage(String pkg) { + protected boolean isTypeAdjustmentAllowedForPackage(String pkg, + @Adjustment.Types int type) { synchronized (mLock) { if (notificationClassificationUi()) { - return !mClassificationTypeDeniedPackages.contains(pkg); + if (mClassificationTypePackagesEnabledTypes.containsKey(pkg)) { + Set<Integer> enabled = mClassificationTypePackagesEnabledTypes.get(pkg); + if (enabled != null) { + return enabled.contains(type); + } + } + // If mClassificationTypePackagesEnabledTypes does not contain the pkg, or + // the stored set is null, return the default. + return isAdjustmentKeyTypeAllowed(type); } } - return true; + return false; } @FlaggedApi(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) - protected @NonNull String[] getTypeAdjustmentDeniedPackages() { + protected @NonNull int[] getAllowedAdjustmentKeyTypesForPackage(String pkg) { synchronized (mLock) { if (notificationClassificationUi()) { - return mClassificationTypeDeniedPackages.toArray(new String[0]); + if (mClassificationTypePackagesEnabledTypes.containsKey(pkg)) { + Set<Integer> enabled = mClassificationTypePackagesEnabledTypes.get(pkg); + if (enabled != null) { + // Convert Set to int[] for return. + int[] returnEnabled = new int[enabled.size()]; + int i = 0; + for (int val: enabled) { + returnEnabled[i] = val; + i++; + } + return returnEnabled; + } + } + // If package is not in the map, or the value is null, return the default. + return getAllowedAdjustmentKeyTypes(); } } - return new String[]{}; + return new int[]{}; } /** * Set whether a particular package can have its notification channels adjusted to have a * different type by NotificationAssistants. + * Note: once this method is called to enable or disable a specific type for a package, + * the global default is set as the starting point, and the type is enabled/disabled from + * there. Future changes to the global default will not apply automatically to this package. */ @FlaggedApi(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) - public void setTypeAdjustmentForPackageState(String pkg, boolean enabled) { + public void setAssistantAdjustmentKeyTypeStateForPackage(String pkg, + @Adjustment.Types int type, + boolean enabled) { if (!notificationClassificationUi()) { return; } synchronized (mLock) { + Set<Integer> enabledTypes = null; + if (mClassificationTypePackagesEnabledTypes.containsKey(pkg)) { + enabledTypes = mClassificationTypePackagesEnabledTypes.get(pkg); + } + if (enabledTypes == null) { + // Use global default to start. + enabledTypes = new ArraySet<Integer>(); + // Convert from int[] to Set<Integer> + for (int value : getAllowedAdjustmentKeyTypes()) { + enabledTypes.add(value); + } + } + if (enabled) { - mClassificationTypeDeniedPackages.remove(pkg); + enabledTypes.add(type); } else { - mClassificationTypeDeniedPackages.add(pkg); + enabledTypes.remove(type); } + mClassificationTypePackagesEnabledTypes.put(pkg, enabledTypes); } } @@ -12459,16 +12542,25 @@ public class NotificationManagerService extends SystemService { TextUtils.join(",", mAllowedAdjustmentKeyTypes)); out.endTag(null, ATT_ENABLED_TYPES); if (notificationClassificationUi()) { - out.startTag(null, ATT_TYPES_DENIED_APPS); - out.attribute(null, ATT_TYPES, - TextUtils.join(",", mClassificationTypeDeniedPackages)); - out.endTag(null, ATT_TYPES_DENIED_APPS); + out.startTag(null, TAG_TYPES_ENABLED_FOR_APPS); + for (String pkg: mClassificationTypePackagesEnabledTypes.keySet()) { + Set<Integer> allowedTypes = + mClassificationTypePackagesEnabledTypes.get(pkg); + if (allowedTypes != null) { + out.startTag(null, ATT_APP_ENABLED_TYPES); + out.attribute(null, ATT_PACKAGE, pkg); + out.attribute(null, ATT_TYPES, TextUtils.join(",", allowedTypes)); + out.endTag(null, ATT_APP_ENABLED_TYPES); + } + } + out.endTag(null, TAG_TYPES_ENABLED_FOR_APPS); } } } @Override - protected void readExtraTag(String tag, TypedXmlPullParser parser) throws IOException { + protected void readExtraTag(String tag, TypedXmlPullParser parser) throws IOException, + XmlPullParserException { if (!notificationClassification()) { return; } @@ -12495,12 +12587,25 @@ public class NotificationManagerService extends SystemService { } } } - } else if (notificationClassificationUi() && ATT_TYPES_DENIED_APPS.equals(tag)) { - final String apps = XmlUtils.readStringAttribute(parser, ATT_TYPES); + } else if (TAG_TYPES_ENABLED_FOR_APPS.equals(tag)) { + final int appsOuterDepth = parser.getDepth(); synchronized (mLock) { - mClassificationTypeDeniedPackages.clear(); - if (!TextUtils.isEmpty(apps)) { - mClassificationTypeDeniedPackages.addAll(Arrays.asList(apps.split(","))); + mClassificationTypePackagesEnabledTypes.clear(); + while (XmlUtils.nextElementWithin(parser, appsOuterDepth)) { + if (!ATT_APP_ENABLED_TYPES.equals(parser.getName())) { + continue; + } + final String app = XmlUtils.readStringAttribute(parser, ATT_PACKAGE); + Set<Integer> allowedTypes = new ArraySet<>(); + final String typesString = XmlUtils.readStringAttribute(parser, ATT_TYPES); + if (!TextUtils.isEmpty(typesString)) { + allowedTypes = Arrays.stream(typesString.split(",")) + .map(Integer::valueOf) + .collect(Collectors.toSet()); + } + // Empty type list is allowed, because empty type list signifies the user + // has manually cleared the package of allowed types. + mClassificationTypePackagesEnabledTypes.put(app, allowedTypes); } } } diff --git a/services/core/java/com/android/server/notification/flags.aconfig b/services/core/java/com/android/server/notification/flags.aconfig index 65a38ae1fcde..f15c23e110a4 100644 --- a/services/core/java/com/android/server/notification/flags.aconfig +++ b/services/core/java/com/android/server/notification/flags.aconfig @@ -187,3 +187,13 @@ flag { description: "Enables sound uri with vibration source in notification channel" bug: "351975435" } + +flag { + name: "nm_binder_perf_reduce_zen_broadcasts" + namespace: "systemui" + description: "Don't send duplicate zen-related (policy changed, etc) broadcasts" + bug: "324376849" + metadata { + purpose: PURPOSE_BUGFIX + } +}
\ No newline at end of file diff --git a/services/core/java/com/android/server/pm/BroadcastHelper.java b/services/core/java/com/android/server/pm/BroadcastHelper.java index 676c6fa4f138..3660607d8764 100644 --- a/services/core/java/com/android/server/pm/BroadcastHelper.java +++ b/services/core/java/com/android/server/pm/BroadcastHelper.java @@ -360,13 +360,17 @@ public final class BroadcastHelper { @Nullable SparseArray<int[]> broadcastAllowList, @NonNull AndroidPackage pkg, @NonNull String[] sharedUidPackages, - @NonNull String reasonForTrace) { + @NonNull String reasonForTrace, + int callingUidForTrace) { final boolean isForWholeApp = componentNames.contains(packageName); + final String callingPackageNameForTrace = mContext.getPackageManager().getNameForUid( + callingUidForTrace); if (isForWholeApp || !android.content.pm.Flags.reduceBroadcastsForComponentStateChanges()) { tracePackageChangedBroadcastEvent( android.content.pm.Flags.reduceBroadcastsForComponentStateChanges(), reasonForTrace, packageName, "<implicit>" /* targetPackageName */, - "whole" /* targetComponent */, componentNames.size()); + "whole" /* targetComponent */, componentNames.size(), + callingPackageNameForTrace); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */); @@ -390,7 +394,7 @@ public final class BroadcastHelper { if (!TextUtils.equals(packageName, "android")) { tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, "android" /* targetPackageName */, "notExported" /* targetComponent */, - notExportedComponentNames.size()); + notExportedComponentNames.size(), callingPackageNameForTrace); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, "android" /* targetPackageName */, @@ -401,7 +405,7 @@ public final class BroadcastHelper { // Second, send the PACKAGE_CHANGED broadcast to the application itself. tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, packageName /* targetPackageName */, "notExported" /* targetComponent */, - notExportedComponentNames.size()); + notExportedComponentNames.size(), callingPackageNameForTrace); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, packageName /* targetPackageName */, @@ -415,7 +419,7 @@ public final class BroadcastHelper { } tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, sharedPackage /* targetPackageName */, "notExported" /* targetComponent */, - notExportedComponentNames.size()); + notExportedComponentNames.size(), callingPackageNameForTrace); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, sharedPackage /* targetPackageName */, @@ -427,7 +431,7 @@ public final class BroadcastHelper { if (!exportedComponentNames.isEmpty()) { tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, "<implicit>" /* targetPackageName */, "exported" /* targetComponent */, - exportedComponentNames.size()); + exportedComponentNames.size(), callingPackageNameForTrace); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, exportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, @@ -770,7 +774,8 @@ public final class BroadcastHelper { dontKillApp, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), null /* reason */, - "static_shared_library_changed" /* reasonForTrace */); + "static_shared_library_changed" /* reasonForTrace */, + Process.SYSTEM_UID); } } } @@ -962,7 +967,8 @@ public final class BroadcastHelper { @NonNull ArrayList<String> componentNames, int packageUid, @NonNull String reason, - @NonNull String reasonForTrace) { + @NonNull String reasonForTrace, + int callingUidForTrace) { PackageStateInternal setting = snapshot.getPackageStateInternal(packageName, Process.SYSTEM_UID); if (setting == null || setting.getPkg() == null) { @@ -980,7 +986,7 @@ public final class BroadcastHelper { mHandler.post(() -> sendPackageChangedBroadcastInternal( packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, setting.getPkg(), - sharedUserPackages, reasonForTrace)); + sharedUserPackages, reasonForTrace, callingUidForTrace)); mPackageMonitorCallbackHelper.notifyPackageChanged(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, mHandler); } @@ -1277,7 +1283,7 @@ public final class BroadcastHelper { private static void tracePackageChangedBroadcastEvent(boolean applyFlag, @NonNull String reasonForTrace, @Nullable String packageName, @Nullable String targetPackageName, @Nullable String targetComponent, - int componentSize) { + int componentSize, @Nullable String callingPackageNameForTrace) { if (!Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { return; @@ -1291,6 +1297,7 @@ public final class BroadcastHelper { builder.append(",tpn="); builder.append(targetPackageName); builder.append(",tc="); builder.append(targetComponent); builder.append(",cs="); builder.append(componentSize); + builder.append(",cpnft="); builder.append(callingPackageNameForTrace); Trace.instant(Trace.TRACE_TAG_SYSTEM_SERVER, builder.toString()); } diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index b48b39c2edd5..85b92c79403a 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -2983,7 +2983,7 @@ final class InstallPackageHelper { } } - public void sendPendingBroadcasts(String reasonForTrace) { + public void sendPendingBroadcasts(String reasonForTrace, int callingUidForTrace) { String[] packages; ArrayList<String>[] components; int numBroadcasts = 0, numUsers; @@ -3028,7 +3028,7 @@ final class InstallPackageHelper { for (int i = 0; i < numBroadcasts; i++) { mBroadcastHelper.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */, components[i], uids[i], null /* reason */, - reasonForTrace); + reasonForTrace, callingUidForTrace); } } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 286333cb83a9..4c959fafaa8d 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -1087,16 +1087,10 @@ public class LauncherAppsService extends SystemService { return null; } - final AndroidFuture<Intent[]> ret = new AndroidFuture<>(); - Intent[] intents; - mShortcutServiceInternal.createShortcutIntentsAsync(getCallingUserId(), - callingPackage, packageName, shortcutId, user.getIdentifier(), - injectBinderCallingPid(), injectBinderCallingUid(), ret); - try { - intents = ret.get(); - } catch (InterruptedException | ExecutionException e) { - return null; - } + Intent[] intents = mShortcutServiceInternal.createShortcutIntents( + getCallingUserId(), callingPackage, packageName, shortcutId, + user.getIdentifier(), injectBinderCallingPid(), + injectBinderCallingUid()); if (intents == null || intents.length == 0) { return null; } @@ -1275,40 +1269,6 @@ public class LauncherAppsService extends SystemService { } @Override - public void getShortcutsAsync(@NonNull final String callingPackage, - @NonNull final ShortcutQueryWrapper query, @NonNull final UserHandle targetUser, - @NonNull final AndroidFuture<List<ShortcutInfo>> cb) { - ensureShortcutPermission(callingPackage); - if (!canAccessProfile(targetUser.getIdentifier(), "Cannot get shortcuts")) { - cb.complete(Collections.EMPTY_LIST); - return; - } - - final long changedSince = query.getChangedSince(); - final String packageName = query.getPackage(); - final List<String> shortcutIds = query.getShortcutIds(); - final List<LocusId> locusIds = query.getLocusIds(); - final ComponentName componentName = query.getActivity(); - final int flags = query.getQueryFlags(); - if (shortcutIds != null && packageName == null) { - throw new IllegalArgumentException( - "To query by shortcut ID, package name must also be set"); - } - if (locusIds != null && packageName == null) { - throw new IllegalArgumentException( - "To query by locus ID, package name must also be set"); - } - if ((query.getQueryFlags() & ShortcutQuery.FLAG_GET_PERSONS_DATA) != 0) { - ensureStrictAccessShortcutsPermission(callingPackage); - } - - mShortcutServiceInternal.getShortcutsAsync(getCallingUserId(), - callingPackage, changedSince, packageName, shortcutIds, locusIds, - componentName, flags, targetUser.getIdentifier(), - injectBinderCallingPid(), injectBinderCallingUid(), cb); - } - - @Override public void registerShortcutChangeCallback(@NonNull final String callingPackage, @NonNull final ShortcutQueryWrapper query, @NonNull final IShortcutChangeCallback callback) { @@ -1406,15 +1366,8 @@ public class LauncherAppsService extends SystemService { if (!canAccessProfile(targetUserId, "Cannot access shortcuts")) { return null; } - - final AndroidFuture<ParcelFileDescriptor> ret = new AndroidFuture<>(); - mShortcutServiceInternal.getShortcutIconFdAsync(getCallingUserId(), - callingPackage, packageName, id, targetUserId, ret); - try { - return ret.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException(e); - } + return mShortcutServiceInternal.getShortcutIconFd(getCallingUserId(), + callingPackage, packageName, id, targetUserId); } @Override @@ -1424,15 +1377,9 @@ public class LauncherAppsService extends SystemService { if (!canAccessProfile(userId, "Cannot access shortcuts")) { return null; } - - final AndroidFuture<String> ret = new AndroidFuture<>(); - mShortcutServiceInternal.getShortcutIconUriAsync(getCallingUserId(), callingPackage, - packageName, shortcutId, userId, ret); - try { - return ret.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException(e); - } + return mShortcutServiceInternal.getShortcutIconUri( + getCallingUserId(), callingPackage, + packageName, shortcutId, userId); } @Override @@ -1515,16 +1462,9 @@ public class LauncherAppsService extends SystemService { ensureShortcutPermission(callerUid, callerPid, callingPackage); } - final AndroidFuture<Intent[]> ret = new AndroidFuture<>(); - Intent[] intents; - mShortcutServiceInternal.createShortcutIntentsAsync(getCallingUserId(), callingPackage, - packageName, shortcutId, targetUserId, - injectBinderCallingPid(), injectBinderCallingUid(), ret); - try { - intents = ret.get(); - } catch (InterruptedException | ExecutionException e) { - return false; - } + Intent[] intents = mShortcutServiceInternal.createShortcutIntents( + getCallingUserId(), callingPackage, packageName, shortcutId, + targetUserId, injectBinderCallingPid(), injectBinderCallingUid()); if (intents == null || intents.length == 0) { return false; } diff --git a/services/core/java/com/android/server/pm/PackageHandler.java b/services/core/java/com/android/server/pm/PackageHandler.java index 0a067048be42..bc03b10b41b4 100644 --- a/services/core/java/com/android/server/pm/PackageHandler.java +++ b/services/core/java/com/android/server/pm/PackageHandler.java @@ -76,7 +76,7 @@ final class PackageHandler extends Handler { void doHandleMessage(Message msg) { switch (msg.what) { case SEND_PENDING_BROADCAST: { - mPm.sendPendingBroadcasts((String) msg.obj); + mPm.sendPendingBroadcasts((String) msg.obj, msg.arg1); break; } case POST_INSTALL: { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a0bbc454c10b..aaa4fdf12411 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3503,7 +3503,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService * if the resetEnabledSettingsOnAppDataCleared is {@code true}. */ @GuardedBy("mLock") - private void resetComponentEnabledSettingsIfNeededLPw(String packageName, int userId) { + private void resetComponentEnabledSettingsIfNeededLPw(String packageName, int userId, + int callingUid) { final AndroidPackage pkg = packageName != null ? mPackages.get(packageName) : null; if (pkg == null || !pkg.isResetEnabledSettingsOnAppDataCleared()) { return; @@ -3542,9 +3543,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPendingBroadcasts.addComponents(userId, packageName, updatedComponents); if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { mHandler.sendMessageDelayed( - mHandler.obtainMessage(SEND_PENDING_BROADCAST, - "reset_component_state_changed" /* obj */), - BROADCAST_DELAY); + mHandler.obtainMessage(SEND_PENDING_BROADCAST, callingUid, 0 /* arg2 */, + "reset_component_state_changed" /* obj */), BROADCAST_DELAY); } } @@ -3841,8 +3841,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPendingBroadcasts.addComponent(userId, componentPkgName, componentName.getClassName()); if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { - mHandler.sendMessageDelayed(mHandler.obtainMessage(SEND_PENDING_BROADCAST, - "component_label_icon_changed" /* obj */), BROADCAST_DELAY); + mHandler.sendMessageDelayed( + mHandler.obtainMessage(SEND_PENDING_BROADCAST, callingUid, 0 /* arg2 */, + "component_label_icon_changed" /* obj */), BROADCAST_DELAY); } } @@ -4101,8 +4102,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService final long broadcastDelay = SystemClock.uptimeMillis() > mServiceStartWithDelay ? BROADCAST_DELAY : BROADCAST_DELAY_DURING_STARTUP; - mHandler.sendMessageDelayed(mHandler.obtainMessage(SEND_PENDING_BROADCAST, - "component_state_changed" /* obj */), broadcastDelay); + mHandler.sendMessageDelayed( + mHandler.obtainMessage(SEND_PENDING_BROADCAST, callingUid, + 0 /* arg2 */, "component_state_changed" /* obj */), + broadcastDelay); } } } @@ -4121,7 +4124,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService userId, pkgSettings.get(packageName).getAppId()); mBroadcastHelper.sendPackageChangedBroadcast(newSnapshot, packageName, false /* dontKillApp */, components, packageUid, null /* reason */, - "component_state_changed" /* reasonForTrace */); + "component_state_changed" /* reasonForTrace */, callingUid); } } finally { Binder.restoreCallingIdentity(callingId); @@ -4349,7 +4352,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService true /* dontKillApp */, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), - Intent.ACTION_OVERLAY_CHANGED, "overlay_changed" /* reasonForTrace */); + Intent.ACTION_OVERLAY_CHANGED, "overlay_changed" /* reasonForTrace */, + Process.SYSTEM_UID); } }, overlayFilter); @@ -4847,7 +4851,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mInstantAppRegistry.deleteInstantApplicationMetadata(packageName, userId); synchronized (mLock) { if (succeeded) { - resetComponentEnabledSettingsIfNeededLPw(packageName, userId); + resetComponentEnabledSettingsIfNeededLPw(packageName, userId, + callingUid); } } } @@ -6357,7 +6362,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public void setMimeGroup(String packageName, String mimeGroup, List<String> mimeTypes) { final Computer snapshot = snapshotComputer(); - enforceOwnerRights(snapshot, packageName, Binder.getCallingUid()); + final int callingUid = Binder.getCallingUid(); + enforceOwnerRights(snapshot, packageName, callingUid); mimeTypes = CollectionUtils.emptyIfNull(mimeTypes); for (int i = 0; i < mimeTypes.size(); i++) { if (mimeTypes.get(i).length() > 255) { @@ -6401,7 +6407,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int packageUid = UserHandle.getUid(userIds[i], appId); mBroadcastHelper.sendPackageChangedBroadcast(snapShot, packageName, true /* dontKillApp */, components, packageUid, reason, - "mime_group_changed" /* reasonForTrace */); + "mime_group_changed" /* reasonForTrace */, callingUid); } } }); @@ -8196,8 +8202,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mRemovePackageHelper.cleanUpForMoveInstall(volumeUuid, packageName, fromCodePath); } - void sendPendingBroadcasts(String reasonForTrace) { - mInstallPackageHelper.sendPendingBroadcasts(reasonForTrace); + void sendPendingBroadcasts(String reasonForTrace, int callingUidForTrace) { + mInstallPackageHelper.sendPendingBroadcasts(reasonForTrace, callingUidForTrace); } void handlePackagePostInstall(@NonNull InstallRequest request, boolean launchedForRestore) { diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 6f50295cc8d5..f140400ce6c5 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -19,27 +19,11 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.Person; -import android.app.appsearch.AppSearchBatchResult; -import android.app.appsearch.AppSearchManager; -import android.app.appsearch.AppSearchResult; -import android.app.appsearch.AppSearchSession; -import android.app.appsearch.BatchResultCallback; -import android.app.appsearch.GenericDocument; -import android.app.appsearch.GetByDocumentIdRequest; -import android.app.appsearch.PutDocumentsRequest; -import android.app.appsearch.RemoveByDocumentIdRequest; -import android.app.appsearch.ReportUsageRequest; -import android.app.appsearch.SearchResult; -import android.app.appsearch.SearchResults; -import android.app.appsearch.SearchSpec; -import android.app.appsearch.SetSchemaRequest; import android.app.usage.UsageStatsManagerInternal; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; import android.content.LocusId; -import android.content.pm.AppSearchShortcutInfo; -import android.content.pm.AppSearchShortcutPerson; import android.content.pm.PackageInfo; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; @@ -58,7 +42,6 @@ import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.infra.AndroidFuture; import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; @@ -167,13 +150,6 @@ class ShortcutPackage extends ShortcutPackageItem { private final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>(); /** - * A temporary copy of shortcuts that are to be cleared once persisted into AppSearch, keyed on - * IDs. - */ - @GuardedBy("mPackageItemLock") - private final ArrayMap<String, ShortcutInfo> mTransientShortcuts = new ArrayMap<>(0); - - /** * All the share targets from the package */ @GuardedBy("mPackageItemLock") @@ -196,9 +172,6 @@ class ShortcutPackage extends ShortcutPackageItem { @GuardedBy("mPackageItemLock") private long mLastReportedTime; - @GuardedBy("mPackageItemLock") - private boolean mIsAppSearchSchemaUpToDate; - private ShortcutPackage(ShortcutUser shortcutUser, int packageUserId, String packageName, ShortcutPackageInfo spi) { super(shortcutUser, packageUserId, packageName, @@ -228,10 +201,6 @@ class ShortcutPackage extends ShortcutPackageItem { getPackageName(), getPackageUserId()); } - private boolean isAppSearchEnabled() { - return mShortcutUser.mService.isAppSearchEnabled(); - } - public int getShortcutCount() { synchronized (mPackageItemLock) { return mShortcuts.size(); @@ -249,9 +218,6 @@ class ShortcutPackage extends ShortcutPackageItem { // - Unshadow all shortcuts. // - Set disabled reason. // - Disable if needed. - final String query = String.format("%s:-%s AND %s:%s", - AppSearchShortcutInfo.KEY_FLAGS, ShortcutInfo.FLAG_SHADOW, - AppSearchShortcutInfo.KEY_DISABLED_REASON, restoreBlockReason); forEachShortcutMutate(si -> { if (restoreBlockReason == ShortcutInfo.DISABLED_REASON_NOT_DISABLED && !si.hasFlags(ShortcutInfo.FLAG_SHADOW) @@ -407,13 +373,7 @@ class ShortcutPackage extends ShortcutPackageItem { & (ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_CACHED_ALL)); } - if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { - if (isAppSearchEnabled()) { - synchronized (mPackageItemLock) { - mTransientShortcuts.put(newShortcut.getId(), newShortcut); - } - } - } else { + if (!newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { forceReplaceShortcutInner(newShortcut); } return oldShortcut != null; @@ -466,8 +426,7 @@ class ShortcutPackage extends ShortcutPackageItem { } changedShortcuts.add(shortcut); - deleted = deleteDynamicWithId(shortcut.getId(), /* ignoreInvisible =*/ true, - /*ignorePersistedShortcuts=*/ true) != null; + deleted = deleteDynamicWithId(shortcut.getId(), /* ignoreInvisible =*/ true) != null; } } if (oldShortcut != null) { @@ -480,25 +439,9 @@ class ShortcutPackage extends ShortcutPackageItem { & (ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_CACHED_ALL)); } - if (newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { - if (isAppSearchEnabled()) { - synchronized (mPackageItemLock) { - mTransientShortcuts.put(newShortcut.getId(), newShortcut); - } - } - } else { + if (!newShortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER)) { forceReplaceShortcutInner(newShortcut); } - if (isAppSearchEnabled()) { - runAsSystem(() -> fromAppSearch().thenAccept(session -> - session.reportUsage(new ReportUsageRequest.Builder( - getPackageName(), newShortcut.getId()).build(), mExecutor, result -> { - if (!result.isSuccess()) { - Slog.e(TAG, "Failed to report usage via AppSearch. " - + result.getErrorMessage()); - } - }))); - } return deleted; } @@ -567,7 +510,6 @@ class ShortcutPackage extends ShortcutPackageItem { } } } - removeAllShortcutsAsync(); if (changed) { return removeOrphans(); } @@ -581,11 +523,10 @@ class ShortcutPackage extends ShortcutPackageItem { * @return The deleted shortcut, or null if it was not actually removed because it is either * pinned or cached. */ - public ShortcutInfo deleteDynamicWithId(@NonNull String shortcutId, boolean ignoreInvisible, - boolean ignorePersistedShortcuts) { + public ShortcutInfo deleteDynamicWithId(@NonNull String shortcutId, boolean ignoreInvisible) { return deleteOrDisableWithId( shortcutId, /* disable =*/ false, /* overrideImmutable=*/ false, ignoreInvisible, - ShortcutInfo.DISABLED_REASON_NOT_DISABLED, ignorePersistedShortcuts); + ShortcutInfo.DISABLED_REASON_NOT_DISABLED); } /** @@ -596,9 +537,9 @@ class ShortcutPackage extends ShortcutPackageItem { * it's still pinned. */ private ShortcutInfo disableDynamicWithId(@NonNull String shortcutId, boolean ignoreInvisible, - int disabledReason, boolean ignorePersistedShortcuts) { + int disabledReason) { return deleteOrDisableWithId(shortcutId, /* disable =*/ true, /* overrideImmutable=*/ false, - ignoreInvisible, disabledReason, ignorePersistedShortcuts); + ignoreInvisible, disabledReason); } /** @@ -614,7 +555,7 @@ class ShortcutPackage extends ShortcutPackageItem { } return deleteOrDisableWithId( shortcutId, /* disable =*/ false, /* overrideImmutable=*/ false, ignoreInvisible, - ShortcutInfo.DISABLED_REASON_NOT_DISABLED, /*ignorePersistedShortcuts=*/ false); + ShortcutInfo.DISABLED_REASON_NOT_DISABLED); } /** @@ -628,8 +569,7 @@ class ShortcutPackage extends ShortcutPackageItem { int disabledMessageResId, boolean overrideImmutable, boolean ignoreInvisible, int disabledReason) { final ShortcutInfo deleted = deleteOrDisableWithId(shortcutId, /* disable =*/ true, - overrideImmutable, ignoreInvisible, disabledReason, - /*ignorePersistedShortcuts=*/ false); + overrideImmutable, ignoreInvisible, disabledReason); // If disabled id still exists, it is pinned and we need to update the disabled message. mutateShortcut(shortcutId, null, disabled -> { @@ -648,8 +588,7 @@ class ShortcutPackage extends ShortcutPackageItem { @Nullable private ShortcutInfo deleteOrDisableWithId(@NonNull String shortcutId, boolean disable, - boolean overrideImmutable, boolean ignoreInvisible, int disabledReason, - boolean ignorePersistedShortcuts) { + boolean overrideImmutable, boolean ignoreInvisible, int disabledReason) { Preconditions.checkState( (disable == (disabledReason != ShortcutInfo.DISABLED_REASON_NOT_DISABLED)), "disable and disabledReason disagree: " + disable + " vs " + disabledReason); @@ -662,9 +601,6 @@ class ShortcutPackage extends ShortcutPackageItem { if (!overrideImmutable) { ensureNotImmutable(oldShortcut, /*ignoreInvisible=*/ true); } - if (!ignorePersistedShortcuts) { - removeShortcutAsync(shortcutId); - } if (oldShortcut.isPinned() || oldShortcut.isCached()) { mutateShortcut(oldShortcut.getId(), oldShortcut, si -> { si.setRank(0); @@ -1214,8 +1150,7 @@ class ShortcutPackage extends ShortcutPackageItem { "%s is no longer main activity. Disabling shorcut %s.", getPackageName(), si.getId())); if (disableDynamicWithId(si.getId(), /*ignoreInvisible*/ false, - ShortcutInfo.DISABLED_REASON_APP_CHANGED, - /*ignorePersistedShortcuts*/ false) != null) { + ShortcutInfo.DISABLED_REASON_APP_CHANGED) != null) { return; } // Still pinned, so fall-through and possibly update the resources. @@ -1367,8 +1302,7 @@ class ShortcutPackage extends ShortcutPackageItem { service.wtf("Found manifest shortcuts in excess list."); continue; } - deleteDynamicWithId(shortcut.getId(), /*ignoreInvisible=*/ true, - /*ignorePersistedShortcuts=*/ true); + deleteDynamicWithId(shortcut.getId(), /*ignoreInvisible=*/ true); } } @@ -1818,15 +1752,7 @@ class ShortcutPackage extends ShortcutPackageItem { } private boolean hasNoShortcut() { - if (!isAppSearchEnabled()) { - return getShortcutCount() == 0; - } - final boolean[] hasAnyShortcut = new boolean[1]; - forEachShortcutStopWhen(si -> { - hasAnyShortcut[0] = true; - return true; - }); - return !hasAnyShortcut[0]; + return getShortcutCount() == 0; } @Override @@ -1845,10 +1771,6 @@ class ShortcutPackage extends ShortcutPackageItem { ShortcutService.writeAttr(out, ATTR_NAME, getPackageName()); ShortcutService.writeAttr(out, ATTR_CALL_COUNT, mApiCallCount); ShortcutService.writeAttr(out, ATTR_LAST_RESET, mLastResetTime); - if (!forBackup) { - ShortcutService.writeAttr(out, ATTR_SCHEMA_VERSON, mIsAppSearchSchemaUpToDate - ? AppSearchShortcutInfo.SCHEMA_VERSION : 0); - } getPackageInfo().saveToXml(mShortcutUser.mService, out, forBackup); if (ShortcutService.DEBUG_REBOOT) { @@ -2051,9 +1973,6 @@ class ShortcutPackage extends ShortcutPackageItem { final ShortcutPackage ret = new ShortcutPackage(shortcutUser, shortcutUser.getUserId(), packageName); synchronized (ret.mPackageItemLock) { - ret.mIsAppSearchSchemaUpToDate = ShortcutService.parseIntAttribute( - parser, ATTR_SCHEMA_VERSON, 0) == AppSearchShortcutInfo.SCHEMA_VERSION; - ret.mApiCallCount = ShortcutService.parseIntAttribute(parser, ATTR_CALL_COUNT); ret.mLastResetTime = ShortcutService.parseLongAttribute(parser, ATTR_LAST_RESET); @@ -2478,47 +2397,6 @@ class ShortcutPackage extends ShortcutPackageItem { } } - @NonNull - private AndroidFuture<AppSearchSession> setupSchema( - @NonNull final AppSearchSession session) { - if (ShortcutService.DEBUG_REBOOT) { - Slog.d(TAG, "Setup Schema for user=" + mShortcutUser.getUserId() - + " pkg=" + getPackageName()); - } - SetSchemaRequest.Builder schemaBuilder = new SetSchemaRequest.Builder() - .addSchemas(AppSearchShortcutPerson.SCHEMA, AppSearchShortcutInfo.SCHEMA) - .setForceOverride(true) - .addRequiredPermissionsForSchemaTypeVisibility(AppSearchShortcutInfo.SCHEMA_TYPE, - Collections.singleton(SetSchemaRequest.READ_HOME_APP_SEARCH_DATA)) - .addRequiredPermissionsForSchemaTypeVisibility(AppSearchShortcutInfo.SCHEMA_TYPE, - Collections.singleton(SetSchemaRequest.READ_ASSISTANT_APP_SEARCH_DATA)) - .addRequiredPermissionsForSchemaTypeVisibility(AppSearchShortcutPerson.SCHEMA_TYPE, - Collections.singleton(SetSchemaRequest.READ_HOME_APP_SEARCH_DATA)) - .addRequiredPermissionsForSchemaTypeVisibility(AppSearchShortcutPerson.SCHEMA_TYPE, - Collections.singleton(SetSchemaRequest.READ_ASSISTANT_APP_SEARCH_DATA)); - final AndroidFuture<AppSearchSession> future = new AndroidFuture<>(); - session.setSchema( - schemaBuilder.build(), mExecutor, mShortcutUser.mExecutor, result -> { - if (!result.isSuccess()) { - future.completeExceptionally( - new IllegalArgumentException(result.getErrorMessage())); - return; - } - future.complete(session); - }); - return future; - } - - @NonNull - private SearchSpec getSearchSpec() { - return new SearchSpec.Builder() - .addFilterSchemas(AppSearchShortcutInfo.SCHEMA_TYPE) - .addFilterNamespaces(getPackageName()) - .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY) - .setResultCountPerPage(mShortcutUser.mService.getMaxActivityShortcuts()) - .build(); - } - private boolean verifyRanksSequential(List<ShortcutInfo> list) { boolean failed = false; @@ -2533,186 +2411,6 @@ class ShortcutPackage extends ShortcutPackageItem { return failed; } - // Async Operations - - /** - * Removes all shortcuts from AppSearch. - */ - void removeAllShortcutsAsync() { - if (!isAppSearchEnabled()) { - return; - } - runAsSystem(() -> fromAppSearch().thenAccept(session -> - session.remove("", getSearchSpec(), mShortcutUser.mExecutor, result -> { - if (!result.isSuccess()) { - Slog.e(TAG, "Failed to remove shortcuts from AppSearch. " - + result.getErrorMessage()); - } - }))); - } - - void getShortcutByIdsAsync(@NonNull final Set<String> ids, - @NonNull final Consumer<List<ShortcutInfo>> cb) { - if (!isAppSearchEnabled()) { - cb.accept(Collections.emptyList()); - return; - } - runAsSystem(() -> fromAppSearch().thenAccept(session -> { - session.getByDocumentId(new GetByDocumentIdRequest.Builder(getPackageName()) - .addIds(ids).build(), mShortcutUser.mExecutor, - new BatchResultCallback<String, GenericDocument>() { - @Override - public void onResult( - @NonNull AppSearchBatchResult<String, GenericDocument> result) { - final List<ShortcutInfo> ret = result.getSuccesses().values() - .stream().map(doc -> - ShortcutInfo.createFromGenericDocument( - mShortcutUser.getUserId(), doc)) - .collect(Collectors.toList()); - cb.accept(ret); - } - @Override - public void onSystemError( - @Nullable Throwable throwable) { - Slog.d(TAG, "Error retrieving shortcuts", throwable); - } - }); - })); - } - - private void removeShortcutAsync(@NonNull final String... id) { - Objects.requireNonNull(id); - removeShortcutAsync(Arrays.asList(id)); - } - - private void removeShortcutAsync(@NonNull final Collection<String> ids) { - if (!isAppSearchEnabled()) { - return; - } - runAsSystem(() -> fromAppSearch().thenAccept(session -> - session.remove( - new RemoveByDocumentIdRequest.Builder(getPackageName()).addIds(ids).build(), - mShortcutUser.mExecutor, - new BatchResultCallback<String, Void>() { - @Override - public void onResult( - @NonNull AppSearchBatchResult<String, Void> result) { - if (!result.isSuccess()) { - final Map<String, AppSearchResult<Void>> failures = - result.getFailures(); - for (String key : failures.keySet()) { - Slog.e(TAG, "Failed deleting " + key + ", error message:" - + failures.get(key).getErrorMessage()); - } - } - } - @Override - public void onSystemError(@Nullable Throwable throwable) { - Slog.e(TAG, "Error removing shortcuts", throwable); - } - }))); - } - - @GuardedBy("mPackageItemLock") - @Override - void scheduleSaveToAppSearchLocked() { - final Map<String, ShortcutInfo> copy = new ArrayMap<>(mShortcuts); - if (!mTransientShortcuts.isEmpty()) { - copy.putAll(mTransientShortcuts); - mTransientShortcuts.clear(); - } - saveShortcutsAsync(copy.values().stream().filter(ShortcutInfo::usesQuota).collect( - Collectors.toList())); - } - - private void saveShortcutsAsync( - @NonNull final Collection<ShortcutInfo> shortcuts) { - Objects.requireNonNull(shortcuts); - if (!isAppSearchEnabled() || shortcuts.isEmpty()) { - // No need to invoke AppSearch when there's nothing to save. - return; - } - if (ShortcutService.DEBUG_REBOOT) { - Slog.d(TAG, "Saving shortcuts async for user=" + mShortcutUser.getUserId() - + " pkg=" + getPackageName() + " ids=" + shortcuts.stream() - .map(ShortcutInfo::getId).collect(Collectors.joining(",", "[", "]"))); - } - runAsSystem(() -> fromAppSearch().thenAccept(session -> { - if (shortcuts.isEmpty()) { - return; - } - session.put(new PutDocumentsRequest.Builder() - .addGenericDocuments( - AppSearchShortcutInfo.toGenericDocuments(shortcuts)) - .build(), - mShortcutUser.mExecutor, - new BatchResultCallback<String, Void>() { - @Override - public void onResult( - @NonNull AppSearchBatchResult<String, Void> result) { - if (!result.isSuccess()) { - for (AppSearchResult<Void> k : result.getFailures().values()) { - Slog.e(TAG, k.getErrorMessage()); - } - } - } - @Override - public void onSystemError(@Nullable Throwable throwable) { - Slog.d(TAG, "Error persisting shortcuts", throwable); - } - }); - })); - } - - @VisibleForTesting - void getTopShortcutsFromPersistence(AndroidFuture<List<ShortcutInfo>> cb) { - if (!isAppSearchEnabled()) { - cb.complete(null); - } - runAsSystem(() -> fromAppSearch().thenAccept(session -> { - SearchResults res = session.search("", getSearchSpec()); - res.getNextPage(mShortcutUser.mExecutor, results -> { - if (!results.isSuccess()) { - cb.completeExceptionally(new IllegalStateException(results.getErrorMessage())); - return; - } - cb.complete(results.getResultValue().stream() - .map(SearchResult::getGenericDocument) - .map(doc -> ShortcutInfo.createFromGenericDocument( - mShortcutUser.getUserId(), doc)) - .collect(Collectors.toList())); - }); - })); - } - - @NonNull - private AndroidFuture<AppSearchSession> fromAppSearch() { - final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy(); - final AppSearchManager.SearchContext searchContext = - new AppSearchManager.SearchContext.Builder(getPackageName()).build(); - AndroidFuture<AppSearchSession> future = null; - try { - StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() - .detectAll() - .penaltyLog() // TODO: change this to penaltyDeath to fix the call-site - .build()); - future = mShortcutUser.getAppSearch(searchContext); - synchronized (mPackageItemLock) { - if (!mIsAppSearchSchemaUpToDate) { - future = future.thenCompose(this::setupSchema); - } - mIsAppSearchSchemaUpToDate = true; - } - } catch (Exception e) { - Slog.e(TAG, "Failed to create app search session. pkg=" - + getPackageName() + " user=" + mShortcutUser.getUserId(), e); - Objects.requireNonNull(future).completeExceptionally(e); - } finally { - StrictMode.setThreadPolicy(oldPolicy); - } - return Objects.requireNonNull(future); - } - private void runAsSystem(@NonNull final Runnable fn) { final long callingIdentity = Binder.clearCallingIdentity(); try { diff --git a/services/core/java/com/android/server/pm/ShortcutPackageItem.java b/services/core/java/com/android/server/pm/ShortcutPackageItem.java index dfd2e08e9ba9..44789e4c4de2 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackageItem.java +++ b/services/core/java/com/android/server/pm/ShortcutPackageItem.java @@ -187,11 +187,6 @@ abstract class ShortcutPackageItem { } } - @GuardedBy("mPackageItemLock") - void scheduleSaveToAppSearchLocked() { - - } - public JSONObject dumpCheckin(boolean clear) throws JSONException { final JSONObject result = new JSONObject(); result.put(KEY_NAME, mPackageName); @@ -221,10 +216,7 @@ abstract class ShortcutPackageItem { } synchronized (mPackageItemLock) { path.getParentFile().mkdirs(); - // TODO: Since we are persisting shortcuts into AppSearch, we should read from/write to - // AppSearch as opposed to maintaining a separate XML file. saveToFileLocked(path, false /*forBackup*/); - scheduleSaveToAppSearchLocked(); } } diff --git a/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java b/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java index 47a140a97c96..c5899ae7048e 100644 --- a/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java +++ b/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java @@ -521,8 +521,7 @@ class ShortcutRequestPinProcessor { if (DEBUG) { Slog.d(TAG, "Removing " + shortcutId + " as dynamic"); } - ps.deleteDynamicWithId(shortcutId, /*ignoreInvisible=*/ false, - /*wasPushedOut=*/ false); + ps.deleteDynamicWithId(shortcutId, /*ignoreInvisible=*/ false); } ps.adjustRanks(); // Shouldn't be needed, but just in case. diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 1052c94d7799..2785da5cbdbd 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -113,7 +113,6 @@ import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; -import com.android.internal.infra.AndroidFuture; import com.android.internal.logging.MetricsLogger; import com.android.internal.util.CollectionUtils; import com.android.internal.util.DumpUtils; @@ -475,8 +474,6 @@ public class ShortcutService extends IShortcutService.Stub { @GuardedBy("mServiceLock") private final MetricsLogger mMetricsLogger = new MetricsLogger(); - private final boolean mIsAppSearchEnabled; - private ComponentName mChooserActivity; static class InvalidFileFormatException extends Exception { @@ -519,9 +516,6 @@ public class ShortcutService extends IShortcutService.Stub { mShortcutRequestPinProcessor = new ShortcutRequestPinProcessor(this, mServiceLock); mShortcutDumpFiles = new ShortcutDumpFiles(this); - mIsAppSearchEnabled = DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.SHORTCUT_APPSEARCH_INTEGRATION, false) - && !injectIsLowRamDevice(); if (onlyForPackageManagerApis) { return; // Don't do anything further. For unit tests only. @@ -559,10 +553,6 @@ public class ShortcutService extends IShortcutService.Stub { injectRegisterRoleHoldersListener(mOnRoleHoldersChangedListener); } - boolean isAppSearchEnabled() { - return mIsAppSearchEnabled; - } - long getStatStartTime() { return mStatLogger.getTime(); } @@ -757,8 +747,6 @@ public class ShortcutService extends IShortcutService.Stub { if (DEBUG || DEBUG_REBOOT) { Slog.d(TAG, "unloadUserLocked: userId=" + userId); } - // Cancel any ongoing background tasks. - getUserShortcutsLocked(userId).cancelAllInFlightTasks(); // Save all dirty information. saveDirtyInfo(); @@ -2298,20 +2286,20 @@ public class ShortcutService extends IShortcutService.Stub { } @Override - public void requestPinShortcut(String packageName, ShortcutInfo shortcut, - IntentSender resultIntent, int userId, AndroidFuture<String> ret) { + public boolean requestPinShortcut(String packageName, ShortcutInfo shortcut, + IntentSender resultIntent, int userId) { Objects.requireNonNull(shortcut); Preconditions.checkArgument(shortcut.isEnabled(), "Shortcut must be enabled"); Preconditions.checkArgument( !shortcut.isExcludedFromSurfaces(ShortcutInfo.SURFACE_LAUNCHER), "Shortcut excluded from launcher cannot be pinned"); - ret.complete(String.valueOf(requestPinItem( - packageName, userId, shortcut, null, null, resultIntent))); + return requestPinItem( + packageName, userId, shortcut, null, null, resultIntent); } @Override - public void createShortcutResultIntent(String packageName, ShortcutInfo shortcut, int userId, - AndroidFuture<Intent> ret) throws RemoteException { + public Intent createShortcutResultIntent(String packageName, + ShortcutInfo shortcut, int userId) throws RemoteException { Objects.requireNonNull(shortcut); Preconditions.checkArgument(shortcut.isEnabled(), "Shortcut must be enabled"); verifyCaller(packageName, userId); @@ -2323,7 +2311,7 @@ public class ShortcutService extends IShortcutService.Stub { intent = mShortcutRequestPinProcessor.createShortcutResultIntent(shortcut, userId); } verifyStates(); - ret.complete(intent); + return intent; } /** @@ -2471,8 +2459,7 @@ public class ShortcutService extends IShortcutService.Stub { if (!ps.isShortcutExistsAndVisibleToPublisher(id)) { continue; } - ShortcutInfo removed = ps.deleteDynamicWithId(id, /*ignoreInvisible=*/ true, - /*wasPushedOut*/ false); + ShortcutInfo removed = ps.deleteDynamicWithId(id, /*ignoreInvisible=*/ true); if (removed == null) { if (changedShortcuts == null) { changedShortcuts = new ArrayList<>(1); @@ -3096,51 +3083,6 @@ public class ShortcutService extends IShortcutService.Stub { } @Override - public void getShortcutsAsync(int launcherUserId, - @NonNull String callingPackage, long changedSince, - @Nullable String packageName, @Nullable List<String> shortcutIds, - @Nullable List<LocusId> locusIds, @Nullable ComponentName componentName, - int queryFlags, int userId, int callingPid, int callingUid, - @NonNull AndroidFuture<List<ShortcutInfo>> cb) { - final List<ShortcutInfo> ret = getShortcuts(launcherUserId, callingPackage, - changedSince, packageName, shortcutIds, locusIds, componentName, queryFlags, - userId, callingPid, callingUid); - if (shortcutIds == null || packageName == null || ret.size() >= shortcutIds.size()) { - // skip persistence layer if not querying by id in a specific package or all - // shortcuts have already been found. - cb.complete(ret); - return; - } - final ShortcutPackage p; - synchronized (mServiceLock) { - p = getUserShortcutsLocked(userId).getPackageShortcutsIfExists(packageName); - } - if (p == null) { - cb.complete(ret); - return; // Bail-out directly if package doesn't exist. - } - // fetch remaining shortcuts from persistence layer - final ArraySet<String> ids = new ArraySet<>(shortcutIds); - // remove the ids that are already fetched - ret.stream().map(ShortcutInfo::getId).collect(Collectors.toList()).forEach(ids::remove); - - int flags = ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER; - if ((queryFlags & ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY) != 0) { - flags = ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO; - } else if ((queryFlags & ShortcutQuery.FLAG_GET_PERSONS_DATA) != 0) { - flags &= ~ShortcutInfo.CLONE_REMOVE_PERSON; - } - final int cloneFlag = flags; - - p.getShortcutByIdsAsync(ids, shortcuts -> { - if (shortcuts != null) { - shortcuts.stream().map(si -> si.clone(cloneFlag)).forEach(ret::add); - } - cb.complete(ret); - }); - } - - @Override public boolean isPinnedByCaller(int launcherUserId, @NonNull String callingPackage, @NonNull String packageName, @NonNull String shortcutId, int userId) { Preconditions.checkStringNotEmpty(packageName, "packageName"); @@ -3183,27 +3125,6 @@ public class ShortcutService extends IShortcutService.Stub { return list.size() == 0 ? null : list.get(0); } - private void getShortcutInfoAsync( - int launcherUserId, @NonNull String packageName, @NonNull String shortcutId, - int userId, @NonNull Consumer<ShortcutInfo> cb) { - Preconditions.checkStringNotEmpty(packageName, "packageName"); - Preconditions.checkStringNotEmpty(shortcutId, "shortcutId"); - - throwIfUserLockedL(userId); - throwIfUserLockedL(launcherUserId); - - final ShortcutPackage p; - synchronized (mServiceLock) { - p = getUserShortcutsLocked(userId).getPackageShortcutsIfExists(packageName); - } - if (p == null) { - cb.accept(null); - return; - } - p.getShortcutByIdsAsync(Collections.singleton(shortcutId), shortcuts -> - cb.accept(shortcuts == null || shortcuts.isEmpty() ? null : shortcuts.get(0))); - } - @Override public void pinShortcuts(int launcherUserId, @NonNull String callingPackage, @NonNull String packageName, @@ -3388,48 +3309,6 @@ public class ShortcutService extends IShortcutService.Stub { } @Override - public void createShortcutIntentsAsync(int launcherUserId, - @NonNull String callingPackage, @NonNull String packageName, - @NonNull String shortcutId, int userId, int callingPid, - int callingUid, @NonNull AndroidFuture<Intent[]> cb) { - // Calling permission must be checked by LauncherAppsImpl. - Preconditions.checkStringNotEmpty(packageName, "packageName can't be empty"); - Preconditions.checkStringNotEmpty(shortcutId, "shortcutId can't be empty"); - - // Check in memory shortcut first - synchronized (mServiceLock) { - throwIfUserLockedL(userId); - throwIfUserLockedL(launcherUserId); - - getLauncherShortcutsLocked(callingPackage, userId, launcherUserId) - .attemptToRestoreIfNeededAndSave(); - - final boolean getPinnedByAnyLauncher = - canSeeAnyPinnedShortcut(callingPackage, launcherUserId, - callingPid, callingUid); - - // Make sure the shortcut is actually visible to the launcher. - final ShortcutInfo si = getShortcutInfoLocked( - launcherUserId, callingPackage, packageName, shortcutId, userId, - getPinnedByAnyLauncher); - if (si != null) { - if (!si.isEnabled() || !(si.isAlive() || getPinnedByAnyLauncher)) { - Log.e(TAG, "Shortcut " + shortcutId + " does not exist or disabled"); - cb.complete(null); - return; - } - cb.complete(si.getIntents()); - return; - } - } - - // Otherwise check persisted shortcuts - getShortcutInfoAsync(launcherUserId, packageName, shortcutId, userId, si -> { - cb.complete(si == null ? null : si.getIntents()); - }); - } - - @Override public void addListener(@NonNull ShortcutChangeListener listener) { synchronized (mServiceLock) { mListeners.add(Objects.requireNonNull(listener)); @@ -3534,41 +3413,6 @@ public class ShortcutService extends IShortcutService.Stub { } } - @Override - public void getShortcutIconFdAsync(int launcherUserId, @NonNull String callingPackage, - @NonNull String packageName, @NonNull String shortcutId, int userId, - @NonNull AndroidFuture<ParcelFileDescriptor> cb) { - Objects.requireNonNull(callingPackage, "callingPackage"); - Objects.requireNonNull(packageName, "packageName"); - Objects.requireNonNull(shortcutId, "shortcutId"); - - // Checks shortcuts in memory first - final ShortcutPackage p; - synchronized (mServiceLock) { - throwIfUserLockedL(userId); - throwIfUserLockedL(launcherUserId); - - getLauncherShortcutsLocked(callingPackage, userId, launcherUserId) - .attemptToRestoreIfNeededAndSave(); - - p = getUserShortcutsLocked(userId).getPackageShortcutsIfExists(packageName); - if (p == null) { - cb.complete(null); - return; - } - - final ShortcutInfo shortcutInfo = p.findShortcutById(shortcutId); - if (shortcutInfo != null) { - cb.complete(getShortcutIconParcelFileDescriptor(p, shortcutInfo)); - return; - } - } - - // Otherwise check persisted shortcuts - getShortcutInfoAsync(launcherUserId, packageName, shortcutId, userId, si -> - cb.complete(getShortcutIconParcelFileDescriptor(p, si))); - } - @Nullable private ParcelFileDescriptor getShortcutIconParcelFileDescriptor( @Nullable final ShortcutPackage p, @Nullable final ShortcutInfo shortcutInfo) { @@ -3619,44 +3463,6 @@ public class ShortcutService extends IShortcutService.Stub { } } - @Override - public void getShortcutIconUriAsync(int launcherUserId, @NonNull String launcherPackage, - @NonNull String packageName, @NonNull String shortcutId, int userId, - @NonNull AndroidFuture<String> cb) { - Objects.requireNonNull(launcherPackage, "launcherPackage"); - Objects.requireNonNull(packageName, "packageName"); - Objects.requireNonNull(shortcutId, "shortcutId"); - - // Checks shortcuts in memory first - synchronized (mServiceLock) { - throwIfUserLockedL(userId); - throwIfUserLockedL(launcherUserId); - - getLauncherShortcutsLocked(launcherPackage, userId, launcherUserId) - .attemptToRestoreIfNeededAndSave(); - - final ShortcutPackage p = getUserShortcutsLocked(userId) - .getPackageShortcutsIfExists(packageName); - if (p == null) { - cb.complete(null); - return; - } - - final ShortcutInfo shortcutInfo = p.findShortcutById(shortcutId); - if (shortcutInfo != null) { - cb.complete(getShortcutIconUriInternal(launcherUserId, launcherPackage, - packageName, shortcutInfo, userId)); - return; - } - } - - // Otherwise check persisted shortcuts - getShortcutInfoAsync(launcherUserId, packageName, shortcutId, userId, si -> { - cb.complete(si == null ? null : getShortcutIconUriInternal(launcherUserId, - launcherPackage, packageName, si, userId)); - }); - } - private String getShortcutIconUriInternal(int launcherUserId, @NonNull String launcherPackage, @NonNull String packageName, @NonNull ShortcutInfo shortcutInfo, int userId) { @@ -3865,7 +3671,6 @@ public class ShortcutService extends IShortcutService.Stub { synchronized (mServiceLock) { if (mHandler.hasCallbacks(mSaveDirtyInfoRunner)) { mHandler.removeCallbacks(mSaveDirtyInfoRunner); - forEachLoadedUserLocked(ShortcutUser::cancelAllInFlightTasks); saveDirtyInfo(); } mShutdown.set(true); diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java index b35f9c2cd242..bc8cc7ba29af 100644 --- a/services/core/java/com/android/server/pm/ShortcutUser.java +++ b/services/core/java/com/android/server/pm/ShortcutUser.java @@ -18,8 +18,6 @@ package com.android.server.pm; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; -import android.app.appsearch.AppSearchManager; -import android.app.appsearch.AppSearchSession; import android.content.pm.ShortcutManager; import android.content.pm.UserPackage; import android.metrics.LogMaker; @@ -34,7 +32,6 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.infra.AndroidFuture; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.modules.utils.TypedXmlPullParser; @@ -83,7 +80,6 @@ class ShortcutUser { private static final String KEY_PACKAGES = "packages"; final ShortcutService mService; - final AppSearchManager mAppSearchManager; final Executor mExecutor; @UserIdInt @@ -105,14 +101,9 @@ class ShortcutUser { private final Object mLock = new Object(); - @GuardedBy("mLock") - private final ArrayList<AndroidFuture<AppSearchSession>> mInFlightSessions = new ArrayList<>(); - public ShortcutUser(ShortcutService service, int userId) { mService = service; mUserId = userId; - mAppSearchManager = service.mContext.createContextAsUser(UserHandle.of(userId), 0) - .getSystemService(AppSearchManager.class); mExecutor = FgThread.getExecutor(); } @@ -154,12 +145,7 @@ class ShortcutUser { public ShortcutPackage removePackage(@NonNull String packageName) { final ShortcutPackage removed = mPackages.remove(packageName); - - if (removed != null) { - removed.removeAllShortcutsAsync(); - } mService.cleanupBitmapsForPackage(mUserId, packageName); - return removed; } @@ -524,7 +510,6 @@ class ShortcutUser { Log.w(TAG, "Shortcuts for package " + sp.getPackageName() + " are being restored." + " Existing non-manifeset shortcuts will be overwritten."); } - sp.removeAllShortcutsAsync(); addPackage(sp); restoredPackages[0]++; restoredShortcuts[0] += sp.getShortcutCount(); @@ -660,47 +645,4 @@ class ShortcutUser { logger.write(logMaker.setType(MetricsEvent.SHORTCUTS_CHANGED_SHORTCUT_COUNT) .setSubtype(totalSharingShortcutCount)); } - - @NonNull - AndroidFuture<AppSearchSession> getAppSearch( - @NonNull final AppSearchManager.SearchContext searchContext) { - final AndroidFuture<AppSearchSession> future = new AndroidFuture<>(); - synchronized (mLock) { - mInFlightSessions.removeIf(CompletableFuture::isDone); - mInFlightSessions.add(future); - } - if (mAppSearchManager == null) { - future.completeExceptionally(new RuntimeException("app search manager is null")); - return future; - } - if (!mService.mUserManagerInternal.isUserUnlockingOrUnlocked(getUserId())) { - // In rare cases the user might be stopped immediate after it started, in these cases - // any on-going session will need to be abandoned. - future.completeExceptionally(new RuntimeException("User " + getUserId() + " is ")); - return future; - } - final long callingIdentity = Binder.clearCallingIdentity(); - try { - mAppSearchManager.createSearchSession(searchContext, mExecutor, result -> { - if (!result.isSuccess()) { - future.completeExceptionally( - new RuntimeException(result.getErrorMessage())); - return; - } - future.complete(result.getResultValue()); - }); - } finally { - Binder.restoreCallingIdentity(callingIdentity); - } - return future; - } - - void cancelAllInFlightTasks() { - synchronized (mLock) { - for (AndroidFuture<AppSearchSession> session : mInFlightSessions) { - session.cancel(true); - } - mInFlightSessions.clear(); - } - } } diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java index c4e4c422688d..1726f0da9cbe 100644 --- a/services/core/java/com/android/server/power/hint/HintManagerService.java +++ b/services/core/java/com/android/server/power/hint/HintManagerService.java @@ -1594,12 +1594,9 @@ public final class HintManagerService extends SystemService { } halParams.tids = params.tids; } - if (halParams.calculationWindowMillis - == mDefaultCpuHeadroomCalculationWindowMillis) { - synchronized (mCpuHeadroomLock) { - final CpuHeadroomResult res = mCpuHeadroomCache.get(halParams); - if (res != null) return res; - } + synchronized (mCpuHeadroomLock) { + final CpuHeadroomResult res = mCpuHeadroomCache.get(halParams); + if (res != null) return res; } final boolean shouldCheckUserModeCpuTime = mEnforceCpuHeadroomUserModeCpuTimeCheck @@ -1622,11 +1619,8 @@ public final class HintManagerService extends SystemService { Slog.wtf(TAG, "CPU headroom from Power HAL is invalid"); return null; } - if (halParams.calculationWindowMillis - == mDefaultCpuHeadroomCalculationWindowMillis) { - synchronized (mCpuHeadroomLock) { - mCpuHeadroomCache.add(halParams, result); - } + synchronized (mCpuHeadroomLock) { + mCpuHeadroomCache.add(halParams, result); } if (shouldCheckUserModeCpuTime) { synchronized (mCpuHeadroomLock) { @@ -1737,12 +1731,9 @@ public final class HintManagerService extends SystemService { final GpuHeadroomParams halParams = new GpuHeadroomParams(); halParams.calculationType = params.calculationType; halParams.calculationWindowMillis = params.calculationWindowMillis; - if (halParams.calculationWindowMillis - == mDefaultGpuHeadroomCalculationWindowMillis) { - synchronized (mGpuHeadroomLock) { - final GpuHeadroomResult res = mGpuHeadroomCache.get(halParams); - if (res != null) return res; - } + synchronized (mGpuHeadroomLock) { + final GpuHeadroomResult res = mGpuHeadroomCache.get(halParams); + if (res != null) return res; } // return from HAL directly try { @@ -1751,11 +1742,8 @@ public final class HintManagerService extends SystemService { Slog.wtf(TAG, "GPU headroom from Power HAL is invalid"); return null; } - if (halParams.calculationWindowMillis - == mDefaultGpuHeadroomCalculationWindowMillis) { - synchronized (mGpuHeadroomLock) { - mGpuHeadroomCache.add(halParams, headroom); - } + synchronized (mGpuHeadroomLock) { + mGpuHeadroomCache.add(halParams, headroom); } return headroom; } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index b71256d27a14..e4ad56fdc074 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -225,6 +225,7 @@ import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_F import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE; import static com.android.server.wm.ActivityTaskManagerService.getInputDispatchingTimeoutMillisLocked; +import static com.android.server.wm.ActivityTaskManagerService.isPip2ExperimentEnabled; import static com.android.server.wm.IdentifierProto.HASH_CODE; import static com.android.server.wm.IdentifierProto.TITLE; import static com.android.server.wm.IdentifierProto.USER_ID; @@ -1495,7 +1496,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // precede the configuration change from the resize.) mLastReportedPictureInPictureMode = inPictureInPictureMode; mLastReportedMultiWindowMode = inPictureInPictureMode; - ensureActivityConfiguration(true /* ignoreVisibility */); + if (!isPip2ExperimentEnabled()) { + // PiP2 should handle sending out the configuration as a part of Shell Transitions. + ensureActivityConfiguration(true /* ignoreVisibility */); + } if (inPictureInPictureMode && findMainWindow() == null && task.topRunningActivity() == this) { // Prevent malicious app entering PiP without valid WindowState, which can in turn diff --git a/services/core/java/com/android/server/wm/ActivitySnapshotController.java b/services/core/java/com/android/server/wm/ActivitySnapshotController.java index cfd324830db5..26b7cc67876e 100644 --- a/services/core/java/com/android/server/wm/ActivitySnapshotController.java +++ b/services/core/java/com/android/server/wm/ActivitySnapshotController.java @@ -34,6 +34,7 @@ import android.window.TaskSnapshot; import com.android.internal.annotations.VisibleForTesting; import com.android.server.wm.BaseAppSnapshotPersister.PersistInfoProvider; +import com.android.window.flags.Flags; import java.io.File; import java.io.PrintWriter; @@ -498,50 +499,73 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord } final TaskFragment currTF = currentActivity.getTaskFragment(); final TaskFragment prevTF = initPrev.getTaskFragment(); - final TaskFragment prevAdjacentTF = prevTF != null - ? prevTF.getAdjacentTaskFragment() : null; - if (currTF == prevTF && currTF != null || prevAdjacentTF == null) { - // Current activity and previous one is in the same task fragment, or - // previous activity is not in a task fragment, or - // previous activity's task fragment doesn't adjacent to any others. + if (currTF == prevTF || prevTF.asTask() != null || !prevTF.hasAdjacentTaskFragment()) { + // Current activity and the initPrev is in the same TaskFragment, + // or initPrev activity is a direct child of Task, + // or initPrev activity doesn't have an adjacent. + // A + // B if (!inTransition || isInParticipant(initPrev, mTmpTransitionParticipants)) { result.add(initPrev); } return; } - if (prevAdjacentTF == currTF) { + if (currTF.isAdjacentTo(prevTF)) { // previous activity A is adjacent to current activity B. // Try to find anyone below previous activityA, which are C and D if exists. // A | B // C (| D) getActivityBelow(initPrev, inTransition, result); - } else { - // previous activity C isn't adjacent to current activity A. - // A - // B | C - final Task prevAdjacentTask = prevAdjacentTF.getTask(); - if (prevAdjacentTask == currentTask) { - final int currentIndex = currTF != null - ? currentTask.mChildren.indexOf(currTF) - : currentTask.mChildren.indexOf(currentActivity); - final int prevAdjacentIndex = - prevAdjacentTask.mChildren.indexOf(prevAdjacentTF); - // prevAdjacentTF already above currentActivity - if (prevAdjacentIndex > currentIndex) { - return; - } + return; + } + + // The initPrev activity has an adjacent that is different from current activity. + // A + // B | C + final int currentIndex = currTF.asTask() != null + ? currentTask.mChildren.indexOf(currentActivity) + : currentTask.mChildren.indexOf(currTF); + if (!Flags.allowMultipleAdjacentTaskFragments()) { + final int prevAdjacentIndex = currentTask.mChildren.indexOf( + prevTF.getAdjacentTaskFragment()); + if (prevAdjacentIndex > currentIndex) { + // PrevAdjacentTF already above currentActivity + return; } + // Add both the one below, and its adjacent. if (!inTransition || isInParticipant(initPrev, mTmpTransitionParticipants)) { result.add(initPrev); } - // prevAdjacentTF is adjacent to another one - final ActivityRecord prevAdjacentActivity = prevAdjacentTF.getTopMostActivity(); + final ActivityRecord prevAdjacentActivity = prevTF.getAdjacentTaskFragment() + .getTopMostActivity(); if (prevAdjacentActivity != null && (!inTransition || isInParticipant(prevAdjacentActivity, mTmpTransitionParticipants))) { result.add(prevAdjacentActivity); } + return; } + + final boolean hasAdjacentAboveCurrent = prevTF.forOtherAdjacentTaskFragments( + prevAdjacentTF -> { + final int prevAdjacentIndex = currentTask.mChildren.indexOf(prevAdjacentTF); + return prevAdjacentIndex > currentIndex; + }); + if (hasAdjacentAboveCurrent) { + // PrevAdjacentTF already above currentActivity + return; + } + // Add all adjacent top. + if (!inTransition || isInParticipant(initPrev, mTmpTransitionParticipants)) { + result.add(initPrev); + } + prevTF.forOtherAdjacentTaskFragments(prevAdjacentTF -> { + final ActivityRecord prevAdjacentActivity = prevAdjacentTF.getTopMostActivity(); + if (prevAdjacentActivity != null && (!inTransition + || isInParticipant(prevAdjacentActivity, mTmpTransitionParticipants))) { + result.add(prevAdjacentActivity); + } + }); } static boolean isInParticipant(ActivityRecord ar, diff --git a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java index 6709e3a72db0..a318c4bf334f 100644 --- a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.Manifest.permission.MANAGE_ACTIVITY_TASKS; import static android.app.ActivityManager.INTENT_SENDER_ACTIVITY; import static android.app.ActivityOptions.ANIM_OPEN_CROSS_PROFILE_APPS; import static android.app.ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED; @@ -35,6 +36,7 @@ import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME; import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; @@ -510,6 +512,14 @@ class ActivityStartInterceptor { } if (mComponentSpecified) { + Slog.w(TAG, "Starting home with component specified, uid=" + mCallingUid); + if (mService.isCallerRecents(mCallingUid) + || ActivityTaskManagerService.checkPermission(MANAGE_ACTIVITY_TASKS, + mCallingPid, mCallingUid) == PERMISSION_GRANTED) { + // Allow home component specified from trusted callers. + return false; + } + final ComponentName homeComponent = mIntent.getComponent(); final Intent homeIntent = mService.getHomeIntent(); final ActivityInfo aInfo = mService.mRootWindowContainer.resolveHomeActivity( diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index bf57f56df7c2..ef6f92317b2c 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -77,7 +77,6 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_SUPERVISOR_TASK_MSG; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; -import static com.android.server.wm.ActivityTaskManagerService.isPip2ExperimentEnabled; import static com.android.server.wm.ClientLifecycleManager.shouldDispatchLaunchActivityItemIndependently; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; @@ -2526,16 +2525,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { void scheduleUpdatePictureInPictureModeIfNeeded(Task task, Rect targetRootTaskBounds) { task.forAllActivities(r -> { if (!r.attachedToProcess()) return; - if (!isPip2ExperimentEnabled()) mPipModeChangedActivities.add(r); - // If we are scheduling pip change, then remove this activity from multi-window - // change list as the processing of pip change will make sure multi-window changed - // message is processed in the right order relative to pip changed. + mPipModeChangedActivities.add(r); mMultiWindowModeChangedActivities.remove(r); }); mPipModeChangedTargetRootTaskBounds = targetRootTaskBounds; - if (!isPip2ExperimentEnabled() && !mHandler.hasMessages(REPORT_PIP_MODE_CHANGED_MSG)) { + if (!mHandler.hasMessages(REPORT_PIP_MODE_CHANGED_MSG)) { mHandler.sendEmptyMessage(REPORT_PIP_MODE_CHANGED_MSG); } } diff --git a/services/core/java/com/android/server/wm/BLASTSyncEngine.java b/services/core/java/com/android/server/wm/BLASTSyncEngine.java index 7deb6a8232be..dbe0faf942d9 100644 --- a/services/core/java/com/android/server/wm/BLASTSyncEngine.java +++ b/services/core/java/com/android/server/wm/BLASTSyncEngine.java @@ -270,6 +270,11 @@ class BLASTSyncEngine { () -> callback.onCommitted(new SurfaceControl.Transaction())); mHandler.postDelayed(callback, BLAST_TIMEOUT_DURATION); + if (mWm.mAnimator.mPendingState == WindowAnimator.PENDING_STATE_NEED_APPLY) { + // Applies pending transaction before onTransactionReady to ensure the order with + // sync transaction. This is unlikely to happen unless animator thread is slow. + mWm.mAnimator.applyPendingTransaction(); + } Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "onTransactionReady"); mListener.onTransactionReady(mSyncId, merged); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); @@ -353,6 +358,10 @@ class BLASTSyncEngine { + " for non-sync " + wc); wc.mSyncGroup = null; } + if (mWm.mAnimator.mPendingState == WindowAnimator.PENDING_STATE_HAS_CHANGES + && wc.mSyncState != WindowContainer.SYNC_STATE_NONE) { + mWm.mAnimator.mPendingState = WindowAnimator.PENDING_STATE_NEED_APPLY; + } if (mReady) { mWm.mWindowPlacerLocked.requestTraversal(); } diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index fc0df645a2db..819395ac60b8 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -453,7 +453,7 @@ class BackNavigationController { outPrevActivities.add(prevActivity); return true; } - if (currTF.getAdjacentTaskFragment() == null) { + if (!currTF.hasAdjacentTaskFragment()) { final TaskFragment nextTF = findNextTaskFragment(currentTask, currTF); if (isSecondCompanionToFirst(currTF, nextTF)) { // TF is isStacked, search bottom activity from companion TF. @@ -476,7 +476,21 @@ class BackNavigationController { } } else { // If adjacent TF has companion to current TF, those two TF will be closed together. - final TaskFragment adjacentTF = currTF.getAdjacentTaskFragment(); + final TaskFragment adjacentTF; + if (Flags.allowMultipleAdjacentTaskFragments()) { + if (currTF.getAdjacentTaskFragments().size() > 2) { + throw new IllegalStateException( + "Not yet support 3+ adjacent for non-Task TFs"); + } + final TaskFragment[] tmpAdjacent = new TaskFragment[1]; + currTF.forOtherAdjacentTaskFragments(tf -> { + tmpAdjacent[0] = tf; + return true; + }); + adjacentTF = tmpAdjacent[0]; + } else { + adjacentTF = currTF.getAdjacentTaskFragment(); + } if (isSecondCompanionToFirst(currTF, adjacentTF)) { // The two TFs are adjacent (visually displayed side-by-side), search if any // activity below the lowest one. @@ -533,29 +547,47 @@ class BackNavigationController { return; } - final TaskFragment prevTFAdjacent = prevTF.getAdjacentTaskFragment(); - if (prevTFAdjacent == null || prevTFAdjacent.asTask() != null) { + if (!prevTF.hasAdjacentTaskFragment()) { return; } - final ActivityRecord prevActivityAdjacent = - prevTFAdjacent.getTopNonFinishingActivity(); - if (prevActivityAdjacent != null) { - outPrevActivities.add(prevActivityAdjacent); + if (!Flags.allowMultipleAdjacentTaskFragments()) { + final TaskFragment prevTFAdjacent = prevTF.getAdjacentTaskFragment(); + final ActivityRecord prevActivityAdjacent = + prevTFAdjacent.getTopNonFinishingActivity(); + if (prevActivityAdjacent != null) { + outPrevActivities.add(prevActivityAdjacent); + } + return; } + prevTF.forOtherAdjacentTaskFragments(prevTFAdjacent -> { + final ActivityRecord prevActivityAdjacent = + prevTFAdjacent.getTopNonFinishingActivity(); + if (prevActivityAdjacent != null) { + outPrevActivities.add(prevActivityAdjacent); + } + }); } private static void findAdjacentActivityIfExist(@NonNull ActivityRecord mainActivity, @NonNull ArrayList<ActivityRecord> outList) { final TaskFragment mainTF = mainActivity.getTaskFragment(); - if (mainTF == null || mainTF.getAdjacentTaskFragment() == null) { + if (mainTF == null || !mainTF.hasAdjacentTaskFragment()) { return; } - final TaskFragment adjacentTF = mainTF.getAdjacentTaskFragment(); - final ActivityRecord topActivity = adjacentTF.getTopNonFinishingActivity(); - if (topActivity == null) { + if (!Flags.allowMultipleAdjacentTaskFragments()) { + final TaskFragment adjacentTF = mainTF.getAdjacentTaskFragment(); + final ActivityRecord topActivity = adjacentTF.getTopNonFinishingActivity(); + if (topActivity != null) { + outList.add(topActivity); + } return; } - outList.add(topActivity); + mainTF.forOtherAdjacentTaskFragments(adjacentTF -> { + final ActivityRecord topActivity = adjacentTF.getTopNonFinishingActivity(); + if (topActivity != null) { + outList.add(topActivity); + } + }); } private static boolean hasTranslucentActivity(@NonNull ActivityRecord currentActivity, diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java index f9a06e2dd04b..4c2d8492197c 100644 --- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java +++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java @@ -50,6 +50,7 @@ import static com.android.window.flags.Flags.balImprovedMetrics; import static com.android.window.flags.Flags.balRequireOptInByPendingIntentCreator; import static com.android.window.flags.Flags.balShowToastsBlocked; import static com.android.window.flags.Flags.balStrictModeRo; +import static com.android.window.flags.Flags.balStrictModeGracePeriod; import static java.lang.annotation.RetentionPolicy.SOURCE; import static java.util.Objects.requireNonNull; @@ -90,6 +91,7 @@ import com.android.internal.util.Preconditions; import com.android.server.UiThread; import com.android.server.am.PendingIntentRecord; import com.android.server.wm.BackgroundLaunchProcessController.BalCheckConfiguration; +import com.android.window.flags.Flags; import java.lang.annotation.Retention; import java.util.ArrayList; @@ -515,7 +517,9 @@ public class BackgroundActivityStartController { return !callerExplicitOptOut(); } return mCheckedOptions.getPendingIntentCreatorBackgroundActivityStartMode() - == MODE_BACKGROUND_ACTIVITY_START_ALLOWED; + != MODE_BACKGROUND_ACTIVITY_START_DENIED + && mCheckedOptions.getPendingIntentCreatorBackgroundActivityStartMode() + != MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; } public boolean realCallerExplicitOptInOrAutoOptIn() { @@ -523,7 +527,9 @@ public class BackgroundActivityStartController { return !realCallerExplicitOptOut(); } return mCheckedOptions.getPendingIntentBackgroundActivityStartMode() - == MODE_BACKGROUND_ACTIVITY_START_ALLOWED; + != MODE_BACKGROUND_ACTIVITY_START_DENIED + && mCheckedOptions.getPendingIntentBackgroundActivityStartMode() + != MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; } public boolean callerExplicitOptOut() { @@ -1650,18 +1656,27 @@ public class BackgroundActivityStartController { return bas; } - TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment(); - if (adjacentTaskFragment == null) { + if (!taskFragment.hasAdjacentTaskFragment()) { return bas; } - // Check the second fragment. - topActivity = adjacentTaskFragment.getActivity(topOfStackPredicate); - if (topActivity == null) { - return bas; + // Check the adjacent fragment. + if (!Flags.allowMultipleAdjacentTaskFragments()) { + TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment(); + topActivity = adjacentTaskFragment.getActivity(topOfStackPredicate); + if (topActivity == null) { + return bas; + } + return checkCrossUidActivitySwitchFromBelow(topActivity, uid, bas); } - - return checkCrossUidActivitySwitchFromBelow(topActivity, uid, bas); + final BlockActivityStart[] out = { bas }; + taskFragment.forOtherAdjacentTaskFragments(adjacentTaskFragment -> { + final ActivityRecord top = adjacentTaskFragment.getActivity(topOfStackPredicate); + if (top != null) { + out[0] = checkCrossUidActivitySwitchFromBelow(top, uid, out[0]); + } + }); + return out[0]; } /** @@ -1898,7 +1913,14 @@ public class BackgroundActivityStartController { (state.mOriginatingPendingIntent != null)); } - logIfOnlyAllowedBy(finalVerdict, state, BAL_ALLOW_GRACE_PERIOD); + if (logIfOnlyAllowedBy(finalVerdict, state, BAL_ALLOW_GRACE_PERIOD)) { + if (balStrictModeRo() && balStrictModeGracePeriod()) { + String abortDebugMessage = "Activity start is only allowed by grace period. " + + "This may stop working in the future. " + + "intent: " + state.mIntent; + strictModeLaunchAborted(state.mRealCallingUid, abortDebugMessage); + } + } logIfOnlyAllowedBy(finalVerdict, state, BAL_ALLOW_NON_APP_VISIBLE_WINDOW); if (balImprovedMetrics()) { @@ -1942,24 +1964,29 @@ public class BackgroundActivityStartController { * Logs details about the activity starts if the only reason it is allowed is the provided * {@code balCode}. */ - private static void logIfOnlyAllowedBy(BalVerdict finalVerdict, BalState state, int balCode) { + private static boolean logIfOnlyAllowedBy(BalVerdict finalVerdict, BalState state, + int balCode) { if (finalVerdict.getRawCode() == balCode) { if (state.realCallerExplicitOptInOrAutoOptIn() && state.mResultForRealCaller != null && state.mResultForRealCaller.allows() && state.mResultForRealCaller.getRawCode() != balCode) { // real caller could allow with a different exemption + return false; } else if (state.callerExplicitOptInOrAutoOptIn() && state.mResultForCaller != null && state.mResultForCaller.allows() && state.mResultForCaller.getRawCode() != balCode) { // caller could allow with a different exemption + return false; } else { // log to determine grace period length distribution Slog.wtf(TAG, "Activity start ONLY allowed by " + balCodeToString(balCode) + " " + finalVerdict.mMessage + ": " + state); + return true; } } + return false; } @VisibleForTesting diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 5c3fbdfcff0e..5fe1cebccd2e 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -100,6 +100,7 @@ import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER; import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS; import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN; +import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; @@ -2912,6 +2913,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // contains another opaque activity. if (mFixedRotationLaunchingApp != null && mFixedRotationLaunchingApp.isVisible() && !mTransitionController.isCollecting() + && !mTransitionController.isPlayingTarget(mFixedRotationLaunchingApp) && !mAtmService.mBackNavigationController.isMonitoringFinishTransition()) { final Transition finishTransition = mTransitionController.mFinishingTransition; if (finishTransition == null || !finishTransition.mParticipants.contains( @@ -3288,6 +3290,32 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return new Point(w, h); } + void onDisplayInfoChangeApplied() { + if (!enableDisplayContentModeManagement()) { + Slog.e(TAG, "ShouldShowSystemDecors shouldn't be updated when the flag is off."); + } + + final boolean shouldShow; + if (isDefaultDisplay) { + shouldShow = true; + } else if (isPrivate()) { + shouldShow = false; + } else { + shouldShow = mDisplay.canHostTasks(); + } + + if (shouldShow == mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(this)) { + return; + } + mWmService.mDisplayWindowSettings.setShouldShowSystemDecorsLocked(this, shouldShow); + + if (shouldShow) { + mRootWindowContainer.startSystemDecorations(this, "onDisplayInfoChangeApplied"); + } else { + clearAllTasksOnDisplay(null); + } + } + DisplayCutout loadDisplayCutout(int displayWidth, int displayHeight) { if (mDisplayPolicy == null || mInitialDisplayCutout == null) { return null; @@ -6522,10 +6550,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mRemoving; } - void remove() { - mRemoving = true; + private void clearAllTasksOnDisplay(@Nullable Runnable clearTasksCallback) { Task lastReparentedRootTask; - mRootWindowContainer.mTaskSupervisor.beginDeferResume(); try { lastReparentedRootTask = reduceOnAllTaskDisplayAreas((taskDisplayArea, rootTask) -> { @@ -6538,10 +6564,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } finally { mRootWindowContainer.mTaskSupervisor.endDeferResume(); } - mRemoved = true; - if (mContentRecorder != null) { - mContentRecorder.stopRecording(); + if (clearTasksCallback != null) { + clearTasksCallback.run(); } // Only update focus/visibility for the last one because there may be many root tasks are @@ -6549,6 +6574,19 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (lastReparentedRootTask != null) { lastReparentedRootTask.resumeNextFocusAfterReparent(); } + } + + void remove() { + mRemoving = true; + + clearAllTasksOnDisplay(() -> { + mRemoved = true; + + if (mContentRecorder != null) { + mContentRecorder.stopRecording(); + } + }); + releaseSelfIfNeeded(); mDisplayPolicy.release(); diff --git a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java index 63af5c60b8d3..a017a1173d97 100644 --- a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java +++ b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java @@ -23,6 +23,8 @@ import static com.android.server.wm.Task.TAG_VISIBILITY; import android.annotation.Nullable; import android.util.Slog; +import com.android.window.flags.Flags; + import java.util.ArrayList; /** Helper class to ensure activities are in the right visible state for a container. */ @@ -110,21 +112,37 @@ class EnsureActivitiesVisibleHelper { if (adjacentTaskFragments != null && adjacentTaskFragments.contains( childTaskFragment)) { - if (!childTaskFragment.isTranslucent(starting) - && !childTaskFragment.getAdjacentTaskFragment().isTranslucent( - starting)) { + final boolean isTranslucent; + if (Flags.allowMultipleAdjacentTaskFragments()) { + isTranslucent = childTaskFragment.isTranslucent(starting) + || childTaskFragment.forOtherAdjacentTaskFragments( + adjacentTaskFragment -> { + return adjacentTaskFragment.isTranslucent(starting); + }); + } else { + isTranslucent = childTaskFragment.isTranslucent(starting) + || childTaskFragment.getAdjacentTaskFragment() + .isTranslucent(starting); + } + if (!isTranslucent) { // Everything behind two adjacent TaskFragments are occluded. mBehindFullyOccludedContainer = true; } continue; } - final TaskFragment adjacentTaskFrag = childTaskFragment.getAdjacentTaskFragment(); - if (adjacentTaskFrag != null) { + if (childTaskFragment.hasAdjacentTaskFragment()) { if (adjacentTaskFragments == null) { adjacentTaskFragments = new ArrayList<>(); } - adjacentTaskFragments.add(adjacentTaskFrag); + if (Flags.allowMultipleAdjacentTaskFragments()) { + final ArrayList<TaskFragment> adjacentTfs = adjacentTaskFragments; + childTaskFragment.forOtherAdjacentTaskFragments(adjacentTf -> { + adjacentTfs.add(adjacentTf); + }); + } else { + adjacentTaskFragments.add(childTaskFragment.getAdjacentTaskFragment()); + } } } else if (child.asActivityRecord() != null) { setActivityVisibilityState(child.asActivityRecord(), starting, resumeTopActivity); diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index cba606cf2b0c..98ed6f76b2f9 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -101,7 +101,8 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider { // isLeashReadyForDispatching (used to dispatch the leash of the control) is // depending on mGivenInsetsReady. Therefore, triggering notifyControlChanged here // again, so that the control with leash can be eventually dispatched - if (!mGivenInsetsReady && isServerVisible() && !givenInsetsPending) { + if (!mGivenInsetsReady && isServerVisible() && !givenInsetsPending + && mControlTarget != null) { mGivenInsetsReady = true; ImeTracker.forLogging().onProgress(mStatsToken, ImeTracker.PHASE_WM_POST_LAYOUT_NOTIFY_CONTROLS_CHANGED); diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 7276007481ab..d1585d06ae40 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -384,7 +384,7 @@ class InsetsSourceProvider { } final boolean serverVisibleChanged = mServerVisible != isServerVisible; setServerVisible(isServerVisible); - if (mControl != null) { + if (mControl != null && mControlTarget != null) { final boolean positionChanged = updateInsetsControlPosition(windowState); if (!(positionChanged || mHasPendingPosition) // The insets hint would be updated while changing the position. Here updates it diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java index ce8518449230..9df65f60e8d7 100644 --- a/services/core/java/com/android/server/wm/InsetsStateController.java +++ b/services/core/java/com/android/server/wm/InsetsStateController.java @@ -371,7 +371,7 @@ class InsetsStateController { array.add(provider); } - void notifyControlChanged(InsetsControlTarget target, InsetsSourceProvider provider) { + void notifyControlChanged(@NonNull InsetsControlTarget target, InsetsSourceProvider provider) { addToPendingControlMaps(target, provider); notifyPendingInsetsControlChanged(); } diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java index 06049530da18..790858d2eec2 100644 --- a/services/core/java/com/android/server/wm/LockTaskController.java +++ b/services/core/java/com/android/server/wm/LockTaskController.java @@ -263,10 +263,9 @@ public class LockTaskController { // should be finish together in the Task. if (activity != taskRoot || activity != taskTop) { final TaskFragment taskFragment = activity.getTaskFragment(); - final TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment(); if (taskFragment.asTask() != null || !taskFragment.isDelayLastActivityRemoval() - || adjacentTaskFragment == null) { + || !taskFragment.hasAdjacentTaskFragment()) { // Don't block activity from finishing if the TaskFragment don't have any adjacent // TaskFragment, or it won't finish together with its adjacent TaskFragment. return false; @@ -281,7 +280,7 @@ public class LockTaskController { } final boolean hasOtherActivityInTask = task.getActivity(a -> !a.finishing - && a != activity && a.getTaskFragment() != adjacentTaskFragment) != null; + && a != activity && !taskFragment.isAdjacentTo(a.getTaskFragment())) != null; if (hasOtherActivityInTask) { // Do not block activity from finishing if there are another running activities // after the current and adjacent TaskFragments are removed. Note that we don't @@ -653,6 +652,10 @@ public class LockTaskController { if (!isSystemCaller) { task.mLockTaskUid = callingUid; if (task.mLockTaskAuth == LOCK_TASK_AUTH_PINNABLE) { + if (mLockTaskModeTasks.contains(task)) { + ProtoLog.w(WM_DEBUG_LOCKTASK, "Already locked."); + return; + } // startLockTask() called by app, but app is not part of lock task allowlist. Show // app pinning request. We will come back here with isSystemCaller true. ProtoLog.w(WM_DEBUG_LOCKTASK, "Mode default, asking user"); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 4f36476c674f..57fe0bb4937e 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -46,6 +46,7 @@ import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER; import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_SURFACE_ALLOC; +import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.server.policy.PhoneWindowManager.SYSTEM_DIALOG_REASON_ASSIST; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; @@ -151,6 +152,7 @@ import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService; import com.android.server.am.AppTimeTracker; import com.android.server.am.UserState; +import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.pm.UserManagerInternal; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.WindowManagerPolicy; @@ -1438,6 +1440,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> : getDefaultTaskDisplayArea(); } + // When display content mode management flag is enabled, the task display area is marked as + // removed when switching from extended display to mirroring display. We need to restart the + // task display area before starting the home. + if (enableDisplayContentModeManagement() && taskDisplayArea.isRemoved()) { + taskDisplayArea.restart(); + } + Intent homeIntent = null; ActivityInfo aInfo = null; if (taskDisplayArea == getDefaultTaskDisplayArea() @@ -2856,20 +2865,24 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (display == null) { return; } - // Do not start home before booting, or it may accidentally finish booting before it - // starts. Instead, we expect home activities to be launched when the system is ready - // (ActivityManagerService#systemReady). - if (mService.isBooted() || mService.isBooting()) { - startSystemDecorations(display); - } + + startSystemDecorations(display, "displayAdded"); + // Drop any cached DisplayInfos associated with this display id - the values are now // out of date given this display added event. mWmService.mPossibleDisplayInfoMapper.removePossibleDisplayInfos(displayId); } } - private void startSystemDecorations(final DisplayContent displayContent) { - startHomeOnDisplay(mCurrentUser, "displayAdded", displayContent.getDisplayId()); + void startSystemDecorations(final DisplayContent displayContent, String reason) { + // Do not start home before booting, or it may accidentally finish booting before it + // starts. Instead, we expect home activities to be launched when the system is ready + // (ActivityManagerService#systemReady). + if (!mService.isBooted() && !mService.isBooting()) { + return; + } + + startHomeOnDisplay(mCurrentUser, reason, displayContent.getDisplayId()); displayContent.getDisplayPolicy().notifyDisplayReady(); } @@ -2896,7 +2909,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> synchronized (mService.mGlobalLock) { final DisplayContent displayContent = getDisplayContent(displayId); if (displayContent != null) { - displayContent.requestDisplayUpdate(() -> clearDisplayInfoCaches(displayId)); + displayContent.requestDisplayUpdate( + () -> { + clearDisplayInfoCaches(displayId); + if (enableDisplayContentModeManagement()) { + displayContent.onDisplayInfoChangeApplied(); + } + }); } else { clearDisplayInfoCaches(displayId); } diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index 9a48d5b8880d..d7b6d96c781d 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -200,6 +200,7 @@ public class SurfaceAnimator { } mSnapshot.startAnimation(t, snapshotAnim, type); } + setAnimatorPendingState(t); } void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden, @@ -208,6 +209,14 @@ public class SurfaceAnimator { null /* animationCancelledCallback */, null /* snapshotAnim */, null /* freezer */); } + /** Indicates that there are surface operations in the pending transaction. */ + private void setAnimatorPendingState(Transaction t) { + if (mService.mAnimator.mPendingState == WindowAnimator.PENDING_STATE_NONE + && t == mAnimatable.getPendingTransaction()) { + mService.mAnimator.mPendingState = WindowAnimator.PENDING_STATE_HAS_CHANGES; + } + } + /** Returns whether it is currently running an animation. */ boolean isAnimating() { return mAnimation != null; @@ -357,6 +366,7 @@ public class SurfaceAnimator { final boolean scheduleAnim = removeLeash(t, mAnimatable, leash, destroyLeash); mAnimationFinished = false; if (scheduleAnim) { + setAnimatorPendingState(t); mService.scheduleAnimationLocked(); } } diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 3d0b41ba3a0f..3634bc987d0a 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1887,6 +1887,11 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { return lastReparentedRootTask; } + // TODO(b/385263090): Remove this method + void restart() { + mRemoved = false; + } + /** * Returns the {@link TaskDisplayArea} to which root tasks should be reparented. * diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index cb6b69072e14..367adc355738 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -518,11 +518,14 @@ class TaskFragment extends WindowContainer<WindowContainer> { } } - // TODO(b/373709676): update usages. /** @deprecated b/373709676 replace with {@link #getAdjacentTaskFragments()}. */ @Deprecated @Nullable TaskFragment getAdjacentTaskFragment() { + if (Flags.allowMultipleAdjacentTaskFragments()) { + throw new IllegalStateException("allowMultipleAdjacentTaskFragments is enabled. " + + "Use #getAdjacentTaskFragments instead"); + } return mAdjacentTaskFragment; } @@ -3523,10 +3526,18 @@ class TaskFragment extends WindowContainer<WindowContainer> { throw new IllegalStateException("allowMultipleAdjacentTaskFragments must be" + " enabled to set more than two TaskFragments adjacent to each other."); } - if (taskFragments.size() < 2) { + final int size = taskFragments.size(); + if (size < 2) { throw new IllegalArgumentException("Adjacent TaskFragments must contain at least" - + " two TaskFragments, but only " + taskFragments.size() - + " were provided."); + + " two TaskFragments, but only " + size + " were provided."); + } + if (size > 2) { + for (int i = 0; i < size; i++) { + if (taskFragments.valueAt(i).asTask() == null) { + throw new IllegalArgumentException( + "Not yet support 3+ adjacent for non-Task TFs"); + } + } } mAdjacentSet = taskFragments; } @@ -3604,6 +3615,10 @@ class TaskFragment extends WindowContainer<WindowContainer> { return false; } + int size() { + return mAdjacentSet.size(); + } + @Override public boolean equals(@Nullable Object o) { if (this == o) { diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 49c8559c02a8..790ae1eef0c3 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -26,6 +26,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; +import android.annotation.IntDef; import android.content.Context; import android.os.HandlerExecutor; import android.os.Trace; @@ -38,6 +39,8 @@ import com.android.internal.protolog.ProtoLog; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; /** @@ -86,6 +89,25 @@ public class WindowAnimator { private final SurfaceControl.Transaction mTransaction; + /** The pending transaction is applied. */ + static final int PENDING_STATE_NONE = 0; + /** There are some (significant) operations set to the pending transaction. */ + static final int PENDING_STATE_HAS_CHANGES = 1; + /** The pending transaction needs to be applied before sending sync transaction to shell. */ + static final int PENDING_STATE_NEED_APPLY = 2; + + @IntDef(prefix = { "PENDING_STATE_" }, value = { + PENDING_STATE_NONE, + PENDING_STATE_HAS_CHANGES, + PENDING_STATE_NEED_APPLY, + }) + @Retention(RetentionPolicy.SOURCE) + @interface PendingState {} + + /** The global state of pending transaction. */ + @PendingState + int mPendingState; + WindowAnimator(final WindowManagerService service) { mService = service; mContext = service.mContext; @@ -217,6 +239,7 @@ public class WindowAnimator { Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "applyTransaction"); mTransaction.apply(); Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); + mPendingState = PENDING_STATE_NONE; mService.mWindowTracing.logState("WindowAnimator"); ProtoLog.i(WM_SHOW_TRANSACTIONS, "<<< CLOSE TRANSACTION animate"); @@ -296,8 +319,19 @@ public class WindowAnimator { return mAnimationFrameCallbackScheduled; } - Choreographer getChoreographer() { - return mChoreographer; + void applyPendingTransaction() { + Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "applyPendingTransaction"); + mPendingState = PENDING_STATE_NONE; + final int numDisplays = mService.mRoot.getChildCount(); + if (numDisplays == 1) { + mService.mRoot.getChildAt(0).getPendingTransaction().apply(); + } else { + for (int i = 0; i < numDisplays; i++) { + mTransaction.merge(mService.mRoot.getChildAt(i).getPendingTransaction()); + } + mTransaction.apply(); + } + Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); } /** diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 793f18992109..965b22473a2c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -9150,7 +9150,7 @@ public class WindowManagerService extends IWindowManager.Stub // handling the touch-outside event to prevent focus rapid changes back-n-forth. final boolean shouldDelayTouchForEmbeddedActivity = activity != null && activity.isEmbedded() - && activity.getTaskFragment().getAdjacentTaskFragment() != null; + && activity.getTaskFragment().hasAdjacentTaskFragment(); // For cases when there are multiple freeform windows where non-top windows are blocking // the gesture zones, delay handling the touch-outside event to prevent refocusing the @@ -9529,21 +9529,41 @@ public class WindowManagerService extends IWindowManager.Stub return focusedActivity; } - final TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment(); - final ActivityRecord adjacentTopActivity = - adjacentTaskFragment != null ? adjacentTaskFragment.topRunningActivity() : null; - if (adjacentTopActivity == null) { - // Return if no adjacent activity. + if (!taskFragment.hasAdjacentTaskFragment()) { return focusedActivity; } - if (adjacentTopActivity.getLastWindowCreateTime() - < focusedActivity.getLastWindowCreateTime()) { - // Return if the current focus activity has more recently active window. - return focusedActivity; + if (!Flags.allowMultipleAdjacentTaskFragments()) { + final TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment(); + final ActivityRecord adjacentTopActivity = adjacentTaskFragment.topRunningActivity(); + if (adjacentTopActivity == null) { + // Return if no adjacent activity. + return focusedActivity; + } + + if (adjacentTopActivity.getLastWindowCreateTime() + < focusedActivity.getLastWindowCreateTime()) { + // Return if the current focus activity has more recently active window. + return focusedActivity; + } + + return adjacentTopActivity; } - return adjacentTopActivity; + // Find the adjacent activity with more recently active window. + final ActivityRecord[] mostRecentActiveActivity = { focusedActivity }; + final long[] mostRecentActiveTime = { focusedActivity.getLastWindowCreateTime() }; + taskFragment.forOtherAdjacentTaskFragments(adjacentTaskFragment -> { + final ActivityRecord adjacentTopActivity = adjacentTaskFragment.topRunningActivity(); + if (adjacentTopActivity != null) { + final long lastWindowCreateTime = adjacentTopActivity.getLastWindowCreateTime(); + if (lastWindowCreateTime > mostRecentActiveTime[0]) { + mostRecentActiveTime[0] = lastWindowCreateTime; + mostRecentActiveActivity[0] = adjacentTopActivity; + } + } + }); + return mostRecentActiveActivity[0]; } @NonNull @@ -9592,14 +9612,28 @@ public class WindowManagerService extends IWindowManager.Stub return false; } final TaskFragment fromFragment = fromWin.getTaskFragment(); - if (fromFragment == null) { + if (fromFragment == null || fromFragment.asTask() != null) { + // Don't move the focus to another task. return false; } - final TaskFragment adjacentFragment = fromFragment.getAdjacentTaskFragment(); - if (adjacentFragment == null || adjacentFragment.asTask() != null) { - // Don't move the focus to another task. + if (!fromFragment.hasAdjacentTaskFragment()) { + // No adjacent window. return false; } + final TaskFragment adjacentFragment; + if (Flags.allowMultipleAdjacentTaskFragments()) { + if (fromFragment.getAdjacentTaskFragments().size() > 2) { + throw new IllegalStateException("Not yet support 3+ adjacent for non-Task TFs"); + } + final TaskFragment[] tmpAdjacent = new TaskFragment[1]; + fromFragment.forOtherAdjacentTaskFragments(adjacentTF -> { + tmpAdjacent[0] = adjacentTF; + return true; + }); + adjacentFragment = tmpAdjacent[0]; + } else { + adjacentFragment = fromFragment.getAdjacentTaskFragment(); + } if (adjacentFragment.isIsolatedNav()) { // Don't move the focus if the adjacent TF is isolated navigation. return false; diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 813fec1454a7..f634beb77329 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -345,6 +345,7 @@ public: void setMouseReverseVerticalScrollingEnabled(bool enabled); void setMouseScrollingAccelerationEnabled(bool enabled); void setMouseSwapPrimaryButtonEnabled(bool enabled); + void setMouseAccelerationEnabled(bool enabled); void setTouchpadPointerSpeed(int32_t speed); void setTouchpadNaturalScrollingEnabled(bool enabled); void setTouchpadTapToClickEnabled(bool enabled); @@ -502,6 +503,9 @@ private: // True if the mouse primary button is swapped (left/right buttons). bool mouseSwapPrimaryButtonEnabled{false}; + // True if the mouse cursor will accelerate as the mouse moves faster. + bool mousePointerAccelerationEnabled{true}; + // The touchpad pointer speed, as a number from -7 (slowest) to 7 (fastest). int32_t touchpadPointerSpeed{0}; @@ -847,6 +851,7 @@ void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outCon outConfig->mouseReverseVerticalScrollingEnabled = mLocked.mouseReverseVerticalScrollingEnabled; outConfig->mouseSwapPrimaryButtonEnabled = mLocked.mouseSwapPrimaryButtonEnabled; + outConfig->mousePointerAccelerationEnabled = mLocked.mousePointerAccelerationEnabled; outConfig->touchpadPointerSpeed = mLocked.touchpadPointerSpeed; outConfig->touchpadNaturalScrollingEnabled = mLocked.touchpadNaturalScrollingEnabled; @@ -1458,6 +1463,21 @@ void NativeInputManager::setMouseSwapPrimaryButtonEnabled(bool enabled) { InputReaderConfiguration::Change::MOUSE_SETTINGS); } +void NativeInputManager::setMouseAccelerationEnabled(bool enabled) { + { // acquire lock + std::scoped_lock _l(mLock); + + if (mLocked.mousePointerAccelerationEnabled == enabled) { + return; + } + + mLocked.mousePointerAccelerationEnabled = enabled; + } // release lock + + mInputManager->getReader().requestRefreshConfiguration( + InputReaderConfiguration::Change::POINTER_SPEED); +} + void NativeInputManager::setPointerSpeed(int32_t speed) { { // acquire lock std::scoped_lock _l(mLock); @@ -3220,6 +3240,11 @@ static void nativeSetMouseSwapPrimaryButtonEnabled(JNIEnv* env, jobject nativeIm im->setMouseSwapPrimaryButtonEnabled(enabled); } +static void nativeSetMouseAccelerationEnabled(JNIEnv* env, jobject nativeImplObj, bool enabled) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + im->setMouseAccelerationEnabled(enabled); +} + static jboolean nativeSetKernelWakeEnabled(JNIEnv* env, jobject nativeImplObj, jint deviceId, jboolean enabled) { NativeInputManager* im = getNativeInputManager(env, nativeImplObj); @@ -3280,6 +3305,7 @@ static const JNINativeMethod gInputManagerMethods[] = { {"setMouseScrollingAccelerationEnabled", "(Z)V", (void*)nativeSetMouseScrollingAccelerationEnabled}, {"setMouseSwapPrimaryButtonEnabled", "(Z)V", (void*)nativeSetMouseSwapPrimaryButtonEnabled}, + {"setMouseAccelerationEnabled", "(Z)V", (void*)nativeSetMouseAccelerationEnabled}, {"setTouchpadPointerSpeed", "(I)V", (void*)nativeSetTouchpadPointerSpeed}, {"setTouchpadNaturalScrollingEnabled", "(Z)V", (void*)nativeSetTouchpadNaturalScrollingEnabled}, diff --git a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java index fc3ec7b44f4f..4d04c8b76fc7 100644 --- a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java +++ b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java @@ -37,6 +37,7 @@ import android.os.Process; import android.util.Log; import com.android.server.backup.BackupAgentTimeoutParameters; +import com.android.server.backup.BackupManagerConstants; import com.android.server.backup.BackupManagerService; import com.android.server.backup.TransportManager; import com.android.server.backup.UserBackupManagerService; @@ -162,10 +163,10 @@ public class BackupManagerServiceTestUtils { public static UserBackupManagerService.BackupWakeLock createBackupWakeLock( Application application) { - PowerManager powerManager = - (PowerManager) application.getSystemService(Context.POWER_SERVICE); + PowerManager powerManager = application.getSystemService(PowerManager.class); return new UserBackupManagerService.BackupWakeLock( - powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"), 0); + powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"), 0, + new BackupManagerConstants(Handler.getMain(), application.getContentResolver())); } /** diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java index 0ae7699aeb71..58e4b9177808 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java @@ -36,6 +36,7 @@ import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.content.Context; import android.content.Intent; +import android.os.Binder; import android.os.Handler; import android.os.Message; import android.os.UserHandle; @@ -233,6 +234,7 @@ public class BroadcastHelperTest { mBroadcastHelper.sendPackageChangedBroadcast(mMockSnapshot, PACKAGE_CHANGED_TEST_PACKAGE_NAME, true /* dontKillApp */, componentNames, - UserHandle.USER_SYSTEM, "test" /* reason */, "test" /* reasonForTrace */); + UserHandle.USER_SYSTEM, "test" /* reason */, "test" /* reasonForTrace */, + Binder.getCallingUid()); } } diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyCoordinatorTest.kt b/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyCoordinatorTest.kt index c65024f8f9d5..b09947aaf2ad 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyCoordinatorTest.kt +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayTopologyCoordinatorTest.kt @@ -17,7 +17,7 @@ package com.android.server.display import android.hardware.display.DisplayTopology -import android.util.DisplayMetrics +import android.hardware.display.DisplayTopology.pxToDp import android.view.Display import android.view.DisplayInfo import com.google.common.truth.Truth.assertThat @@ -62,10 +62,8 @@ class DisplayTopologyCoordinatorTest { fun addDisplay() { coordinator.onDisplayAdded(displayInfo) - val widthDp = displayInfo.logicalWidth * (DisplayMetrics.DENSITY_DEFAULT.toFloat() - / displayInfo.logicalDensityDpi) - val heightDp = displayInfo.logicalHeight * (DisplayMetrics.DENSITY_DEFAULT.toFloat() - / displayInfo.logicalDensityDpi) + val widthDp = pxToDp(displayInfo.logicalWidth.toFloat(), displayInfo.logicalDensityDpi) + val heightDp = pxToDp(displayInfo.logicalHeight.toFloat(), displayInfo.logicalDensityDpi) verify(mockTopology).addDisplay(displayInfo.displayId, widthDp, heightDp) verify(mockTopologyChangedCallback).invoke(mockTopologyCopy) } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java index ea80f283793e..db6aeebecce7 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java @@ -602,7 +602,7 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest { mQueue.dumpDebug(new ProtoOutputStream(), ActivityManagerServiceDumpBroadcastsProto.BROADCAST_QUEUE); mQueue.dumpLocked(FileDescriptor.err, new PrintWriter(Writer.nullWriter()), - null, 0, true, true, true, null, false); + null, 0, true, true, true, null, null, false); mQueue.dumpToDropBoxLocked(TAG); BroadcastQueue.logv(TAG); @@ -1019,7 +1019,7 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest { mQueue.dumpDebug(new ProtoOutputStream(), ActivityManagerServiceDumpBroadcastsProto.BROADCAST_QUEUE); mQueue.dumpLocked(FileDescriptor.err, new PrintWriter(Writer.nullWriter()), - null, 0, true, true, true, null, false); + null, 0, true, true, true, null, null, false); } waitForIdle(); diff --git a/services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java index 76f7e80a3412..0972ea91ea73 100644 --- a/services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java @@ -33,7 +33,6 @@ import android.content.Context; import android.os.Handler; import android.os.Looper; import android.os.Message; -import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.util.LongSparseArray; @@ -72,6 +71,7 @@ public class BlobStoreManagerServiceTest { private static final String TEST_PKG2 = "com.example2"; private static final String TEST_PKG3 = "com.example3"; + private static final int TEST_USER_ID = 0; private static final int TEST_UID1 = 10001; private static final int TEST_UID2 = 10002; private static final int TEST_UID3 = 10003; @@ -98,7 +98,7 @@ public class BlobStoreManagerServiceTest { mService = new BlobStoreManagerService(mContext, new TestInjector()); mUserSessions = new LongSparseArray<>(); - mService.addUserSessionsForTest(mUserSessions, UserHandle.myUserId()); + mService.addUserSessionsForTest(mUserSessions, TEST_USER_ID); } @After @@ -360,6 +360,7 @@ public class BlobStoreManagerServiceTest { return createBlobStoreSessionMock(ownerPackageName, ownerUid, sessionId, sessionFile, mock(BlobHandle.class)); } + private BlobStoreSession createBlobStoreSessionMock(String ownerPackageName, int ownerUid, long sessionId, File sessionFile, BlobHandle blobHandle) { final BlobStoreSession session = mock(BlobStoreSession.class); diff --git a/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java index bd15bd058fcc..cd94c0f6e245 100644 --- a/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java +++ b/services/tests/performancehinttests/src/com/android/server/power/hint/HintManagerServiceTest.java @@ -1411,7 +1411,6 @@ public class HintManagerServiceTest { halParams3.tids = tids; halParams3.calculationType = CpuHeadroomParams.CalculationType.AVERAGE; - // this params should not be cached as the window is not default CpuHeadroomParamsInternal params4 = new CpuHeadroomParamsInternal(); params4.calculationWindowMillis = 123; CpuHeadroomParams halParams4 = new CpuHeadroomParams(); @@ -1450,11 +1449,7 @@ public class HintManagerServiceTest { assertEquals(halRet2, service.getBinderServiceInstance().getCpuHeadroom(params2)); assertEquals(halRet3, service.getBinderServiceInstance().getCpuHeadroom(params3)); assertEquals(halRet4, service.getBinderServiceInstance().getCpuHeadroom(params4)); - verify(mIPowerMock, times(1)).getCpuHeadroom(any()); - verify(mIPowerMock, times(0)).getCpuHeadroom(eq(halParams1)); - verify(mIPowerMock, times(0)).getCpuHeadroom(eq(halParams2)); - verify(mIPowerMock, times(0)).getCpuHeadroom(eq(halParams3)); - verify(mIPowerMock, times(1)).getCpuHeadroom(eq(halParams4)); + verify(mIPowerMock, times(0)).getCpuHeadroom(any()); // after 500ms more it should be served with cache Thread.sleep(500); @@ -1463,11 +1458,7 @@ public class HintManagerServiceTest { assertEquals(halRet2, service.getBinderServiceInstance().getCpuHeadroom(params2)); assertEquals(halRet3, service.getBinderServiceInstance().getCpuHeadroom(params3)); assertEquals(halRet4, service.getBinderServiceInstance().getCpuHeadroom(params4)); - verify(mIPowerMock, times(1)).getCpuHeadroom(any()); - verify(mIPowerMock, times(0)).getCpuHeadroom(eq(halParams1)); - verify(mIPowerMock, times(0)).getCpuHeadroom(eq(halParams2)); - verify(mIPowerMock, times(0)).getCpuHeadroom(eq(halParams3)); - verify(mIPowerMock, times(1)).getCpuHeadroom(eq(halParams4)); + verify(mIPowerMock, times(0)).getCpuHeadroom(any()); // after 1+ seconds it should be served from HAL as it exceeds 1000 millis interval Thread.sleep(600); @@ -1574,18 +1565,14 @@ public class HintManagerServiceTest { clearInvocations(mIPowerMock); assertEquals(halRet1, service.getBinderServiceInstance().getGpuHeadroom(params1)); assertEquals(halRet2, service.getBinderServiceInstance().getGpuHeadroom(params2)); - verify(mIPowerMock, times(1)).getGpuHeadroom(any()); - verify(mIPowerMock, times(0)).getGpuHeadroom(eq(halParams1)); - verify(mIPowerMock, times(1)).getGpuHeadroom(eq(halParams2)); + verify(mIPowerMock, times(0)).getGpuHeadroom(any()); // after 500ms it should be served with cache Thread.sleep(500); clearInvocations(mIPowerMock); assertEquals(halRet1, service.getBinderServiceInstance().getGpuHeadroom(params1)); assertEquals(halRet2, service.getBinderServiceInstance().getGpuHeadroom(params2)); - verify(mIPowerMock, times(1)).getGpuHeadroom(any()); - verify(mIPowerMock, times(0)).getGpuHeadroom(eq(halParams1)); - verify(mIPowerMock, times(1)).getGpuHeadroom(eq(halParams2)); + verify(mIPowerMock, times(0)).getGpuHeadroom(any()); // after 1+ seconds it should be served from HAL as it exceeds 1000 millis interval Thread.sleep(600); diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index 0b2a2cdd26b9..4e030d499c25 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -2045,18 +2045,6 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { return p == null ? null : p.getAllShareTargetsForTest(); } - protected void resetPersistedShortcuts() { - final ShortcutPackage p = mService.getPackageShortcutForTest( - getCallingPackage(), getCallingUserId()); - p.removeAllShortcutsAsync(); - } - - protected void getPersistedShortcut(AndroidFuture<List<ShortcutInfo>> cb) { - final ShortcutPackage p = mService.getPackageShortcutForTest( - getCallingPackage(), getCallingUserId()); - p.getTopShortcutsFromPersistence(cb); - } - /** * @return the number of shortcuts stored internally for the caller that can be used as a share * target in the ShareSheet. Such shortcuts have a matching category with at least one of the diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java deleted file mode 100644 index 10e8bf039627..000000000000 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.server.pm; - -import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list; - -import android.app.PendingIntent; -import android.content.pm.ShortcutInfo; -import android.os.RemoteException; -import android.os.SystemClock; -import android.os.UserHandle; - -import com.android.internal.infra.AndroidFuture; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * Tests for {@link android.app.appsearch.AppSearchManager} and relevant APIs in ShortcutManager. - * - atest -c com.android.server.pm.ShortcutManagerTest12 - */ -public class ShortcutManagerTest12 extends BaseShortcutManagerTest { - - @Override - protected void setUp() throws Exception { - super.setUp(); - mService.updateConfigurationLocked( - ShortcutService.ConfigConstants.KEY_MAX_SHORTCUTS + "=5," - + ShortcutService.ConfigConstants.KEY_SAVE_DELAY_MILLIS + "=1"); - } - - @Override - protected void tearDown() throws Exception { - if (mService.isAppSearchEnabled()) { - setCaller(CALLING_PACKAGE_1, USER_10); - mService.getPackageShortcutForTest(CALLING_PACKAGE_1, USER_10) - .removeAllShortcutsAsync(); - } - super.tearDown(); - } - - public void testGetShortcutIntents_ReturnsMutablePendingIntents() throws RemoteException { - setDefaultLauncher(USER_10, LAUNCHER_1); - - runWithCaller(CALLING_PACKAGE_1, USER_10, () -> - assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1")))) - ); - - runWithCaller(LAUNCHER_1, USER_10, () -> { - final PendingIntent intent = mLauncherApps.getShortcutIntent( - CALLING_PACKAGE_1, "s1", null, UserHandle.SYSTEM); - assertNotNull(intent); - }); - } - - public void testSetDynamicShortcuts_PersistsShortcutsToDisk() throws RemoteException { - if (!mService.isAppSearchEnabled()) { - return; - } - setCaller(CALLING_PACKAGE_1, USER_10); - // Verifies setDynamicShortcuts persists shortcuts into AppSearch - mManager.setDynamicShortcuts(list( - makeShortcut("s1"), - makeShortcut("s2"), - makeShortcut("s3") - )); - List<ShortcutInfo> shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(3, shortcuts.size()); - Set<String> shortcutIds = - shortcuts.stream().map(ShortcutInfo::getId).collect(Collectors.toSet()); - assertTrue(shortcutIds.contains("s1")); - assertTrue(shortcutIds.contains("s2")); - assertTrue(shortcutIds.contains("s3")); - - // Verifies removeAllDynamicShortcuts removes shortcuts from persistence layer - mManager.removeAllDynamicShortcuts(); - shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertTrue(shortcuts.isEmpty()); - } - - public void testAddDynamicShortcuts_PersistsShortcutsToDisk() { - if (!mService.isAppSearchEnabled()) { - return; - } - setCaller(CALLING_PACKAGE_1, USER_10); - mManager.setDynamicShortcuts(list( - makeShortcut("s1"), - makeShortcut("s2"), - makeShortcut("s3") - )); - // Verifies addDynamicShortcuts persists shortcuts into AppSearch - mManager.addDynamicShortcuts(list(makeShortcut("s4"), makeShortcut("s5"))); - final List<ShortcutInfo> shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(5, shortcuts.size()); - final Set<String> shortcutIds = - shortcuts.stream().map(ShortcutInfo::getId).collect(Collectors.toSet()); - assertTrue(shortcutIds.contains("s1")); - assertTrue(shortcutIds.contains("s2")); - assertTrue(shortcutIds.contains("s3")); - assertTrue(shortcutIds.contains("s4")); - assertTrue(shortcutIds.contains("s5")); - } - - public void testPushDynamicShortcuts_PersistsShortcutsToDisk() { - if (!mService.isAppSearchEnabled()) { - return; - } - setCaller(CALLING_PACKAGE_1, USER_10); - mManager.setDynamicShortcuts(list( - makeShortcut("s1"), - makeShortcut("s2"), - makeShortcut("s3"), - makeShortcut("s4"), - makeShortcut("s5") - )); - List<ShortcutInfo> shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(5, shortcuts.size()); - Set<String> shortcutIds = - shortcuts.stream().map(ShortcutInfo::getId).collect(Collectors.toSet()); - assertTrue(shortcutIds.contains("s1")); - assertTrue(shortcutIds.contains("s2")); - assertTrue(shortcutIds.contains("s3")); - assertTrue(shortcutIds.contains("s4")); - assertTrue(shortcutIds.contains("s5")); - // Verifies pushDynamicShortcuts further persists shortcuts into AppSearch without - // removing previous shortcuts when max number of shortcuts is reached. - mManager.pushDynamicShortcut(makeShortcut("s6")); - // Increasing the max number of shortcuts since number of results per page in AppSearch - // is set to match the former. - mService.updateConfigurationLocked( - ShortcutService.ConfigConstants.KEY_MAX_SHORTCUTS + "=10," - + ShortcutService.ConfigConstants.KEY_SAVE_DELAY_MILLIS + "=1"); - shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(6, shortcuts.size()); - shortcutIds = shortcuts.stream().map(ShortcutInfo::getId).collect(Collectors.toSet()); - assertTrue(shortcutIds.contains("s1")); - assertTrue(shortcutIds.contains("s2")); - assertTrue(shortcutIds.contains("s3")); - assertTrue(shortcutIds.contains("s4")); - assertTrue(shortcutIds.contains("s5")); - assertTrue(shortcutIds.contains("s6")); - } - - public void testRemoveDynamicShortcuts_RemovesShortcutsFromDisk() { - if (!mService.isAppSearchEnabled()) { - return; - } - setCaller(CALLING_PACKAGE_1, USER_10); - mManager.setDynamicShortcuts(list( - makeShortcut("s1"), - makeShortcut("s2"), - makeShortcut("s3"), - makeShortcut("s4"), - makeShortcut("s5") - )); - - // Verifies removeDynamicShortcuts removes shortcuts from persistence layer - mManager.removeDynamicShortcuts(list("s1")); - final List<ShortcutInfo> shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(4, shortcuts.size()); - final Set<String> shortcutIds = - shortcuts.stream().map(ShortcutInfo::getId).collect(Collectors.toSet()); - assertTrue(shortcutIds.contains("s2")); - assertTrue(shortcutIds.contains("s3")); - assertTrue(shortcutIds.contains("s4")); - assertTrue(shortcutIds.contains("s5")); - } - - public void testRemoveLongLivedShortcuts_RemovesShortcutsFromDisk() { - if (!mService.isAppSearchEnabled()) { - return; - } - setCaller(CALLING_PACKAGE_1, USER_10); - mManager.setDynamicShortcuts(list( - makeShortcut("s1"), - makeShortcut("s2"), - makeShortcut("s3"), - makeShortcut("s4"), - makeShortcut("s5") - )); - mManager.removeDynamicShortcuts(list("s2")); - final List<ShortcutInfo> shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(4, shortcuts.size()); - final Set<String> shortcutIds = - shortcuts.stream().map(ShortcutInfo::getId).collect(Collectors.toSet()); - assertTrue(shortcutIds.contains("s1")); - assertTrue(shortcutIds.contains("s3")); - assertTrue(shortcutIds.contains("s4")); - assertTrue(shortcutIds.contains("s5")); - } - - public void testDisableShortcuts_RemovesShortcutsFromDisk() { - if (!mService.isAppSearchEnabled()) { - return; - } - setCaller(CALLING_PACKAGE_1, USER_10); - mManager.setDynamicShortcuts(list( - makeShortcut("s1"), - makeShortcut("s2"), - makeShortcut("s3"), - makeShortcut("s4"), - makeShortcut("s5") - )); - // Verifies disableShortcuts removes shortcuts from persistence layer - mManager.disableShortcuts(list("s3")); - final List<ShortcutInfo> shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(4, shortcuts.size()); - final Set<String> shortcutIds = - shortcuts.stream().map(ShortcutInfo::getId).collect(Collectors.toSet()); - assertTrue(shortcutIds.contains("s1")); - assertTrue(shortcutIds.contains("s2")); - assertTrue(shortcutIds.contains("s4")); - assertTrue(shortcutIds.contains("s5")); - } - - public void testUpdateShortcuts_UpdateShortcutsOnDisk() { - if (!mService.isAppSearchEnabled()) { - return; - } - setCaller(CALLING_PACKAGE_1, USER_10); - mManager.setDynamicShortcuts(list( - makeShortcut("s1"), - makeShortcut("s2"), - makeShortcut("s3"), - makeShortcut("s4"), - makeShortcut("s5") - )); - // Verifies disableShortcuts removes shortcuts from persistence layer - mManager.updateShortcuts(list(makeShortcutWithShortLabel("s3", "custom"))); - final List<ShortcutInfo> shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(5, shortcuts.size()); - final Map<String, ShortcutInfo> map = shortcuts.stream() - .collect(Collectors.toMap(ShortcutInfo::getId, Function.identity())); - assertTrue(map.containsKey("s3")); - assertEquals("custom", map.get("s3").getShortLabel()); - } - - public void testShortcutsExcludedFromLauncher_PersistedToDisk() { - if (!mService.isAppSearchEnabled()) { - return; - } - setCaller(CALLING_PACKAGE_1, USER_10); - mManager.setDynamicShortcuts(list( - makeShortcutExcludedFromLauncher("s1"), - makeShortcutExcludedFromLauncher("s2"), - makeShortcutExcludedFromLauncher("s3"), - makeShortcutExcludedFromLauncher("s4"), - makeShortcutExcludedFromLauncher("s5") - )); - final List<ShortcutInfo> shortcuts = getAllPersistedShortcuts(); - assertNotNull(shortcuts); - assertEquals(5, shortcuts.size()); - final Map<String, ShortcutInfo> map = shortcuts.stream() - .collect(Collectors.toMap(ShortcutInfo::getId, Function.identity())); - assertTrue(map.containsKey("s3")); - assertEquals("Title-s3", map.get("s3").getShortLabel()); - } - - - private List<ShortcutInfo> getAllPersistedShortcuts() { - try { - SystemClock.sleep(5000); - final AndroidFuture<List<ShortcutInfo>> future = new AndroidFuture<>(); - getPersistedShortcut(future); - return future.get(10, TimeUnit.SECONDS); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/services/tests/servicestests/src/com/android/server/security/advancedprotection/AdvancedProtectionServiceTest.java b/services/tests/servicestests/src/com/android/server/security/advancedprotection/AdvancedProtectionServiceTest.java index c7a06b8eec7b..b1df0f1e9cce 100644 --- a/services/tests/servicestests/src/com/android/server/security/advancedprotection/AdvancedProtectionServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/security/advancedprotection/AdvancedProtectionServiceTest.java @@ -31,7 +31,6 @@ import android.os.test.FakePermissionEnforcer; import android.os.test.TestLooper; import android.provider.Settings; import android.security.advancedprotection.AdvancedProtectionFeature; -import android.security.advancedprotection.AdvancedProtectionManager; import android.security.advancedprotection.IAdvancedProtectionCallback; import androidx.annotation.NonNull; @@ -55,8 +54,7 @@ public class AdvancedProtectionServiceTest { private Context mContext; private AdvancedProtectionService.AdvancedProtectionStore mStore; private TestLooper mLooper; - AdvancedProtectionFeature mTestFeature2g = new AdvancedProtectionFeature( - AdvancedProtectionManager.FEATURE_ID_DISALLOW_CELLULAR_2G); + AdvancedProtectionFeature mFeature = new AdvancedProtectionFeature("test-id"); @Before public void setup() throws Settings.SettingNotFoundException { @@ -107,7 +105,7 @@ public class AdvancedProtectionServiceTest { @NonNull @Override public AdvancedProtectionFeature getFeature() { - return mTestFeature2g; + return mFeature; } @Override @@ -137,7 +135,7 @@ public class AdvancedProtectionServiceTest { @NonNull @Override public AdvancedProtectionFeature getFeature() { - return mTestFeature2g; + return mFeature; } @Override @@ -167,7 +165,7 @@ public class AdvancedProtectionServiceTest { @NonNull @Override public AdvancedProtectionFeature getFeature() { - return mTestFeature2g; + return mFeature; } @Override @@ -240,10 +238,8 @@ public class AdvancedProtectionServiceTest { @Test public void testGetFeatures() { - AdvancedProtectionFeature feature1 = new AdvancedProtectionFeature( - AdvancedProtectionManager.FEATURE_ID_DISALLOW_CELLULAR_2G); - AdvancedProtectionFeature feature2 = new AdvancedProtectionFeature( - AdvancedProtectionManager.FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES); + AdvancedProtectionFeature feature1 = new AdvancedProtectionFeature("id-1"); + AdvancedProtectionFeature feature2 = new AdvancedProtectionFeature("id-2"); AdvancedProtectionHook hook = new AdvancedProtectionHook(mContext, true) { @NonNull @Override @@ -272,10 +268,8 @@ public class AdvancedProtectionServiceTest { @Test public void testGetFeatures_featureNotAvailable() { - AdvancedProtectionFeature feature1 = new AdvancedProtectionFeature( - AdvancedProtectionManager.FEATURE_ID_DISALLOW_CELLULAR_2G); - AdvancedProtectionFeature feature2 = new AdvancedProtectionFeature( - AdvancedProtectionManager.FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES); + AdvancedProtectionFeature feature1 = new AdvancedProtectionFeature("id-1"); + AdvancedProtectionFeature feature2 = new AdvancedProtectionFeature("id-2"); AdvancedProtectionHook hook = new AdvancedProtectionHook(mContext, true) { @NonNull @Override diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java index d1dc8d6e81c8..4f5cdb73edd2 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java @@ -19,9 +19,13 @@ import static android.os.UserHandle.USER_ALL; import static android.service.notification.Adjustment.KEY_IMPORTANCE; import static android.service.notification.Adjustment.TYPE_CONTENT_RECOMMENDATION; import static android.service.notification.Adjustment.TYPE_NEWS; +import static android.service.notification.Adjustment.TYPE_OTHER; import static android.service.notification.Adjustment.TYPE_PROMOTION; +import static android.service.notification.Adjustment.TYPE_SOCIAL_MEDIA; +import static android.service.notification.Flags.notificationClassification; import static com.android.server.notification.NotificationManagerService.DEFAULT_ALLOWED_ADJUSTMENTS; +import static com.android.server.notification.NotificationManagerService.DEFAULT_ALLOWED_ADJUSTMENT_KEY_TYPES; import static com.google.common.truth.Truth.assertThat; @@ -144,6 +148,17 @@ public class NotificationAssistantsTest extends UiServiceTestCase { mAssistants.readXml(parser, mNm::canUseManagedServices, false, USER_ALL); } + private void setDefaultAllowedAdjustmentKeyTypes(NotificationAssistants assistants) { + assistants.setAssistantAdjustmentKeyTypeState(TYPE_OTHER, false); + assistants.setAssistantAdjustmentKeyTypeState(TYPE_PROMOTION, false); + assistants.setAssistantAdjustmentKeyTypeState(TYPE_SOCIAL_MEDIA, false); + assistants.setAssistantAdjustmentKeyTypeState(TYPE_NEWS, false); + assistants.setAssistantAdjustmentKeyTypeState(TYPE_CONTENT_RECOMMENDATION, false); + + for (int type : DEFAULT_ALLOWED_ADJUSTMENT_KEY_TYPES) { + assistants.setAssistantAdjustmentKeyTypeState(type, true); + } + } @Before public void setUp() throws Exception { @@ -154,6 +169,9 @@ public class NotificationAssistantsTest extends UiServiceTestCase { com.android.internal.R.string.config_defaultAssistantAccessComponent, mCn.flattenToString()); mAssistants = spy(mNm.new NotificationAssistants(mContext, mLock, mUserProfiles, miPm)); + if (notificationClassification()) { + setDefaultAllowedAdjustmentKeyTypes(mAssistants); + } when(mNm.getBinderService()).thenReturn(mINm); mContext.ensureTestableResources(); @@ -695,7 +713,7 @@ public class NotificationAssistantsTest extends UiServiceTestCase { mAssistants.setAssistantAdjustmentKeyTypeState(TYPE_CONTENT_RECOMMENDATION, true); assertThat(mAssistants.getAllowedAdjustmentKeyTypes()).asList() - .containsExactlyElementsIn(List.of(TYPE_PROMOTION, TYPE_CONTENT_RECOMMENDATION)); + .containsExactly(TYPE_PROMOTION, TYPE_CONTENT_RECOMMENDATION); } @Test @@ -716,7 +734,7 @@ public class NotificationAssistantsTest extends UiServiceTestCase { writeXmlAndReload(USER_ALL); assertThat(mAssistants.getAllowedAdjustmentKeyTypes()).asList() - .containsExactlyElementsIn(List.of(TYPE_NEWS, TYPE_CONTENT_RECOMMENDATION)); + .containsExactly(TYPE_NEWS, TYPE_CONTENT_RECOMMENDATION); } @Test @@ -732,76 +750,146 @@ public class NotificationAssistantsTest extends UiServiceTestCase { @Test @EnableFlags(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) + public void testSetAssistantAdjustmentKeyTypeStateForPackage_usesGlobalDefault() { + String pkg = "my.package"; + setDefaultAllowedAdjustmentKeyTypes(mAssistants); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_PROMOTION)).isTrue(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_NEWS)).isFalse(); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg)).asList() + .containsExactlyElementsIn(DEFAULT_ALLOWED_ADJUSTMENT_KEY_TYPES); + } + + @Test + @EnableFlags(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) public void testSetAssistantAdjustmentKeyTypeStateForPackage_allowsAndDenies() { - // Given that a package is allowed to have its type adjusted, - String allowedPackage = "allowed.package"; - assertThat(mAssistants.getTypeAdjustmentDeniedPackages()).isEmpty(); - mAssistants.setTypeAdjustmentForPackageState(allowedPackage, true); + setDefaultAllowedAdjustmentKeyTypes(mAssistants); + // Given that a package is set to have a type adjustment allowed, + String pkg = "my.package"; + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(pkg, TYPE_NEWS, true); - assertThat(mAssistants.getTypeAdjustmentDeniedPackages()).isEmpty(); - assertTrue(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPackage)); + // The newly set state is the combination of the global default and the newly set type. + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_NEWS)).isTrue(); // Set type adjustment disallowed for this package - mAssistants.setTypeAdjustmentForPackageState(allowedPackage, false); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(pkg, TYPE_NEWS, false); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(pkg, TYPE_PROMOTION, false); // Then the package is marked as denied - assertThat(mAssistants.getTypeAdjustmentDeniedPackages()).asList() - .containsExactly(allowedPackage); - assertFalse(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPackage)); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg)).isEmpty(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_NEWS)).isFalse(); // Set type adjustment allowed again - mAssistants.setTypeAdjustmentForPackageState(allowedPackage, true); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(pkg, TYPE_NEWS, true); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(pkg, TYPE_PROMOTION, true); // Then the package is marked as allowed again - assertThat(mAssistants.getTypeAdjustmentDeniedPackages()).isEmpty(); - assertTrue(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPackage)); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_NEWS)).isTrue(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_PROMOTION)).isTrue(); + + // Set type adjustment promotions false, + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(pkg, TYPE_PROMOTION, false); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg)).asList() + .containsExactly(TYPE_NEWS); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_NEWS)).isTrue(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_PROMOTION)).isFalse(); } @Test @EnableFlags(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) - public void testSetAssistantAdjustmentKeyTypeStateForPackage_deniesMultiple() { - // Given packages not allowed to have their type adjusted, - String deniedPkg1 = "denied.Pkg1"; - String deniedPkg2 = "denied.Pkg2"; - String deniedPkg3 = "denied.Pkg3"; - // Set type adjustment disallowed for these packages - mAssistants.setTypeAdjustmentForPackageState(deniedPkg1, false); - mAssistants.setTypeAdjustmentForPackageState(deniedPkg2, false); - mAssistants.setTypeAdjustmentForPackageState(deniedPkg3, false); - - // Then the packages are marked as denied - assertThat(mAssistants.getTypeAdjustmentDeniedPackages()).asList() - .containsExactlyElementsIn(List.of(deniedPkg1, deniedPkg2, deniedPkg3)); - assertFalse(mAssistants.isTypeAdjustmentAllowedForPackage(deniedPkg1)); - assertFalse(mAssistants.isTypeAdjustmentAllowedForPackage(deniedPkg2)); - assertFalse(mAssistants.isTypeAdjustmentAllowedForPackage(deniedPkg3)); - - // And when we re-allow one of them, - mAssistants.setTypeAdjustmentForPackageState(deniedPkg2, true); - - // Then the rest of the original packages are still marked as denied. - assertThat(mAssistants.getTypeAdjustmentDeniedPackages()).asList() - .containsExactlyElementsIn(List.of(deniedPkg1, deniedPkg3)); - assertFalse(mAssistants.isTypeAdjustmentAllowedForPackage(deniedPkg1)); - assertTrue(mAssistants.isTypeAdjustmentAllowedForPackage(deniedPkg2)); - assertFalse(mAssistants.isTypeAdjustmentAllowedForPackage(deniedPkg3)); + public void testSetAssistantAdjustmentKeyTypeStateForPackage_allowsMultiplePkgs() { + setDefaultAllowedAdjustmentKeyTypes(mAssistants); + // Given packages allowed to have their type adjusted to TYPE_NEWS, + String allowedPkg1 = "allowed.Pkg1"; + String allowedPkg2 = "allowed.Pkg2"; + String allowedPkg3 = "allowed.Pkg3"; + // Set type adjustment allowed for these packages + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg1, TYPE_NEWS, true); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg2, TYPE_NEWS, true); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg3, TYPE_NEWS, true); + + // The newly set state is the combination of the global default and the newly set type. + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(allowedPkg1)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(allowedPkg2)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(allowedPkg3)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPkg1, TYPE_NEWS)).isTrue(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPkg2, TYPE_NEWS)).isTrue(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPkg3, TYPE_NEWS)).isTrue(); + + // And when we deny some of them, + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg2, TYPE_NEWS, false); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg2, TYPE_PROMOTION, + false); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg3, TYPE_PROMOTION, + false); + + // Then the rest of the original packages are still marked as allowed. + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(allowedPkg1)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(allowedPkg2)).isEmpty(); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(allowedPkg3)).asList() + .containsExactly(TYPE_NEWS); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPkg1, TYPE_NEWS)).isTrue(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPkg2, TYPE_NEWS)).isFalse(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(allowedPkg3, TYPE_NEWS)).isTrue(); } @Test @EnableFlags(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) public void testSetAssistantAdjustmentKeyTypeStateForPackage_readWriteXml() throws Exception { + setDefaultAllowedAdjustmentKeyTypes(mAssistants); mAssistants.loadDefaultsFromConfig(true); String deniedPkg1 = "denied.Pkg1"; String allowedPkg2 = "allowed.Pkg2"; - String deniedPkg3 = "denied.Pkg3"; + String allowedPkg3 = "allowed.Pkg3"; // Set type adjustment disallowed or allowed for these packages - mAssistants.setTypeAdjustmentForPackageState(deniedPkg1, false); - mAssistants.setTypeAdjustmentForPackageState(allowedPkg2, true); - mAssistants.setTypeAdjustmentForPackageState(deniedPkg3, false); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(deniedPkg1, TYPE_PROMOTION, false); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg2, TYPE_NEWS, true); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg3, TYPE_NEWS, true); + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(allowedPkg3, TYPE_SOCIAL_MEDIA, + true); writeXmlAndReload(USER_ALL); - assertThat(mAssistants.getTypeAdjustmentDeniedPackages()).asList() - .containsExactlyElementsIn(List.of(deniedPkg1, deniedPkg3)); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(deniedPkg1)).isEmpty(); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(allowedPkg2)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(allowedPkg3)).asList() + .containsExactly(TYPE_NEWS, TYPE_SOCIAL_MEDIA, TYPE_PROMOTION); + } + + @Test + @EnableFlags(android.app.Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI) + public void testSetAssistantAdjustmentKeyTypeStateForPackage_noGlobalImpact() throws Exception { + setDefaultAllowedAdjustmentKeyTypes(mAssistants); + // When the global state is changed, + mAssistants.setAssistantAdjustmentKeyTypeState(TYPE_NEWS, true); + + // The package state reflects the global state. + String pkg = "my.package"; + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_PROMOTION)).isTrue(); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_NEWS)).isTrue(); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION); + + // Once the package specific state is modified, + mAssistants.setAssistantAdjustmentKeyTypeStateForPackage(pkg, TYPE_SOCIAL_MEDIA, true); + + // The package specific state combines the global state with those modifications + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_SOCIAL_MEDIA)).isTrue(); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION, TYPE_SOCIAL_MEDIA); + + // And further changes to the global state are ignored. + mAssistants.setAssistantAdjustmentKeyTypeState(TYPE_NEWS, false); + assertThat(mAssistants.isTypeAdjustmentAllowedForPackage(pkg, TYPE_NEWS)).isTrue(); + assertThat(mAssistants.getAllowedAdjustmentKeyTypesForPackage(pkg)).asList() + .containsExactly(TYPE_NEWS, TYPE_PROMOTION, TYPE_SOCIAL_MEDIA); } }
\ No newline at end of file diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 601023f89656..301165f8151d 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -365,6 +365,9 @@ import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import platform.test.runner.parameterized.ParameterizedAndroidJunit4; +import platform.test.runner.parameterized.Parameters; + import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; @@ -380,9 +383,6 @@ import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.function.Consumer; -import platform.test.runner.parameterized.ParameterizedAndroidJunit4; -import platform.test.runner.parameterized.Parameters; - @SmallTest @RunWith(ParameterizedAndroidJunit4.class) @RunWithLooper @@ -644,6 +644,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { doNothing().when(mContext).sendBroadcast(any(), anyString()); doNothing().when(mContext).sendBroadcastAsUser(any(), any()); doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any()); + doNothing().when(mContext).sendBroadcastMultiplePermissions(any(), any(), any(), any()); + doReturn(mContext).when(mContext).createContextAsUser(eq(mUser), anyInt()); + TestableContentResolver cr = mock(TestableContentResolver.class); when(mContext.getContentResolver()).thenReturn(cr); doNothing().when(cr).registerContentObserver(any(), anyBoolean(), any(), anyInt()); @@ -7631,7 +7634,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isSameUser(any(), anyInt())).thenReturn(true); when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(true); when(mAssistants.isAdjustmentKeyTypeAllowed(anyInt())).thenReturn(true); - when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString())).thenReturn(true); + when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString(), anyInt())).thenReturn(true); // Set up notifications that will be adjusted final NotificationRecord r1 = spy(generateNotificationRecord( @@ -11235,7 +11238,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test - public void onZenModeChanged_sendsBroadcasts() throws Exception { + @DisableFlags(Flags.FLAG_NM_BINDER_PERF_REDUCE_ZEN_BROADCASTS) + public void onZenModeChanged_sendsBroadcasts_oldBehavior() throws Exception { when(mAmi.getCurrentUserId()).thenReturn(100); when(mUmInternal.getProfileIds(eq(100), anyBoolean())).thenReturn(new int[]{100, 101, 102}); when(mConditionProviders.getAllowedPackages(anyInt())).then(new Answer<List<String>>() { @@ -11288,6 +11292,74 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_REDUCE_ZEN_BROADCASTS) + public void onZenModeChanged_sendsBroadcasts() throws Exception { + when(mAmi.getCurrentUserId()).thenReturn(100); + when(mUmInternal.getProfileIds(eq(100), anyBoolean())).thenReturn(new int[]{100, 101, 102}); + when(mConditionProviders.getAllowedPackages(anyInt())).then(new Answer<List<String>>() { + @Override + public List<String> answer(InvocationOnMock invocation) { + int userId = invocation.getArgument(0); + switch (userId) { + case 100: + return Lists.newArrayList("a", "b", "c"); + case 101: + return Lists.newArrayList(); + case 102: + return Lists.newArrayList("b"); + default: + throw new IllegalArgumentException( + "Why would you ask for packages of userId " + userId + "?"); + } + } + }); + Context context100 = mock(Context.class); + doReturn(context100).when(mContext).createContextAsUser(eq(UserHandle.of(100)), anyInt()); + Context context101 = mock(Context.class); + doReturn(context101).when(mContext).createContextAsUser(eq(UserHandle.of(101)), anyInt()); + Context context102 = mock(Context.class); + doReturn(context102).when(mContext).createContextAsUser(eq(UserHandle.of(102)), anyInt()); + + mService.getBinderService().setZenMode(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS, null, + "testing!", false); + waitForIdle(); + + // Verify broadcasts per user: registered receivers first, then DND packages. + InOrder inOrder = inOrder(context100, context101, context102); + + inOrder.verify(context100).sendBroadcastMultiplePermissions( + eqIntent(new Intent(ACTION_INTERRUPTION_FILTER_CHANGED) + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)), + eq(new String[0]), eq(new String[0]), eq(new String[] {"a", "b", "c"})); + inOrder.verify(context100).sendBroadcast( + eqIntent(new Intent(ACTION_INTERRUPTION_FILTER_CHANGED) + .setPackage("a") + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT))); + inOrder.verify(context100).sendBroadcast( + eqIntent(new Intent(ACTION_INTERRUPTION_FILTER_CHANGED) + .setPackage("b") + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT))); + inOrder.verify(context100).sendBroadcast( + eqIntent(new Intent(ACTION_INTERRUPTION_FILTER_CHANGED) + .setPackage("c") + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT))); + + inOrder.verify(context101).sendBroadcastMultiplePermissions( + eqIntent(new Intent(ACTION_INTERRUPTION_FILTER_CHANGED) + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)), + eq(new String[0]), eq(new String[0]), eq(new String[] {})); + + inOrder.verify(context102).sendBroadcastMultiplePermissions( + eqIntent(new Intent(ACTION_INTERRUPTION_FILTER_CHANGED) + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)), + eq(new String[0]), eq(new String[0]), eq(new String[] {"b"})); + inOrder.verify(context102).sendBroadcast( + eqIntent(new Intent(ACTION_INTERRUPTION_FILTER_CHANGED) + .setPackage("b") + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT))); + } + + @Test @EnableFlags(android.app.Flags.FLAG_MODES_API) public void onAutomaticRuleStatusChanged_sendsBroadcastToRuleOwner() throws Exception { mService.mZenModeHelper.getCallbacks().forEach(c -> c.onAutomaticRuleStatusChanged( @@ -17305,7 +17377,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isAdjustmentKeyTypeAllowed(anyInt())).thenReturn(true); - when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString())).thenReturn(true); + when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString(), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(KEY_TYPE, TYPE_NEWS); @@ -17349,7 +17421,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isAdjustmentKeyTypeAllowed(anyInt())).thenReturn(true); - when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString())).thenReturn(true); + when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString(), eq(TYPE_NEWS))) + .thenReturn(true); + // Blocking adjustments for a different type does nothing + when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString(), eq(TYPE_PROMOTION))) + .thenReturn(false); Bundle signals = new Bundle(); signals.putInt(KEY_TYPE, TYPE_NEWS); @@ -17364,8 +17440,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertThat(r.getChannel().getId()).isEqualTo(NEWS_ID); - // When we block adjustments for this package - when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString())).thenReturn(false); + // When we block adjustments for this package/type + when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString(), eq(TYPE_PROMOTION))) + .thenReturn(false); signals.putInt(KEY_TYPE, TYPE_PROMOTION); mBinderService.applyAdjustmentFromAssistant(null, adjustment); @@ -17695,7 +17772,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isSameUser(any(), anyInt())).thenReturn(true); when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(true); when(mAssistants.isAdjustmentKeyTypeAllowed(anyInt())).thenReturn(true); - when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString())).thenReturn(true); + when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString(), anyInt())).thenReturn(true); // Post a single notification final boolean hasOriginalSummary = false; @@ -17735,7 +17812,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isSameUser(any(), anyInt())).thenReturn(true); when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(true); when(mAssistants.isAdjustmentKeyTypeAllowed(anyInt())).thenReturn(true); - when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString())).thenReturn(true); + when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString(), anyInt())).thenReturn(true); // Post grouped notifications final String originalGroupName = "originalGroup"; @@ -17784,7 +17861,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isSameUser(any(), anyInt())).thenReturn(true); when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(true); when(mAssistants.isAdjustmentKeyTypeAllowed(anyInt())).thenReturn(true); - when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString())).thenReturn(true); + when(mAssistants.isTypeAdjustmentAllowedForPackage(anyString(), anyInt())).thenReturn(true); // Post grouped notifications final String originalGroupName = "originalGroup"; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index 94a40020cfc8..e3e9cc426bb3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -361,12 +361,6 @@ public class ActivityStarterTests extends WindowTestsBase { return prepareStarter(launchFlags, mockGetRootTask, LAUNCH_MULTIPLE); } - private void setupImeWindow() { - final WindowState imeWindow = createWindow(null, W_INPUT_METHOD, - "mImeWindow", CURRENT_IME_UID); - mDisplayContent.mInputMethodWindow = imeWindow; - } - /** * Creates a {@link ActivityStarter} with default parameters and necessary mocks. * diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 57aacd36b16b..5cd2a994d81a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -85,6 +85,7 @@ import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING; import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE; +import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT; import static com.google.common.truth.Truth.assertThat; @@ -2879,6 +2880,43 @@ public class DisplayContentTests extends WindowTestsBase { assertFalse(createNewDisplay().mAppCompatCameraPolicy.hasCameraCompatFreeformPolicy()); } + @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) + @Test + public void testSetShouldShowSystemDecorations_defaultDisplay() { + DisplayContent dc = mWm.mRoot.getDisplayContent(DEFAULT_DISPLAY); + + dc.onDisplayInfoChangeApplied(); + assertTrue(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); + } + + @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) + @Test + public void testSetShouldShowSystemDecorations_privateDisplay() { + final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo); + displayInfo.flags = FLAG_PRIVATE; + final DisplayContent dc = createNewDisplay(displayInfo); + + dc.onDisplayInfoChangeApplied(); + assertFalse(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); + } + + @EnableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) + @Test + public void testSetShouldShowSystemDecorations_nonDefaultNonPrivateDisplay() { + final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo); + displayInfo.displayId = DEFAULT_DISPLAY + 1; + final DisplayContent dc = createNewDisplay(displayInfo); + + spyOn(dc.mDisplay); + doReturn(false).when(dc.mDisplay).canHostTasks(); + dc.onDisplayInfoChangeApplied(); + assertFalse(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); + + doReturn(true).when(dc.mDisplay).canHostTasks(); + dc.onDisplayInfoChangeApplied(); + assertTrue(dc.mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(dc)); + } + private void removeRootTaskTests(Runnable runnable) { final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); final Task rootTask1 = taskDisplayArea.createRootTask(WINDOWING_MODE_FULLSCREEN, diff --git a/services/tests/wmtests/src/com/android/server/wm/FrameRateSelectionPriorityTests.java b/services/tests/wmtests/src/com/android/server/wm/FrameRateSelectionPriorityTests.java index c016c5ead23c..de0716885214 100644 --- a/services/tests/wmtests/src/com/android/server/wm/FrameRateSelectionPriorityTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/FrameRateSelectionPriorityTests.java @@ -73,7 +73,7 @@ public class FrameRateSelectionPriorityTests extends WindowTestsBase { private static final float MID_REFRESH_RATE = 70; private static final float LOW_REFRESH_RATE = 60; WindowState createWindow(String name) { - WindowState window = createWindow(null, TYPE_APPLICATION, name); + WindowState window = newWindowBuilder(name, TYPE_APPLICATION).build(); when(window.mWmService.mDisplayManagerInternal.getRefreshRateSwitchingType()) .thenReturn(DisplayManager.SWITCHING_TYPE_WITHIN_GROUPS); return window; diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java index f70dcebce30d..7d59f4872d37 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java @@ -56,12 +56,13 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { @Test public void testTransparentControlTargetWindowCanShowIme() { - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); makeWindowVisibleAndDrawn(ime); mImeProvider.setWindowContainer(ime, null, null); - final WindowState appWin = createWindow(null, TYPE_APPLICATION, "app"); - final WindowState popup = createWindow(appWin, TYPE_APPLICATION, "popup"); + final WindowState appWin = newWindowBuilder("app", TYPE_APPLICATION).build(); + final WindowState popup = newWindowBuilder("popup", TYPE_APPLICATION).setParent( + appWin).build(); popup.mAttrs.format = PixelFormat.TRANSPARENT; mDisplayContent.setImeLayeringTarget(appWin); mDisplayContent.updateImeInputAndControlTarget(popup); @@ -77,11 +78,11 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { @Test @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) public void testScheduleShowIme() { - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); makeWindowVisibleAndDrawn(ime); mImeProvider.setWindowContainer(ime, null, null); - final WindowState target = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState target = newWindowBuilder("app", TYPE_APPLICATION).build(); mDisplayContent.setImeLayeringTarget(target); mDisplayContent.updateImeInputAndControlTarget(target); performSurfacePlacementAndWaitForWindowAnimator(); @@ -105,14 +106,14 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { @Test @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) public void testScheduleShowIme_noInitialState() { - final WindowState target = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState target = newWindowBuilder("app", TYPE_APPLICATION).build(); // Schedule before anything is ready. mImeProvider.scheduleShowImePostLayout(target, ImeTracker.Token.empty()); assertFalse(mImeProvider.isScheduledAndReadyToShowIme()); assertFalse(mImeProvider.isImeShowing()); - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); makeWindowVisibleAndDrawn(ime); mImeProvider.setWindowContainer(ime, null, null); @@ -133,11 +134,11 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { @Test @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) public void testScheduleShowIme_delayedAfterPrepareSurfaces() { - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); makeWindowVisibleAndDrawn(ime); mImeProvider.setWindowContainer(ime, null, null); - final WindowState target = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState target = newWindowBuilder("app", TYPE_APPLICATION).build(); mDisplayContent.setImeLayeringTarget(target); mDisplayContent.updateImeInputAndControlTarget(target); @@ -166,11 +167,11 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { @Test @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) public void testScheduleShowIme_delayedSurfacePlacement() { - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); makeWindowVisibleAndDrawn(ime); mImeProvider.setWindowContainer(ime, null, null); - final WindowState target = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState target = newWindowBuilder("app", TYPE_APPLICATION).build(); mDisplayContent.setImeLayeringTarget(target); mDisplayContent.updateImeInputAndControlTarget(target); @@ -191,7 +192,7 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { @Test public void testSetFrozen() { - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); makeWindowVisibleAndDrawn(ime); mImeProvider.setWindowContainer(ime, null, null); mImeProvider.setServerVisible(true); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java index ee56210e278d..6c5fe1d8551e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java @@ -106,8 +106,9 @@ public class InsetsPolicyTest extends WindowTestsBase { addStatusBar(); addNavigationBar(); - final WindowState win = createWindow(null, WINDOWING_MODE_FREEFORM, - ACTIVITY_TYPE_STANDARD, TYPE_APPLICATION, mDisplayContent, "app"); + final WindowState win = newWindowBuilder("app", TYPE_APPLICATION).setActivityType( + ACTIVITY_TYPE_STANDARD).setWindowingMode(WINDOWING_MODE_FREEFORM).setDisplay( + mDisplayContent).build(); final InsetsSourceControl[] controls = addWindowAndGetControlsForDispatch(win); // The app must not control any system bars. @@ -120,8 +121,9 @@ public class InsetsPolicyTest extends WindowTestsBase { addStatusBar(); addNavigationBar(); - final WindowState win = createWindow(null, WINDOWING_MODE_FREEFORM, - ACTIVITY_TYPE_STANDARD, TYPE_APPLICATION, mDisplayContent, "app"); + final WindowState win = newWindowBuilder("app", TYPE_APPLICATION).setActivityType( + ACTIVITY_TYPE_STANDARD).setWindowingMode(WINDOWING_MODE_FREEFORM).setDisplay( + mDisplayContent).build(); win.setBounds(new Rect()); final InsetsSourceControl[] controls = addWindowAndGetControlsForDispatch(win); @@ -136,8 +138,9 @@ public class InsetsPolicyTest extends WindowTestsBase { addStatusBar(); addNavigationBar(); - final WindowState win = createWindow(null, WINDOWING_MODE_FREEFORM, - ACTIVITY_TYPE_STANDARD, TYPE_APPLICATION, mDisplayContent, "app"); + final WindowState win = newWindowBuilder("app", TYPE_APPLICATION).setActivityType( + ACTIVITY_TYPE_STANDARD).setWindowingMode(WINDOWING_MODE_FREEFORM).setDisplay( + mDisplayContent).build(); win.getTask().setBounds(new Rect(1, 1, 10, 10)); final InsetsSourceControl[] controls = addWindowAndGetControlsForDispatch(win); @@ -582,7 +585,7 @@ public class InsetsPolicyTest extends WindowTestsBase { private WindowState addNavigationBar() { final Binder owner = new Binder(); - final WindowState win = createWindow(null, TYPE_NAVIGATION_BAR, "navBar"); + final WindowState win = newWindowBuilder("navBar", TYPE_NAVIGATION_BAR).build(); win.mAttrs.flags |= FLAG_NOT_FOCUSABLE; win.mAttrs.providedInsets = new InsetsFrameProvider[] { new InsetsFrameProvider(owner, 0, WindowInsets.Type.navigationBars()), @@ -595,7 +598,7 @@ public class InsetsPolicyTest extends WindowTestsBase { private WindowState addStatusBar() { final Binder owner = new Binder(); - final WindowState win = createWindow(null, TYPE_STATUS_BAR, "statusBar"); + final WindowState win = newWindowBuilder("statusBar", TYPE_STATUS_BAR).build(); win.mAttrs.flags |= FLAG_NOT_FOCUSABLE; win.mAttrs.providedInsets = new InsetsFrameProvider[] { new InsetsFrameProvider(owner, 0, WindowInsets.Type.statusBars()), @@ -607,7 +610,7 @@ public class InsetsPolicyTest extends WindowTestsBase { } private WindowState addWindow(int type, String name) { - final WindowState win = createWindow(null, type, name); + final WindowState win = newWindowBuilder(name, type).build(); mDisplayContent.getDisplayPolicy().addWindowLw(win, win.mAttrs); return win; } diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java index 79967b861ea5..c30aa52b1ef4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java @@ -63,7 +63,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testPostLayout() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); statusBar.setBounds(0, 0, 500, 1000); statusBar.getFrame().set(0, 0, 500, 100); statusBar.mHasSurface = true; @@ -81,7 +81,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testPostLayout_invisible() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); statusBar.setBounds(0, 0, 500, 1000); statusBar.getFrame().set(0, 0, 500, 100); mProvider.setWindowContainer(statusBar, null, null); @@ -93,7 +93,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testPostLayout_frameProvider() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); statusBar.getFrame().set(0, 0, 500, 100); statusBar.mHasSurface = true; mProvider.setWindowContainer(statusBar, @@ -108,8 +108,8 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testUpdateControlForTarget() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState target = newWindowBuilder("target", TYPE_APPLICATION).build(); statusBar.getFrame().set(0, 0, 500, 100); // We must not have control or control target before we have the insets source window. @@ -153,8 +153,8 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testUpdateControlForFakeTarget() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState target = newWindowBuilder("target", TYPE_APPLICATION).build(); statusBar.getFrame().set(0, 0, 500, 100); mProvider.setWindowContainer(statusBar, null, null); mProvider.updateFakeControlTarget(target); @@ -166,10 +166,10 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testGetLeash() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); - final WindowState fakeTarget = createWindow(null, TYPE_APPLICATION, "fakeTarget"); - final WindowState otherTarget = createWindow(null, TYPE_APPLICATION, "otherTarget"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState target = newWindowBuilder("target", TYPE_APPLICATION).build(); + final WindowState fakeTarget = newWindowBuilder("fakeTarget", TYPE_APPLICATION).build(); + final WindowState otherTarget = newWindowBuilder("otherTarget", TYPE_APPLICATION).build(); statusBar.getFrame().set(0, 0, 500, 100); // We must not have control or control target before we have the insets source window, @@ -208,7 +208,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testUpdateSourceFrame() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); mProvider.setWindowContainer(statusBar, null, null); statusBar.setBounds(0, 0, 500, 1000); @@ -238,7 +238,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testUpdateSourceFrameForIme() { - final WindowState inputMethod = createWindow(null, TYPE_INPUT_METHOD, "inputMethod"); + final WindowState inputMethod = newWindowBuilder("inputMethod", TYPE_INPUT_METHOD).build(); inputMethod.getFrame().set(new Rect(0, 400, 500, 500)); @@ -262,9 +262,9 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testUpdateInsetsControlPosition() { - final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); + final WindowState target = newWindowBuilder("target", TYPE_APPLICATION).build(); - final WindowState ime1 = createWindow(null, TYPE_INPUT_METHOD, "ime1"); + final WindowState ime1 = newWindowBuilder("ime1", TYPE_INPUT_METHOD).build(); ime1.getFrame().set(new Rect(0, 0, 0, 0)); mImeProvider.setWindowContainer(ime1, null, null); mImeProvider.updateControlForTarget(target, false /* force */, null /* statsToken */); @@ -272,7 +272,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { mImeProvider.updateInsetsControlPosition(ime1); assertEquals(new Point(0, 400), mImeProvider.getControl(target).getSurfacePosition()); - final WindowState ime2 = createWindow(null, TYPE_INPUT_METHOD, "ime2"); + final WindowState ime2 = newWindowBuilder("ime2", TYPE_INPUT_METHOD).build(); ime2.getFrame().set(new Rect(0, 0, 0, 0)); mImeProvider.setWindowContainer(ime2, null, null); mImeProvider.updateControlForTarget(target, false /* force */, null /* statsToken */); @@ -283,8 +283,8 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testSetRequestedVisibleTypes() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState target = newWindowBuilder("target", TYPE_APPLICATION).build(); statusBar.getFrame().set(0, 0, 500, 100); mProvider.setWindowContainer(statusBar, null, null); mProvider.updateControlForTarget(target, false /* force */, null /* statsToken */); @@ -295,8 +295,8 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testSetRequestedVisibleTypes_noControl() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState target = newWindowBuilder("target", TYPE_APPLICATION).build(); statusBar.getFrame().set(0, 0, 500, 100); mProvider.setWindowContainer(statusBar, null, null); target.setRequestedVisibleTypes(0, statusBars()); @@ -306,7 +306,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testInsetGeometries() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); statusBar.getFrame().set(0, 0, 500, 100); statusBar.mHasSurface = true; mProvider.setWindowContainer(statusBar, null, null); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index 66a66a1e358b..973c8d0a8464 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -76,9 +76,9 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testStripForDispatch_navBar() { - final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState ime = createWindow(null, TYPE_APPLICATION, "ime"); + final WindowState navBar = newWindowBuilder("navBar", TYPE_APPLICATION).build(); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState ime = newWindowBuilder("ime", TYPE_APPLICATION).build(); // IME cannot be the IME target. ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE; @@ -96,9 +96,9 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testStripForDispatch_pip() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState navBar = newWindowBuilder("navBar", TYPE_APPLICATION).build(); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) .setWindowContainer(statusBar, null, null); @@ -113,9 +113,9 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testStripForDispatch_freeform() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState navBar = newWindowBuilder("navBar", TYPE_APPLICATION).build(); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) .setWindowContainer(statusBar, null, null); @@ -129,9 +129,9 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testStripForDispatch_multiwindow_alwaysOnTop() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState navBar = newWindowBuilder("navBar", TYPE_APPLICATION).build(); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) .setWindowContainer(statusBar, null, null); @@ -150,8 +150,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { getController().getOrCreateSourceProvider(ID_IME, ime()) .setWindowContainer(mImeWindow, null, null); - final WindowState app1 = createWindow(null, TYPE_APPLICATION, "app1"); - final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2"); + final WindowState app1 = newWindowBuilder("app1", TYPE_APPLICATION).build(); + final WindowState app2 = newWindowBuilder("app2", TYPE_APPLICATION).build(); app1.mAboveInsetsState.addSource(getController().getRawInsetsState().peekSource(ID_IME)); @@ -166,7 +166,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { getController().getOrCreateSourceProvider(ID_IME, ime()) .setWindowContainer(mImeWindow, null, null); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); app.mAboveInsetsState.getOrCreateSource(ID_IME, ime()) .setVisible(true) .setFrame(mImeWindow.getFrame()); @@ -181,7 +181,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { getController().getOrCreateSourceProvider(ID_IME, ime()) .setWindowContainer(mImeWindow, null, null); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); getController().getRawInsetsState().setSourceVisible(ID_IME, true); assertFalse(app.getInsetsState().isSourceOrDefaultVisible(ID_IME, ime())); @@ -193,7 +193,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { // This can be the IME z-order target while app cannot be the IME z-order target. // This is also the only IME control target in this test, so IME won't be invisible caused // by the control-target change. - final WindowState base = createWindow(null, TYPE_APPLICATION, "base"); + final WindowState base = newWindowBuilder("base", TYPE_APPLICATION).build(); mDisplayContent.updateImeInputAndControlTarget(base); // Make IME and stay visible during the test. @@ -210,7 +210,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { } // Send our spy window (app) into the system so that we can detect the invocation. - final WindowState win = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState win = newWindowBuilder("app", TYPE_APPLICATION).build(); win.setHasSurface(true); final WindowToken parent = win.mToken; parent.removeChild(win); @@ -250,8 +250,9 @@ public class InsetsStateControllerTest extends WindowTestsBase { getController().getOrCreateSourceProvider(ID_IME, ime()) .setWindowContainer(mImeWindow, null, null); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - final WindowState child = createWindow(app, TYPE_APPLICATION, "child"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); + final WindowState child = newWindowBuilder("child", TYPE_APPLICATION).setParent( + app).build(); app.mAboveInsetsState.set(getController().getRawInsetsState()); child.mAboveInsetsState.set(getController().getRawInsetsState()); child.mAttrs.flags |= FLAG_ALT_FOCUSABLE_IM; @@ -271,8 +272,9 @@ public class InsetsStateControllerTest extends WindowTestsBase { getController().getOrCreateSourceProvider(ID_IME, ime()) .setWindowContainer(mImeWindow, null, null); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - final WindowState child = createWindow(app, TYPE_APPLICATION, "child"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); + final WindowState child = newWindowBuilder("child", TYPE_APPLICATION).setParent( + app).build(); app.mAboveInsetsState.addSource(getController().getRawInsetsState().peekSource(ID_IME)); child.mAttrs.flags |= FLAG_NOT_FOCUSABLE; child.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); @@ -288,8 +290,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testImeForDispatch() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); makeWindowVisible(statusBar); @@ -318,11 +320,11 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testBarControllingWinChanged() { - final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState climateBar = createWindow(null, TYPE_APPLICATION, "climateBar"); - final WindowState extraNavBar = createWindow(null, TYPE_APPLICATION, "extraNavBar"); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState navBar = newWindowBuilder("navBar", TYPE_APPLICATION).build(); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState climateBar = newWindowBuilder("climateBar", TYPE_APPLICATION).build(); + final WindowState extraNavBar = newWindowBuilder("extraNavBar", TYPE_APPLICATION).build(); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) .setWindowContainer(statusBar, null, null); getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) @@ -338,8 +340,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testControlRevoked() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) .setWindowContainer(statusBar, null, null); getController().onBarControlTargetChanged(app, null, null, null); @@ -350,8 +352,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testControlRevoked_animation() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) .setWindowContainer(statusBar, null, null); getController().onBarControlTargetChanged(app, null, null, null); @@ -362,19 +364,20 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testControlTargetChangedWhileProviderHasNoWindow() { - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); final InsetsSourceProvider provider = getController().getOrCreateSourceProvider( ID_STATUS_BAR, statusBars()); getController().onBarControlTargetChanged(app, null, null, null); assertNull(getController().getControlsForDispatch(app)); - provider.setWindowContainer(createWindow(null, TYPE_APPLICATION, "statusBar"), null, null); + provider.setWindowContainer(newWindowBuilder("statusBar", TYPE_APPLICATION).build(), null, + null); assertNotNull(getController().getControlsForDispatch(app)); } @Test public void testTransientVisibilityOfFixedRotationState() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); final InsetsSourceProvider provider = getController() .getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()); provider.setWindowContainer(statusBar, null, null); @@ -494,7 +497,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testUpdateAboveInsetsState_imeTargetOnScreenBehavior() { final WindowToken imeToken = createTestWindowToken(TYPE_INPUT_METHOD, mDisplayContent); - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, imeToken, "ime"); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).setWindowToken( + imeToken).build(); final WindowState app = createTestWindow("app"); getController().getOrCreateSourceProvider(ID_IME, ime()) @@ -538,10 +542,10 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testDispatchGlobalInsets() { - final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); + final WindowState navBar = newWindowBuilder("navBar", TYPE_APPLICATION).build(); getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) .setWindowContainer(navBar, null, null); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); assertNull(app.getInsetsState().peekSource(ID_NAVIGATION_BAR)); app.mAttrs.receiveInsetsIgnoringZOrder = true; assertNotNull(app.getInsetsState().peekSource(ID_NAVIGATION_BAR)); @@ -580,8 +584,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testHasPendingControls() { - final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_APPLICATION).build(); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) .setWindowContainer(statusBar, null, null); // No controls dispatched yet. @@ -598,7 +602,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { /** Creates a window which is associated with ActivityRecord. */ private WindowState createTestWindow(String name) { - final WindowState win = createWindow(null, TYPE_APPLICATION, name); + final WindowState win = newWindowBuilder(name, TYPE_APPLICATION).build(); win.setHasSurface(true); spyOn(win); return win; @@ -606,7 +610,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { /** Creates a non-activity window. */ private WindowState createNonAppWindow(String name) { - final WindowState win = createWindow(null, LAST_APPLICATION_WINDOW + 1, name); + final WindowState win = newWindowBuilder(name, LAST_APPLICATION_WINDOW + 1).build(); win.setHasSurface(true); spyOn(win); return win; diff --git a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java index bef4531c9f28..5122aeee588a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java @@ -239,6 +239,11 @@ public class LockTaskControllerTest { verifyLockTaskStarted(STATUS_BAR_MASK_PINNED, DISABLE2_NONE); // THEN screen pinning toast should be shown verify(mStatusBarService).showPinningEnterExitToast(eq(true /* entering */)); + + // WHEN the app calls startLockTaskMode while the Task is already locked + mLockTaskController.startLockTaskMode(tr, false, TEST_UID); + // THEN a pinning request should NOT be shown + verify(mStatusBarManagerInternal, never()).showScreenPinningRequest(anyInt(), anyInt()); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java index 73e5f58fa7e0..45436e47e881 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java @@ -108,7 +108,7 @@ public class RefreshRatePolicyTest extends WindowTestsBase { } WindowState createWindow(String name) { - WindowState window = createWindow(null, TYPE_BASE_APPLICATION, name); + WindowState window = newWindowBuilder(name, TYPE_BASE_APPLICATION).build(); when(window.getDisplayInfo()).thenReturn(mDisplayInfo); when(window.mWmService.mDisplayManagerInternal.getRefreshRateSwitchingType()) .thenReturn(DisplayManager.SWITCHING_TYPE_WITHIN_GROUPS); diff --git a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java index c5cbedb9193c..20381ba21758 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java @@ -114,8 +114,8 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { } private WindowState createAppOverlayWindow() { - final WindowState win = createWindow(null /* parent */, TYPE_APPLICATION_OVERLAY, - "testOverlayWindow"); + final WindowState win = newWindowBuilder("testOverlayWindow", + TYPE_APPLICATION_OVERLAY).build(); win.mActivityRecord = null; win.mHasSurface = true; return win; @@ -123,7 +123,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testForwardsShowBackdrop() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mOpeningApps.add(win.mActivityRecord); final WindowState overlayWin = createAppOverlayWindow(); try { @@ -156,7 +156,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testRun() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mOpeningApps.add(win.mActivityRecord); final WindowState overlayWin = createAppOverlayWindow(); try { @@ -200,7 +200,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testCancel() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); final AnimationAdapter adapter = mController.createRemoteAnimationRecord( win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter; @@ -214,7 +214,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testTimeout() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); final AnimationAdapter adapter = mController.createRemoteAnimationRecord( win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter; @@ -234,8 +234,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { public void testTimeout_scaled() throws Exception { try { mWm.setAnimationScale(2, 5.0f); - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, - "testWin"); + final WindowState win = createTestWindow(); final AnimationAdapter adapter = mController.createRemoteAnimationRecord( win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter; @@ -268,7 +267,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testNotReallyStarted() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mController.createRemoteAnimationRecord(win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false); mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN); @@ -278,8 +277,8 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testOneNotStarted() throws Exception { - final WindowState win1 = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin1"); - final WindowState win2 = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin2"); + final WindowState win1 = newWindowBuilder("testWin1", TYPE_BASE_APPLICATION).build(); + final WindowState win2 = newWindowBuilder("testWin2", TYPE_BASE_APPLICATION).build(); mController.createRemoteAnimationRecord(win1.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false); final AnimationAdapter adapter = mController.createRemoteAnimationRecord( @@ -306,7 +305,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testRemovedBeforeStarted() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); final AnimationAdapter adapter = mController.createRemoteAnimationRecord( win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter; @@ -322,7 +321,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testOpeningTaskWithTopFinishingActivity() { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "win"); + final WindowState win = createTestWindow(); final Task task = win.getTask(); final ActivityRecord topFinishing = new ActivityBuilder(mAtm).setTask(task).build(); // Now the task contains: @@ -348,7 +347,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testChangeToSmallerSize() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mChangingContainers.add(win.mActivityRecord); try { final RemoteAnimationRecord record = mController.createRemoteAnimationRecord( @@ -402,7 +401,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testChangeTolargerSize() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mChangingContainers.add(win.mActivityRecord); try { final RemoteAnimationRecord record = mController.createRemoteAnimationRecord( @@ -456,7 +455,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testChangeToDifferentPosition() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mChangingContainers.add(win.mActivityRecord); try { final RemoteAnimationRecord record = mController.createRemoteAnimationRecord( @@ -515,7 +514,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { true, mDisplayContent, true /* ownerCanManageAppTokens */); spyOn(mDisplayContent.mWallpaperController); doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible(); - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mOpeningApps.add(win.mActivityRecord); try { final AnimationAdapter adapter = mController.createRemoteAnimationRecord( @@ -548,7 +547,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { true, mDisplayContent, true /* ownerCanManageAppTokens */); spyOn(mDisplayContent.mWallpaperController); doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible(); - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mOpeningApps.add(win.mActivityRecord); try { final AnimationAdapter adapter = mController.createRemoteAnimationRecord( @@ -581,7 +580,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { @Test public void testNonAppIncluded_keygaurdGoingAway() throws Exception { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mOpeningApps.add(win.mActivityRecord); // Add overlay window hidden by the keyguard. final WindowState overlayWin = createAppOverlayWindow(); @@ -631,7 +630,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { true, mDisplayContent, true /* ownerCanManageAppTokens */); spyOn(mDisplayContent.mWallpaperController); doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible(); - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mOpeningApps.add(win.mActivityRecord); // Add overlay window hidden by the keyguard. final WindowState overlayWin = createAppOverlayWindow(); @@ -729,9 +728,9 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { } private AnimationAdapter setupForNonAppTargetNavBar(int transit, boolean shouldAttachNavBar) { - final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin"); + final WindowState win = createTestWindow(); mDisplayContent.mOpeningApps.add(win.mActivityRecord); - final WindowState navBar = createWindow(null, TYPE_NAVIGATION_BAR, "NavigationBar"); + final WindowState navBar = newWindowBuilder("NavigationBar", TYPE_NAVIGATION_BAR).build(); mDisplayContent.getDisplayPolicy().addWindowLw(navBar, navBar.mAttrs); final DisplayPolicy policy = mDisplayContent.getDisplayPolicy(); spyOn(policy); @@ -751,4 +750,8 @@ public class RemoteAnimationControllerTest extends WindowTestsBase { verify(binder, atLeast(0)).asBinder(); verifyNoMoreInteractions(binder); } + + private WindowState createTestWindow() { + return newWindowBuilder("testWin", TYPE_BASE_APPLICATION).build(); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 6a738ae54dcd..9d9f24cb50f2 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -673,7 +673,8 @@ public class SizeCompatTests extends WindowTestsBase { mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); - final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, mActivity, "window"); + final WindowState window = newWindowBuilder("window", TYPE_BASE_APPLICATION).setWindowToken( + mActivity).build(); assertEquals(window, mActivity.findMainWindow()); @@ -3996,8 +3997,8 @@ public class SizeCompatTests extends WindowTestsBase { resizeDisplay(display, 2200, 2280); display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); // Simulate insets, final app bounds are (0, 0, 2200, 2130) - landscape. - final WindowState navbar = createWindow(null, TYPE_NAVIGATION_BAR, mDisplayContent, - "navbar"); + final WindowState navbar = newWindowBuilder("navbar", TYPE_NAVIGATION_BAR).setDisplay( + mDisplayContent).build(); final Binder owner = new Binder(); navbar.mAttrs.providedInsets = new InsetsFrameProvider[] { new InsetsFrameProvider(owner, 0, WindowInsets.Type.navigationBars()) @@ -4030,8 +4031,8 @@ public class SizeCompatTests extends WindowTestsBase { resizeDisplay(display, 2200, 2280); display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); // Simulate taskbar, final app bounds are (0, 0, 2200, 2130) - landscape - final WindowState navbar = createWindow(null, TYPE_NAVIGATION_BAR, mDisplayContent, - "navbar"); + final WindowState navbar = newWindowBuilder("navbar", TYPE_NAVIGATION_BAR).setDisplay( + mDisplayContent).build(); final Binder owner = new Binder(); navbar.mAttrs.providedInsets = new InsetsFrameProvider[] { new InsetsFrameProvider(owner, 0, WindowInsets.Type.navigationBars()) @@ -4059,8 +4060,8 @@ public class SizeCompatTests extends WindowTestsBase { resizeDisplay(dc, 2200, 2280); dc.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); // Simulate taskbar, final app bounds are (0, 0, 2200, 2130) - landscape - final WindowState navbar = createWindow(null, TYPE_NAVIGATION_BAR, mDisplayContent, - "navbar"); + final WindowState navbar = newWindowBuilder("navbar", TYPE_NAVIGATION_BAR).setDisplay( + mDisplayContent).build(); final Binder owner = new Binder(); navbar.mAttrs.providedInsets = new InsetsFrameProvider[] { new InsetsFrameProvider(owner, 0, WindowInsets.Type.navigationBars()) diff --git a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java index 1c32980aac91..da5210cfa7e6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java @@ -152,9 +152,9 @@ public class SyncEngineTests extends WindowTestsBase { final Task task = taskRoot.getTask(); final ActivityRecord translucentTop = new ActivityBuilder(mAtm).setTask(task) .setActivityTheme(android.R.style.Theme_Translucent).build(); - createWindow(null, TYPE_BASE_APPLICATION, taskRoot, "win"); - final WindowState startingWindow = createWindow(null, TYPE_APPLICATION_STARTING, - translucentTop, "starting"); + newWindowBuilder("win", TYPE_BASE_APPLICATION).setWindowToken(taskRoot).build(); + final WindowState startingWindow = newWindowBuilder("starting", + TYPE_APPLICATION_STARTING).setWindowToken(translucentTop).build(); startingWindow.mStartingData = new SnapshotStartingData(mWm, null, 0); task.mSharedStartingData = startingWindow.mStartingData; task.prepareSync(); @@ -355,7 +355,7 @@ public class SyncEngineTests extends WindowTestsBase { assertEquals(SYNC_STATE_NONE, botChildWC.mSyncState); // If the appearance of window won't change after reparenting, its sync state can be kept. - final WindowState w = createWindow(null, TYPE_BASE_APPLICATION, "win"); + final WindowState w = newWindowBuilder("win", TYPE_BASE_APPLICATION).build(); parentWC.onRequestedOverrideConfigurationChanged(w.getConfiguration()); w.reparent(botChildWC, POSITION_TOP); parentWC.prepareSync(); @@ -435,7 +435,7 @@ public class SyncEngineTests extends WindowTestsBase { @Test public void testNonBlastMethod() { - mAppWindow = createWindow(null, TYPE_BASE_APPLICATION, "mAppWindow"); + mAppWindow = newWindowBuilder("mAppWindow", TYPE_BASE_APPLICATION).build(); final BLASTSyncEngine bse = createTestBLASTSyncEngine(); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index 35a2546fca1a..c0f251e06d17 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -52,6 +52,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.clearInvocations; @@ -1070,94 +1071,106 @@ public class TaskFragmentTest extends WindowTestsBase { @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) @Test - public void testSetAdjacentTaskFragments() { + public void testAdjacentSetForTaskFragments() { final Task task = createTask(mDisplayContent); final TaskFragment tf0 = createTaskFragmentWithActivity(task); final TaskFragment tf1 = createTaskFragmentWithActivity(task); final TaskFragment tf2 = createTaskFragmentWithActivity(task); - final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2); - assertFalse(tf0.hasAdjacentTaskFragment()); - - tf0.setAdjacentTaskFragments(adjacentTfs); - - assertSame(adjacentTfs, tf0.getAdjacentTaskFragments()); - assertSame(adjacentTfs, tf1.getAdjacentTaskFragments()); - assertSame(adjacentTfs, tf2.getAdjacentTaskFragments()); - assertTrue(tf0.hasAdjacentTaskFragment()); - assertTrue(tf1.hasAdjacentTaskFragment()); - assertTrue(tf2.hasAdjacentTaskFragment()); - - final TaskFragment.AdjacentSet adjacentTfs2 = new TaskFragment.AdjacentSet(tf0, tf1); - tf0.setAdjacentTaskFragments(adjacentTfs2); - - assertSame(adjacentTfs2, tf0.getAdjacentTaskFragments()); - assertSame(adjacentTfs2, tf1.getAdjacentTaskFragments()); - assertNull(tf2.getAdjacentTaskFragments()); - assertTrue(tf0.hasAdjacentTaskFragment()); - assertTrue(tf1.hasAdjacentTaskFragment()); - assertFalse(tf2.hasAdjacentTaskFragment()); + + // Can have two TFs adjacent, + new TaskFragment.AdjacentSet(tf0, tf1); + + // 3+ TFs adjacent is not yet supported. + assertThrows(IllegalArgumentException.class, + () -> new TaskFragment.AdjacentSet(tf0, tf1, tf2)); } @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) @Test - public void testClearAdjacentTaskFragments() { - final Task task = createTask(mDisplayContent); - final TaskFragment tf0 = createTaskFragmentWithActivity(task); - final TaskFragment tf1 = createTaskFragmentWithActivity(task); - final TaskFragment tf2 = createTaskFragmentWithActivity(task); - final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2); - tf0.setAdjacentTaskFragments(adjacentTfs); - - tf0.clearAdjacentTaskFragments(); + public void testSetAdjacentTaskFragments() { + final Task task0 = createTask(mDisplayContent); + final Task task1 = createTask(mDisplayContent); + final Task task2 = createTask(mDisplayContent); + final TaskFragment.AdjacentSet adjTasks = new TaskFragment.AdjacentSet(task0, task1, task2); + assertFalse(task0.hasAdjacentTaskFragment()); + + task0.setAdjacentTaskFragments(adjTasks); + + assertSame(adjTasks, task0.getAdjacentTaskFragments()); + assertSame(adjTasks, task1.getAdjacentTaskFragments()); + assertSame(adjTasks, task2.getAdjacentTaskFragments()); + assertTrue(task0.hasAdjacentTaskFragment()); + assertTrue(task1.hasAdjacentTaskFragment()); + assertTrue(task2.hasAdjacentTaskFragment()); + + final TaskFragment.AdjacentSet adjTasks2 = new TaskFragment.AdjacentSet(task0, task1); + task0.setAdjacentTaskFragments(adjTasks2); + + assertSame(adjTasks2, task0.getAdjacentTaskFragments()); + assertSame(adjTasks2, task1.getAdjacentTaskFragments()); + assertNull(task2.getAdjacentTaskFragments()); + assertTrue(task0.hasAdjacentTaskFragment()); + assertTrue(task1.hasAdjacentTaskFragment()); + assertFalse(task2.hasAdjacentTaskFragment()); + } - assertNull(tf0.getAdjacentTaskFragments()); - assertNull(tf1.getAdjacentTaskFragments()); - assertNull(tf2.getAdjacentTaskFragments()); - assertFalse(tf0.hasAdjacentTaskFragment()); - assertFalse(tf1.hasAdjacentTaskFragment()); - assertFalse(tf2.hasAdjacentTaskFragment()); + @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) + @Test + public void testClearAdjacentTaskFragments() { + final Task task0 = createTask(mDisplayContent); + final Task task1 = createTask(mDisplayContent); + final Task task2 = createTask(mDisplayContent); + final TaskFragment.AdjacentSet adjTasks = new TaskFragment.AdjacentSet(task0, task1, task2); + task0.setAdjacentTaskFragments(adjTasks); + + task0.clearAdjacentTaskFragments(); + + assertNull(task0.getAdjacentTaskFragments()); + assertNull(task1.getAdjacentTaskFragments()); + assertNull(task2.getAdjacentTaskFragments()); + assertFalse(task0.hasAdjacentTaskFragment()); + assertFalse(task1.hasAdjacentTaskFragment()); + assertFalse(task2.hasAdjacentTaskFragment()); } @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) @Test public void testRemoveFromAdjacentTaskFragments() { - final Task task = createTask(mDisplayContent); - final TaskFragment tf0 = createTaskFragmentWithActivity(task); - final TaskFragment tf1 = createTaskFragmentWithActivity(task); - final TaskFragment tf2 = createTaskFragmentWithActivity(task); - final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2); - tf0.setAdjacentTaskFragments(adjacentTfs); - - tf0.removeFromAdjacentTaskFragments(); - - assertNull(tf0.getAdjacentTaskFragments()); - assertSame(adjacentTfs, tf1.getAdjacentTaskFragments()); - assertSame(adjacentTfs, tf2.getAdjacentTaskFragments()); - assertFalse(adjacentTfs.contains(tf0)); - assertTrue(tf1.isAdjacentTo(tf2)); - assertTrue(tf2.isAdjacentTo(tf1)); - assertFalse(tf1.isAdjacentTo(tf0)); - assertFalse(tf0.isAdjacentTo(tf1)); - assertFalse(tf0.isAdjacentTo(tf0)); - assertFalse(tf1.isAdjacentTo(tf1)); + final Task task0 = createTask(mDisplayContent); + final Task task1 = createTask(mDisplayContent); + final Task task2 = createTask(mDisplayContent); + final TaskFragment.AdjacentSet adjTasks = new TaskFragment.AdjacentSet(task0, task1, task2); + task0.setAdjacentTaskFragments(adjTasks); + + task0.removeFromAdjacentTaskFragments(); + + assertNull(task0.getAdjacentTaskFragments()); + assertSame(adjTasks, task1.getAdjacentTaskFragments()); + assertSame(adjTasks, task2.getAdjacentTaskFragments()); + assertFalse(adjTasks.contains(task0)); + assertTrue(task1.isAdjacentTo(task2)); + assertTrue(task2.isAdjacentTo(task1)); + assertFalse(task1.isAdjacentTo(task0)); + assertFalse(task0.isAdjacentTo(task1)); + assertFalse(task0.isAdjacentTo(task0)); + assertFalse(task1.isAdjacentTo(task1)); } @EnableFlags(Flags.FLAG_ALLOW_MULTIPLE_ADJACENT_TASK_FRAGMENTS) @Test public void testRemoveFromAdjacentTaskFragmentsWhenRemove() { - final Task task = createTask(mDisplayContent); - final TaskFragment tf0 = createTaskFragmentWithActivity(task); - final TaskFragment tf1 = createTaskFragmentWithActivity(task); - final TaskFragment tf2 = createTaskFragmentWithActivity(task); - final TaskFragment.AdjacentSet adjacentTfs = new TaskFragment.AdjacentSet(tf0, tf1, tf2); - tf0.setAdjacentTaskFragments(adjacentTfs); - - tf0.removeImmediately(); - - assertNull(tf0.getAdjacentTaskFragments()); - assertSame(adjacentTfs, tf1.getAdjacentTaskFragments()); - assertSame(adjacentTfs, tf2.getAdjacentTaskFragments()); - assertFalse(adjacentTfs.contains(tf0)); + final Task task0 = createTask(mDisplayContent); + final Task task1 = createTask(mDisplayContent); + final Task task2 = createTask(mDisplayContent); + final TaskFragment.AdjacentSet adjTasks = new TaskFragment.AdjacentSet(task0, task1, task2); + task0.setAdjacentTaskFragments(adjTasks); + + task0.removeImmediately(); + + assertNull(task0.getAdjacentTaskFragments()); + assertSame(adjTasks, task1.getAdjacentTaskFragments()); + assertSame(adjTasks, task2.getAdjacentTaskFragments()); + assertFalse(adjTasks.contains(task0)); } private WindowState createAppWindow(ActivityRecord app, String name) { diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 78f32c1a4f88..2ee34d3a4b36 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -433,8 +433,8 @@ public class TransitionTests extends WindowTestsBase { final WallpaperWindowToken wallpaperWindowToken = spy(new WallpaperWindowToken(mWm, mock(IBinder.class), true, mDisplayContent, true /* ownerCanManageAppTokens */)); - final WindowState wallpaperWindow = createWindow(null, TYPE_WALLPAPER, wallpaperWindowToken, - "wallpaperWindow"); + final WindowState wallpaperWindow = newWindowBuilder("wallpaperWindow", + TYPE_WALLPAPER).setWindowToken(wallpaperWindowToken).build(); wallpaperWindowToken.setVisibleRequested(false); transition.collect(wallpaperWindowToken); wallpaperWindowToken.setVisibleRequested(true); @@ -630,8 +630,8 @@ public class TransitionTests extends WindowTestsBase { // Make DA organized so we can check that they don't get included. WindowContainer parent = wallpaperWindowToken.getParent(); makeDisplayAreaOrganized(parent, mDisplayContent); - final WindowState wallpaperWindow = createWindow(null, TYPE_WALLPAPER, wallpaperWindowToken, - "wallpaperWindow"); + final WindowState wallpaperWindow = newWindowBuilder("wallpaperWindow", + TYPE_WALLPAPER).setWindowToken(wallpaperWindowToken).build(); wallpaperWindowToken.setVisibleRequested(false); transition.collect(wallpaperWindowToken); wallpaperWindowToken.setVisibleRequested(true); @@ -1114,15 +1114,15 @@ public class TransitionTests extends WindowTestsBase { // Simulate gesture navigation (non-movable) so it is not seamless. doReturn(false).when(displayPolicy).navigationBarCanMove(); final Task task = createActivityRecord(mDisplayContent).getTask(); - final WindowState statusBar = createWindow(null, TYPE_STATUS_BAR, "statusBar"); - final WindowState navBar = createWindow(null, TYPE_NAVIGATION_BAR, "navBar"); - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_STATUS_BAR).build(); + final WindowState navBar = newWindowBuilder("navBar", TYPE_NAVIGATION_BAR).build(); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build(); final WindowToken decorToken = new WindowToken.Builder(mWm, mock(IBinder.class), TYPE_NAVIGATION_BAR_PANEL).setDisplayContent(mDisplayContent) .setRoundedCornerOverlay(true).build(); - final WindowState screenDecor = - createWindow(null, decorToken.windowType, decorToken, "screenDecor"); - final WindowState[] windows = { statusBar, navBar, ime, screenDecor }; + final WindowState screenDecor = newWindowBuilder("screenDecor", + decorToken.windowType).setWindowToken(decorToken).build(); + final WindowState[] windows = {statusBar, navBar, ime, screenDecor}; makeWindowVisible(windows); mDisplayContent.getDisplayPolicy().addWindowLw(statusBar, statusBar.mAttrs); mDisplayContent.getDisplayPolicy().addWindowLw(navBar, navBar.mAttrs); @@ -1191,7 +1191,7 @@ public class TransitionTests extends WindowTestsBase { } private void testShellRotationOpen(TestTransitionPlayer player) { - final WindowState statusBar = createWindow(null, TYPE_STATUS_BAR, "statusBar"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_STATUS_BAR).build(); makeWindowVisible(statusBar); mDisplayContent.getDisplayPolicy().addWindowLw(statusBar, statusBar.mAttrs); final ActivityRecord app = createActivityRecord(mDisplayContent); @@ -1239,7 +1239,7 @@ public class TransitionTests extends WindowTestsBase { } private void testFixedRotationOpen(TestTransitionPlayer player) { - final WindowState statusBar = createWindow(null, TYPE_STATUS_BAR, "statusBar"); + final WindowState statusBar = newWindowBuilder("statusBar", TYPE_STATUS_BAR).build(); makeWindowVisible(statusBar); mDisplayContent.getDisplayPolicy().addWindowLw(statusBar, statusBar.mAttrs); final WindowState navBar = createNavBarWithProvidedInsets(mDisplayContent); @@ -2272,15 +2272,24 @@ public class TransitionTests extends WindowTestsBase { public void cleanUp(SurfaceControl.Transaction t) { } }); + assertEquals(WindowAnimator.PENDING_STATE_NONE, mWm.mAnimator.mPendingState); + app.startAnimation(app.getPendingTransaction(), mock(AnimationAdapter.class), + false /* hidden */, SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION); + assertEquals(WindowAnimator.PENDING_STATE_HAS_CHANGES, mWm.mAnimator.mPendingState); + final Task task = app.getTask(); transition.collect(task); + assertEquals(WindowAnimator.PENDING_STATE_NEED_APPLY, mWm.mAnimator.mPendingState); final Rect bounds = new Rect(task.getBounds()); Configuration c = new Configuration(task.getRequestedOverrideConfiguration()); bounds.inset(10, 10); c.windowConfiguration.setBounds(bounds); task.onRequestedOverrideConfigurationChanged(c); assertTrue(freezeCalls.contains(task)); - transition.abort(); + + transition.start(); + mWm.mSyncEngine.abort(transition.getSyncId()); + assertEquals(WindowAnimator.PENDING_STATE_NONE, mWm.mAnimator.mPendingState); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java index eb89a9fb20c5..358448e709f3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java @@ -243,8 +243,8 @@ public class WallpaperControllerTests extends WindowTestsBase { final WindowState homeWindow = createWallpaperTargetWindow(dc); - WindowState otherWindow = createWindow(null /* parent */, TYPE_APPLICATION, dc, - "otherWindow"); + WindowState otherWindow = newWindowBuilder("otherWindow", TYPE_APPLICATION).setDisplay( + dc).build(); dc.mWallpaperController.adjustWallpaperWindows(); @@ -275,7 +275,7 @@ public class WallpaperControllerTests extends WindowTestsBase { public void testUpdateWallpaperTarget() { final DisplayContent dc = mDisplayContent; final WindowState homeWin = createWallpaperTargetWindow(dc); - final WindowState appWin = createWindow(null, TYPE_BASE_APPLICATION, "app"); + final WindowState appWin = newWindowBuilder("app", TYPE_BASE_APPLICATION).build(); appWin.mAttrs.flags |= FLAG_SHOW_WALLPAPER; makeWindowVisible(appWin); @@ -290,9 +290,9 @@ public class WallpaperControllerTests extends WindowTestsBase { public void testShowWhenLockedWallpaperTarget() { final WindowState wallpaperWindow = createWallpaperWindow(mDisplayContent); wallpaperWindow.mToken.asWallpaperToken().setShowWhenLocked(true); - final WindowState behind = createWindow(null, TYPE_BASE_APPLICATION, "behind"); - final WindowState topTranslucent = createWindow(null, TYPE_BASE_APPLICATION, - "topTranslucent"); + final WindowState behind = newWindowBuilder("behind", TYPE_BASE_APPLICATION).build(); + final WindowState topTranslucent = newWindowBuilder("topTranslucent", + TYPE_BASE_APPLICATION).build(); behind.mAttrs.width = behind.mAttrs.height = topTranslucent.mAttrs.width = topTranslucent.mAttrs.height = WindowManager.LayoutParams.MATCH_PARENT; topTranslucent.mAttrs.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; @@ -314,8 +314,8 @@ public class WallpaperControllerTests extends WindowTestsBase { // Only transient-launch transition will make notification shade as last resort target. // This verifies that regular transition won't choose invisible keyguard as the target. - final WindowState keyguard = createWindow(null /* parent */, - WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE, "keyguard"); + final WindowState keyguard = newWindowBuilder("keyguard", + WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE).build(); keyguard.mAttrs.flags |= FLAG_SHOW_WALLPAPER; registerTestTransitionPlayer(); final Transition transition = wallpaperWindow.mTransitionController.createTransition( @@ -568,8 +568,8 @@ public class WallpaperControllerTests extends WindowTestsBase { private WindowState createWallpaperWindow(DisplayContent dc) { final WindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm, mock(IBinder.class), true /* explicit */, dc, true /* ownerCanManageAppTokens */); - return createWindow(null /* parent */, TYPE_WALLPAPER, wallpaperWindowToken, - "wallpaperWindow"); + return newWindowBuilder("wallpaperWindow", TYPE_WALLPAPER).setWindowToken( + wallpaperWindowToken).build(); } private WindowState createWallpaperTargetWindow(DisplayContent dc) { @@ -578,8 +578,8 @@ public class WallpaperControllerTests extends WindowTestsBase { .build(); homeActivity.setVisibility(true); - WindowState appWindow = createWindow(null /* parent */, TYPE_BASE_APPLICATION, - homeActivity, "wallpaperTargetWindow"); + WindowState appWindow = newWindowBuilder("wallpaperTargetWindow", + TYPE_BASE_APPLICATION).setWindowToken(homeActivity).build(); appWindow.getAttrs().flags |= FLAG_SHOW_WALLPAPER; appWindow.mHasSurface = true; spyOn(appWindow); diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index e7c9e927b311..e27dbe588183 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -1869,10 +1869,18 @@ public class UsageStatsService extends SystemService implements } private boolean shouldDeleteObsoleteData(UserHandle userHandle) { - final DevicePolicyManagerInternal dpmInternal = getDpmInternal(); - // If a profile owner is not defined for the given user, obsolete data should be deleted - return dpmInternal == null - || dpmInternal.getProfileOwnerOrDeviceOwnerSupervisionComponent(userHandle) == null; + if (android.app.supervision.flags.Flags.deprecateDpmSupervisionApis()) { + final SupervisionManagerInternal smInternal = getSupervisionManagerInternal(); + // If supervision is not enabled for the given user, obsolete data should be deleted. + return smInternal == null + || !smInternal.isSupervisionEnabledForUser(userHandle.getIdentifier()); + } else { + final DevicePolicyManagerInternal dpmInternal = getDpmInternal(); + // If a profile owner is not defined for the given user, obsolete data should be deleted + return dpmInternal == null + || dpmInternal.getProfileOwnerOrDeviceOwnerSupervisionComponent(userHandle) + == null; + } } private String buildFullToken(String packageName, String token) { |